一、概念理解 Boosting 是指个体学习器之间存在强依赖关系,必须串行序列化生成的集成学习方法。Boosting意为提升,意思是希望将每个弱学习器提升为强学习器。 Bagging中所有的分类器是可以同时生成的,之间没有什么关系,而Boosting中则必须先生成第一个分类器,然后根据第一个分类器的结果生成第二个分类器(基学习器间存在强依赖关系 ),依次往后进行。
首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重(被错分的样本权重加大,反之减小),使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。Boosting算法的本质旨在减小学习的偏差 ,能够基于泛化精度很差的学习器个体构建出强集成。
二、执行步骤 假设有1000个样本,70%的样本作为训练集,30%的样本作为测试集。STEP1: 开始时,所有样本的权重相同,训练得到第一个基分类器。STEP2: 根据上一轮基分类器的分类效果调整每个样本的权重(上一轮分错的样本权重提高,分对的样本权重降低),之后根据新得到样本的权重指导本轮中的基分类器训练,即在考虑样本不同权重的情况下得到本轮错误率最低的基分类器。STEP3: 重复以上步骤2直至训练到约定的轮数结束(例如100轮),每一轮训练得到一个基分类器STEP4: 用这100个基学习器对测试集的每一个样本都进行测试,然后通过投票的方式决定测集样本的预测结果。如果一个样本被这100个基学习器投票,即预测分类,被分为1的票数有80票,被分为0的有20票,显然,这个样本的预测结果为1。
三、使用sklearn库实现Boosting方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #-*- coding:utf-8 -*- ''' Boosting方法 ''' from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import AdaBoostClassifier from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report #======================================================== # 载入iris数据集 #======================================================== iris = load_iris() X = iris.data[:,:5] y = iris.target print('feature=',X) print('target=',y) #======================================================== # 实现Boosting集成 #======================================================== def BoostingMethod(X, y): ''' Boosting方法实现分类 INPUT -> 特征, 分类标签 ''' scaler = StandardScaler() # 标准化转换 scaler.fit(X) # 训练标准化对象 traffic_feature= scaler.transform(X) # 转换数据集 feature_train, feature_test, target_train, target_test = train_test_split(X, y, test_size=0.3, random_state=0) tree = DecisionTreeClassifier(criterion='entropy', max_depth=1) clf = AdaBoostClassifier(base_estimator=tree, n_estimators=200, # 生成200个决策树 algorithm="SAMME") # 'SAMME'这个是针对离散的变量 clf.fit(feature_train, target_train) # 模型测试 predict_results = clf.predict(feature_test) print(accuracy_score(predict_results, target_test)) conf_mat = confusion_matrix(target_test, predict_results) print(conf_mat) print(classification_report(target_test, predict_results)) return clf #======================================================== # 主程序 #======================================================== if __name__ == '__main__': model = BoostingMethod(X, y)
注意:Boosting有两种,一种是用于回归的AdaBoostRegressor,另一种是用于分类的AdaBoostClassifier。
AdaBoost