该模块sklearn.ensemble包括由Freund和Schapire [FS1995]于1995年推出的流行的增强算法AdaBoost 。
AdaBoost的核心原则是在重复修改的数据版本上拟合一系列弱学习者(即,仅比随机猜测略好的模型,
例如小决策树)。然后通过加权多数投票(或总和)将来自所有这些预测的预测组合以产生最终预测。
每次所谓的增强迭代的数据修改包括应用权重, ,..., 每个训练样本。最初,这些权重都设置为 因
此,第一步只是训练一个弱学习者的原始数据。对于每次连续迭代,单独修改样本权重,并将学习算法
重新应用于重新加权数据。在给定步骤中,由前一步骤引起的增强模型错误预测的那些训练样本的权重
增加,而权重减少则正确预测的那些。随着迭代的进行,难以预测的示例会受到越来越大的影响。因
此,每个随后的弱学习者被迫集中于序列[HTF]中先前的错过的示例 。
定义
优点:
缺点:
假设我们的训练集样本是
训练集的在第k个弱学习器的输出权重为
首先我们看看Adaboost的分类问题。
分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{-1,1},则第k个弱分类器 G k ( x ) G_k(x) Gk(x)在训练集上的加权误差率为
接着我们看弱学习器权重系数,对于二元分类问题,第k个弱分类器 G k ( x ) G_k(x) Gk(x)的权重系数为
为什么这样计算弱学习器权重系数?从上式可以看出,如果分类误差率 e k e_k ek越大,则对应的弱分类器权重系数 α k α_k αk越小。也就是说,误差率小的弱分类器权重系数越大。
第三个问题,更新更新样本权重D。假设第k个弱分类器的样本集权重系数为D(k)= ( w k 1 , w k 2 , . . . w k m ) (w_{k1},w_{k2},...w_{km}) (wk1,wk2,...wkm),则对应的第k+1个弱分类器的样本集权重系数为
这里 Z k Z_k Zk是规范化因子
从 w k + 1 , i w_{k+1},i wk+1,i计算公式可以看出,如果第i个样本分类错误,则 y i G k ( x i ) < 0 y_iG_k(xi)<0 yiGk(xi)<0,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.
最后一个问题是集合策略。Adaboost分类采用的是加权表决法,最终的强分类器为
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
df = pd.DataFrame([[0,1],[1,1],[2,1],[3,-1],[4,-1],
[5,-1],[6,1],[7,1],[8,1],[9,-1]])
X = df.iloc[:,:-1]
Y = df.iloc[:,-1]
w = np.ones(len(df))/len(df) #初始化权值分布
M = [] #模型集合
A = [] #学习器权重集合
n_trees = 3
for i in range(n_trees):
model = DecisionTreeClassifier(max_depth=1) ##训练第1个模型
model.fit(X,Y,sample_weight=w)
M.append(model)
e = sum(w[model.predict(X)!=Y]) #误差率
a = 0.5*np.log((1-e)/e) #学习器系数
A.append(a)
z = sum(w*np.exp(-a*Y*model.predict(X)))#规范因子
#更新权值分布
w = w/z*np.exp(-a*Y*model.predict(X)).values
res = 0
for i in range(n_trees):
res += A[i] * M[i].predict(X)
np.sign(res)
print(res)
[ 0.32125172 0.32125172 0.32125172 -0.52604614 -0.52604614 -0.52604614
0.97803126 0.97803126 0.97803126 -0.32125172]
一、
import pandas as pd
df = pd.DataFrame([[1,5.56],[2,5.7],[3,5.91],[4,6.4],[5,6.8],
[6,7.05],[7,8.9],[8,8.7111],[9,9.0],[10,9.05]])
X = df.iloc[:,[0]]
Y = df.iloc[:,-1]
from sklearn.ensemble import AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(max_depth=3)
model = AdaBoostRegressor(n_estimators=5,base_estimator=model,learning_rate=0.01).fit(X,Y)
print(model.predict(X))
[5.56 5.7 5.91 6.4 6.8 7.05 7.05 8.7111 9. 9.05 ]
二、
import pandas as pd
df = pd.DataFrame([[0,1],[1,1],[2,1],[3,-1],[4,-1],
[5,-1],[6,1],[7,1],[8,1],[9,-1]])
X = df.iloc[:,[0]]
Y = df.iloc[:,-1]
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=10,).fit(X,Y)
print(model.predict(X))
[ 1 1 1 -1 -1 -1 1 1 1 -1]
三、
import pandas as pd
df = pd.read_csv("../../datas/covtype.data",sep=",",header=None)
X = df.iloc[:,0:-1]
Y = df.iloc[:,-1]
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3)
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
myTree = DecisionTreeClassifier(max_depth=10)
model = AdaBoostClassifier(n_estimators=10,base_estimator=myTree)
model.fit(X_train,Y_train)
print(model.score(X_test,Y_test))
pd.crosstab(Y_test,model.predict(X_test),rownames=["label"],colnames=["predict"])
0.6839774187626216
sklearn.ensemble.AdaBoostClassifier(base_estimator = None,n_estimators = 50,learning_rate = 1.0,algorithm =‘SAMME.R’,random_state = None )
参数
属性
方法
参考文献:
集成模型下有bagging和boosting思想,Adaboost是最初(1995年)的boosting思想下的模型。
最初是应用在二分类上,后面延伸到回归和多分类
Gbdt、xgboost、lightGBM