机器学习中的集成方法(3)-- Boosting(分步法)

一、概念理解

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

0%