Sklearn参数详解—Adaboost
总第112篇
前言
今天这篇讲讲集成学习,集成学习就是将多个弱学习器集合成一个强学习器,你可以理解成现在有好多道判断题(判断对错即01),如果让学霸去做这些题,可能没啥问题,几乎全部都能做对,但是现实情况是学霸不常有,学渣倒是很多,怎么样做才能保证题做对的准确率较高呢?就是让多个学渣一起做, 每个人随机挑选一部分题目来做,最后将所有人的结果进行汇总,然后根据将票多者作为最后的结果;另一种方式就是先让学渣A做一遍,然后再让学渣B做,且让B重点关注A做错的那些题,再让C做,同样重点关注B做错的,依次循环,直到所有的学渣都把题目做了一遍为止。通过上面两种方式就可以做到学渣也能取得和学霸一样的成绩啦。我们把这种若干个学渣组合达到学霸效果的这种方式称为集成学习
。
注:这里的学渣并无它意,请勿过度解读。
理解了集成学习的原理以后,我们来看看关于集成学习的一些理论知识。
理论知识
集成学习,就是将多个弱学习器集合成一个强学习器,那么我们如何来选取弱学习器呢,主要有两种方式。
第一种是所有的弱学习器都是一个种类的,比如都是决策树模型。
另一种是所有的弱学习器并不完全一样,你可以用LR预测一个结果,然后再用贝叶斯预测一个,再用SVM预测一个,然后对三个模型的预测结果进行投票,票数多者做为最后的结果。
我们实际业务中用的比较多的都是用同一种类的弱学习器去集合成一个强学习器。
我们找到了弱学习器以后就可以对弱学习器进行组合,组合的方式也有两种,划分依据主要是看弱学习器之间是否有联系。
一种是弱学习器之间没有联系,每个弱学习器都是随机从总样本中抽取部分数据集(有放回抽样)进行训练,各个弱学习器之间是并联关系,这样就会生成若干个弱学习器,这种集成方式叫做
bagging
。随机森林(RF)是bagging中比较有代表的算法。另一种是弱学习器之间是相互联系的,先所有训练集样本上训练一个基模型,然后根据基模型的分类效果,把那些分类错误的样本给予较高的权重(默认n个样本中每个样本的权重为1/n),再次进行训练,这样又会得出一个模型,模型又会有错分类的,再次提高这些错分类样本的权重;如此循环,直到满足预先设定的弱分类器数目。这种集成方式中各个弱学习器是串联关系,每个弱学习器是建立在前一个弱学习器的基础上的,我们把这种方式称为
boosting
。Boosting系列算法里主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树中应用最广最普遍的算法就是梯度提升树(Gradient Boosting Tree)。
Adaboost-模型
讲完了集成学习,顺便讲讲Sklearn中Adaboost模型,关于Adaboost模型的原理篇见:提升方法-Adaboost算法。
Adaboost-参数
class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm='SAMME.R', random_state=None)
base_estimator
:基分类器,默认是决策树,在该分类器基础上进行boosting,理论上可以是任意一个分类器,但是如果是其他分类器时需要指明样本权重。n_estimators
:基分类器提升(循环)次数,默认是50次,这个值过大,模型容易过拟合;值过小,模型容易欠拟合。learning_rate
:学习率,表示梯度收敛速度,默认为1,如果过大,容易错过最优值,如果过小,则收敛速度会很慢;该值需要和n_estimators
进行一个权衡,当分类器迭代次数较少时,学习率可以小一些,当迭代次数较多时,学习率可以适当放大。algorithm
:boosting算法,也就是模型提升准则,有两种方式SAMME
, 和SAMME.R
两种,默认是SAMME.R
,两者的区别主要是弱学习器权重的度量,前者是对样本集预测错误的概率进行划分的,后者是对样本集的预测错误的比例,即错分率进行划分的,默认是用的SAMME.R
。random_state
:随机种子设置。
关于Adaboost模型本身的参数并不多,但是我们在实际中除了调整Adaboost模型参数外,还可以调整基分类器的参数,关于基分类的调参,和单模型的调参是完全一样的,比如默认的基分类器是决策树,那么这个分类器的调参和我们之前的Sklearn参数详解——决策树是完全一致。
Adaboost-对象
先生成一个分类器
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
iris=load_iris()
model=AdaBoostClassifier(n_estimators=100)
clf=model.fit(iris.data,iris.target)python
estimators_
:以列表的形式返回所有的分类器。
可以看到该对象得到的list的长度为100,刚好是咱们自定义的基分类器个数。
classes_
:类别标签estimator_weights_
:每个分类器权重。estimator_errors_
:每个分类器的错分率,与分类器权重相对应。feature_importances_
:特征重要性,这个参数使用前提是基分类器也支持这个属性。Adaboost-方法
decision_function(X)
:返回决策函数值(比如svm中的决策距离)fit(X,Y)
:在数据集(X,Y)上训练模型。get_parms()
:获取模型参数predict(X)
:预测数据集X的结果。predict_log_proba(X)
:预测数据集X的对数概率。predict_proba(X)
:预测数据集X的概率值。score(X,Y)
:输出数据集(X,Y)在模型上的准确率。staged_decision_function(X)
:返回每个基分类器的决策函数值staged_predict(X)
:返回每个基分类器的预测数据集X的结果。staged_predict_proba(X)
:返回每个基分类器的预测数据集X的概率结果。staged_score(X, Y)
:返回每个基分类器的预测准确率。
Adaboost的大部分方法和其他模型基本一致,比其他模型多了几个staged
方法。staged是返回每个基分类的结果。
可以看到,直接运行
staged
方法,不会直接输出结果,而是输出一个生成器,要想得到具体的结果,需要遍历打印输出。还可以看到,共输出100项,这正好是我们100个基分类器的结果。
上一篇: 机器学习之python实现梯度下降
下一篇: oracle恢复drop删除的数据