1、AdaBoost思想
首先AdaBoost是隶属于集成学习Boost家族的一个算法,也是一个比较算的上是入门级又能充分的体现boost的思想的算法。通过一个现实生活中的例子来聊聊AdaBoost这个算法。
假设这么一个场景:你是一个非常优秀的数学老师,你的班级有10个学生,你想要提升这个班级的成绩,一开始给每个人辅导2h,发现经过一次考试之后有其中一半的学生成绩比较好,另一些成绩比较差,这个时候你会把时间重新做一个分配,将考的好的学生的时间降为1h,把多出来的时间给考的差的学生,也就是增加对差生的上课时间,增加其“权重”,通过以此迭代进行,每次考试都根据学生的考试情况调整不同的权重,这样迭代上几次考试,这个班级的学习成绩自然而然就都上去了。
这个上述的例子基本就是AdaBoost算法的基本思想,它采用一些基分类器,开始的时候权重都是一样的,通过每次迭代调整样本的权重,增加前一轮分类器错误分类的权重,减小前一轮分类器正确分类的权重。通过这样的作法我们每一次都可以改变训练数据的权重或者概率分布。根据“三个臭皮匠,顶个诸葛亮”的原理,通过这些弱分类器的权重我们可以采取加权多数表决的方法,加大分类误差率较小的弱分类器的权重,使其在最后的表决中最有话语权;减小分类误差率较大的弱分类器的权值,使其在表决中起较小的作用。自适应的Boost的算法也是由此而来的。
2、算法
3、优缺点
4、代码
训练数据
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
iris_data = datasets.load_iris()
x = iris_data['data']
y = iris_data['target']
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.2,random_state=6)
ss = StandardScaler()
x_train = ss.fit_transform(x_train)
x_test = ss.transform(x_test)
#设置Adaboost的基学习器,默认是决策树,当然也可以是别的分类器
#SAMME使用对样本集分类效果作为弱学习器权重,而SAMME.R使用了对样本集分类的预测概率大小来作为弱学习器权重。
#由于SAMME.R使用了概率度量的连续值,迭代一般比SAMME快
estimatorCart = DecisionTreeClassifier(max_depth=6)
clf = AdaBoostClassifier(base_estimator=estimatorCart,n_estimators=100,algorithm='SAMME.R',learning_rate=0.3,random_state=66)
clf.fit(x_train, y_train)
predict = clf.predict(x_test)
acc = metrics.accuracy_score(y_true=y_test,y_pred=predict)
recall = metrics.recall_score(y_true=y_test,y_pred=predict,average='micro')
precision = metrics.precision_score(y_true=y_test,y_pred=predict,average='micro')
print('acc',acc)
print('recall',recall)
print('precision',precision)
预测结果
acc 0.9333333333333333
recall 0.9333333333333333
precision 0.9333333333333333
Process finished with exit code 0
接下来开始写Boost家族的另一个算法GBDT