????????Adaptive Boosting(自适应提升)是基于Boosting思想实现的一种集成学习算法,核心思想是提高【在前一步中分类错误的样本权重】来训练一个强分类器,错误的数据会“放大”,正确的数据会“缩小”(上一轮中,分类错误的样本权重会变大,分类正确的样本权重会变小)。Adaboost算法一般用来做二分类,使用的树深度不要过深,否则容易过拟合。
算法推导流程: ? ?
初始化训练样本权重,训练第一个学习器
如果有100个样本,则每个样本权重初始化为:1/100
根据预测结果,找到错误率最小的分裂点,计算、更新样本权重模型权重
根据新的样本权重,训练第二个学习器,直到训练出m个基学习器
根据预测结果,找到错误率最小的分裂点,计算、更新样本权重模型权重
m个基学习器的集成预测公式为:
H(x) = sign( Σ αi hi (x)),sign是信号函数
α为模型权重,输出结果大于0则归为正类,小于0则归为负类
样本权重公式 | 模型权重公式
举例:????????
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
x | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
可选的分裂点有:1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5
当以1.5为分裂点时,有5个样本分类错误
当以2.5为分裂点时,有4个样本分类错误
当以3.5为分裂点时,有3个样本分类错误
。。。
当以9.5为分裂点时,有3个样本分类错误
最终:选择以3.5为分裂点,错误率为0.1 * 3 = 0.3,错误率为错误样本的权重之和
计算模型权重: 1/2*np.log( (1-0.3)/0.3 ) = 0.4236
更新样本权重:(当前是以3.5为分裂点)
分类正确的样本为:1,2,3,4,5,6,10共七个,则正确样本的变化系数为e-αt ,e-0.4236 = 0.6547
分类错误的样本为:7,8,9共三个,则错误样本的权重变化系数为eαt,e0.4236 = 1.5275
7个正确样本的权重为:0.6547 * 0.1=0.06547 3个错误样本的权重为:1.5275 * 0.1=0.15275
则Zt 为:7 * 0.06547 + 3 * 0.15275 = 0.9165
则正确样本的最终权重为:0.06547÷0.9165=0.07143
则错误样本的最终权重为:0.15275÷0.9165=0.1667
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
x | 0.071 | 0.071 | 0.071 | 0.071 | 0.071 | 0.071 | 0.1667 | 0.167 | 0.167 | 0.071 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
(迭代训练基学习器中…)共训练了 3 个基学习器,模型权重分别是0.4236,0.6496,0.7515,则:
import pandas as pd
from sklearn.preprocessing import LabelEncoder # 类别转化
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier # 集成学习--Adaboost算法
from sklearn.metrics import accuracy_score
# 1 读数据到内存
df_wine = pd.read_csv('./data/wine0501.csv')
# 2 特征处理
# Adaboost一般做二分类 去掉一类(1,2,3)
df_wine = df_wine[df_wine['Class label'] != 1]
# 准备特征值和目标值 Alcohol酒精含量 Hue颜色
x = df_wine[['Alcohol', 'Hue']].values
y = df_wine['Class label']
# 类别转化 (2,3)=>(0,1)
y = LabelEncoder().fit_transform(y)
# 2-5 划分数据
X_train,X_test,y_train,y_test = train_test_split(x,y,random_state=22,test_size=0.2)
# 3 实例化单决策树 实例化Adaboost-由500颗树组成
mytree = DecisionTreeClassifier(criterion='entropy', max_depth=1, random_state=0) myada = AdaBoostClassifier(base_estimator=mytree, n_estimators=500, learning_rate=0.1, random_state=0)
# 4 单决策树训练和评估
mytree.fit(X_train, y_train)
myscore = mytree.score(X_test, y_test)
# 5 AdaBoost训练和评估
myada.fit(X_train, y_train)
myscore = myada.score(X_test, y_test)
?