文章目录

  • 1 概述
  • 1.1 集成算法概述
  • 1.2 sklearn中的集成算法
  • 2 、随机森林分类:RandomForestClassifier
  • 2.1 重要参数
  • 2.1.1 控制基评估器的参数
  • 2.1.2、 n_estimators,:越大,模型的效果往往越好
  • 2.1.3 random_state & estimators_
  • 2.1.4、bootstrap & oob_score
  • 2.2 重要属性和接口
  • 2.2.1 属性 : .estimators_ 和 .oob_score_ 和 .feature_importances_
  • 2.2.2接口:apply, fit, predict和score,还有predict_proba
  • Bonus:Bagging的另一个必要条件
  • 2.3 实战
  • 6. n_estimators的学习曲线
  • 3 、随机森林回归:RandomForestRegressor
  • 3.1 重要参数,属性与接口
  • 3.1.1criterion
  • 3.1.2、重要属性和接口
  • 3.2 实例:用随机森林回归填补缺失值
  • 5、 附录
  • 5.1 Bagging vs Boosting
  • 5.2 RFC的参数列表
  • 5..3 RFC的属性列表
  • 5.4 RFC的接口列表


1 概述

1.1 集成算法概述

**集成学习(ensemble learning)**是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通
过在数据上构建多个模型,集成所有模型的建模结果。

集成算法的目标

集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。

criterion 随机森林 随机森林meandecreaseaccuracy_sklearn

1.2 sklearn中的集成算法

  • sklearn中的集成算法模块ensemble

2 、随机森林分类:RandomForestClassifier

criterion 随机森林 随机森林meandecreaseaccuracy_criterion 随机森林_02

2.1 重要参数

2.1.1 控制基评估器的参数

criterion 随机森林 随机森林meandecreaseaccuracy_算法_03

2.1.2、 n_estimators,:越大,模型的效果往往越好

这是森林中**树木的数量,即基评估器的数量。**这个参数对随机森林模型的精确性影响是单调的

n_estimators越大,模型的效果往往越好

但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。

n_estimators的默认值在现有版本的sklearn中是10,但是在即将更新的0.22版本中,这个默认值会被修正为

100。

criterion 随机森林 随机森林meandecreaseaccuracy_criterion 随机森林_04

2.1.3 random_state & estimators_

随机森林中其实也有random_state,用法和分类树中相似,只不过在分类树中,一个random_state只控制生成一

棵树,而随机森林中的random_state控制的是生成森林的模式,而非让一个森林中只有一棵树

criterion 随机森林 随机森林meandecreaseaccuracy_criterion 随机森林_05


当random_state固定时,随机森林中生成是一组固定的树,但每棵树依然是不一致的,这是用”随机挑选特征进行分枝“的方法得到的随机性。并且我们可以证明,当这种随机性越大的时候,袋装法的效果一般会越来越好。用袋装法集成时**,基分类器应当是相互独立的,是不相同的**

criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_06

2.1.4、bootstrap & oob_score

要让基分类器尽量都不一样,一种很容易理解的方法是使用不同的训练集来进行训练,而袋装法正是通过有放回的随机抽样技术来形成不同的训练数据,bootstrap就是用来控制抽样技术的参数

在一个含有n个样本的原始训练集中,我们进行随机采样,每次采样一个样本,并在抽取下一个样本之前将该样本放回原始训练集,也就是说下次采样时这个样本依然可能被采集到,这样采集n次,最终得到一个和原始训练集一样大的,n个样本组成的自助集。

**bootstrap参数默认True,代表采用这种有放回的随机抽样技术。**通常,这个参数不会被我们设置为False。

criterion 随机森林 随机森林meandecreaseaccuracy_criterion 随机森林_07


criterion 随机森林 随机森林meandecreaseaccuracy_criterion 随机森林_08

2.2 重要属性和接口

2.2.1 属性 : .estimators_ 和 .oob_score_ 和 .feature_importances_

2.2.2接口:apply, fit, predict和score,还有predict_proba

随机森林的predict_proba接口,这个接口返回每个测试样本对应的被分到每一类标签的概率,标签有几个分类就返回几个概率。如果是二分类问题,则predict_proba返回的数值大于0.5的,被分为1,小于0.5的,被分为0。传统的随机森林是利用袋装法中的规则,平均或少数服从多数来决定集成的结果,而sklearn中的随机森林是平均每个样本对应的predict_proba返回的概率,得到一个平均概率,从而决定测试样本的分类。

criterion 随机森林 随机森林meandecreaseaccuracy_随机森林_09

Bonus:Bagging的另一个必要条件

之前我们说过,在使用袋装法时要求基评估器要尽量独立。其实,袋装法还有另一个必要条件:基分类器的判断准确率至少要超过随机分类器,即时说,基分类器的判断准确率至少要超过50%。之前我们已经展示过随机森林的准确率公式,基于这个公式,我们画出了基分类器的误差率ε和随机森林的误差率之间的图像。大家可以自己运行一下这段代码,看看图像呈什么样的分布。

import numpy as np
x = np.linspace(0,1,20)
y = []
for epsilon in np.linspace(0,1,20):
    E = np.array([comb(25,i)*(epsilon**i)*((1-epsilon)**(25-i)) 
                  for i in range(13,26)]).sum()
    y.append(E)
plt.plot(x,y,"o-",label="when estimators are different")
plt.plot(x,x,"--",color="red",label="if all estimators are same")
plt.xlabel("individual estimator's error")
plt.ylabel("RandomForest's error")
plt.legend()
plt.show()

可以从图像上看出,当基分类器的误差率小于0.5,即准确率大于0.5时,集成的效果是比基分类器要好的。相反,当基分类器的误差率大于0.5,袋装的集成算法就失效了。所以在使用随机森林之前,一定要检查,用来组成随机森林的分类树们是否都有至少50%的预测正确率。

2.3 实战

criterion 随机森林 随机森林meandecreaseaccuracy_算法_10


criterion 随机森林 随机森林meandecreaseaccuracy_sklearn_11


criterion 随机森林 随机森林meandecreaseaccuracy_算法_12

6. n_estimators的学习曲线

criterion 随机森林 随机森林meandecreaseaccuracy_sklearn_13


criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_14

3 、随机森林回归:RandomForestRegressor

criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_15

3.1 重要参数,属性与接口

3.1.1criterion

criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_16


criterion 随机森林 随机森林meandecreaseaccuracy_criterion 随机森林_17


criterion 随机森林 随机森林meandecreaseaccuracy_sklearn_18

3.1.2、重要属性和接口

最重要的属性和接口,都与随机森林的分类器相一致,还是apply, fit, predict和score最为核心。值得一提的是,随机森林回归并没有predict_proba这个接口,因为对于回归来说,并不存在一个样本要被分到某个类别的概率问题,因此没有predict_proba这个接口。

criterion 随机森林 随机森林meandecreaseaccuracy_算法_19

3.2 实例:用随机森林回归填补缺失值

我们从现实中收集的数据,几乎不可能是完美无缺的,往往都会有一些缺失值。面对缺失值,很多人选择的方式是直接将含有缺失值的样本删除,这是一种有效的方法,但是有时候填补缺失值会比直接丢弃样本效果更好,即便我们其实并不知道缺失值的真实样貌。在sklearn中,我们可以使用sklearn.impute.SimpleImputer来轻松地将均值,中值,或者其他最常用的数值填补到数据中,在这个案例中,我们将使用均值,0,和随机森林回归来填补缺失值,并验证四种状况下的拟合状况,找出对使用的数据集来说最佳的缺失值填补方法。

criterion 随机森林 随机森林meandecreaseaccuracy_算法_20


criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_21


criterion 随机森林 随机森林meandecreaseaccuracy_算法_22


criterion 随机森林 随机森林meandecreaseaccuracy_随机森林_23


criterion 随机森林 随机森林meandecreaseaccuracy_算法_24


criterion 随机森林 随机森林meandecreaseaccuracy_算法_25


criterion 随机森林 随机森林meandecreaseaccuracy_sklearn_26


criterion 随机森林 随机森林meandecreaseaccuracy_随机森林_27


criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_28


criterion 随机森林 随机森林meandecreaseaccuracy_随机森林_29


criterion 随机森林 随机森林meandecreaseaccuracy_算法_30

5、 附录

5.1 Bagging vs Boosting

criterion 随机森林 随机森林meandecreaseaccuracy_算法_31

5.2 RFC的参数列表

criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_32


criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_33


criterion 随机森林 随机森林meandecreaseaccuracy_随机森林_34


criterion 随机森林 随机森林meandecreaseaccuracy_sklearn_35


criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_36

5…3 RFC的属性列表

criterion 随机森林 随机森林meandecreaseaccuracy_缺失值_37

5.4 RFC的接口列表

criterion 随机森林 随机森林meandecreaseaccuracy_sklearn_38