- 集成学习与袋装法:
概念:集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。
集成学习有三种:装袋法(Bagging),提升法(Boosting)和stacking。随机森林就是bagging算法的代表,而Boosting的算法有我们接下来总结的XGBoost。sklearn的集成算法库为sklearn.ensemble。
装袋法的核心思想是构建多个相互独立的评估器(基评估器),然后对其预测进行平均或多数表决原则来决定集成评估器的结果,而随机森林的基评估器为决策树 (事实上,以树为底层的集成模型的算法的基评估器都为决策树)
- 随机森林
概念:提到了随机森林,我们第一个会想到的就是袋装法bagging,那到底什么是bagging呢?袋装法是一种随机采样(有放回)的算法:在一个含有n个样本的原始训练集中,我们进行随机采样,每次采样一个样本,并在抽取下一个样本之前将该样本放回原始训练集,也就是说下次采样时这个样本依然可能被采集到,这样采集n次,最终得到一个和原始训练集一样大的,n个样本组成的自助集。
关于bagging算法为什么十分优秀,可以看这篇文章【机器学习】 随机森林(Random Forest)
袋外数据(out of bag data):
因此,会有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data,简写为oob)。除了我们最开始就划分好的测试集之外,这些数据也可以被用来作为集成算法的测试集。也就是说,在使用随机森林时,我们可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型即可。当然,这也不是绝对的,当n和n_estimators都不够大的时候,很可能就没有数据掉落在袋外,自然也就无法使用oob数据来测试模型了。
- 随机森林分类(RandomForestClassififier)
- 参数
- n_estimators
- 参数
这是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
- ** random_state**
使随机森林生成一组固定的树,但每棵树依然是不一致的,,这是用”随机挑选特征进行分枝“的方法得到的随机性。并且我们可以证明,当这种随机性越大的时候,袋装法的效果一般会越来越好。用袋装法集成时,基分类器应当是相互独立的,是不相同的。但这种做法的局限性是很强的,当我们需要成千上万棵树的时候,数据不一定能够提供成千上万的特征来让我们构筑尽量多尽量不同的树。因此,除了random_state。我们还需要其他的随机性。
- ** bootstrap & oob_scorebootstrap为是否使用袋装法,**默认为True**,通常这个参数我们不会去修改;oob_score用于查看我们的在袋外数据上测试的结果,oob_score=True之后就可以通过**oob_score_**查看
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=25,oob_score=True)
rfc = rfc.fit(x,y) #重要属性oob_score_
rfc.oob_score_
重要属性和接口
随机森林常用的接口有feature_importances,predict_proba,apply和predict。apply中输入测试集返回每个测试样本所在的叶子节点的索引,predict输入测试集返回每个测试样本的标签,feature_importances查看每个特征的重要性,和决策树基本一致。我们重点看不一样的参数predict_proba- predict_proba
predict_proba接口返回每个测试样本对应的被分到每一类标签的概率,标签有几个分类就返回几个概率。如果是二分类问题,则predict_proba返回的数值大于0.5的,被分为1,小于0.5的,被分为0。传统的随机森林是利用袋装法中的规则,平均或少数服从多数来决定集成的结果,而sklearn中的随机森林是平均每个样本对应的predict_proba返回的概率,得到一个平均概率,从而决定测试样本的分类。rfc.feature_importances_
rfc.apply(Xtest)
rfc.predict(Xtest)
rfc.predict_proba(Xtest)
- predict_proba
Bagging的另一个必要条件
袋装法还有另一个必要条件:基分类器的判断准确率至少要超过随机分类器,即时说,基分类器的判断准确率至少要超过50%当基分类器的误差率小于0.5,即准确率大于0.5时,集成的效果是比基分类器要好的。相反,当基分类器的误差率大于0.5,袋装的集成算法就失效了。所以在使用随机森林之前,一定要检查,用来组成随机森林的分类树们是否都有至少50%的预测正确率。
**