一、概述
1、 集成算法
集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预 测疾病的风险和病患者的易感性。在现在的各种算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等集成算法的身影也随处可见,可见其效果之好,应用之广。
集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。
多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器 (base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。
装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结 果。装袋法的代表模型就是随机森林。
提升法中,基评估器是相关的,是按顺序一一构建的。其核心思想是结合弱评估器的力量一次次对难以评估的样本 进行预测,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树。
2、sklearn中的集成算法
sklearn中的集成模型ensemble
类 | 类的功能 |
---|---|
ensemble.AdaBoostClassifier | AdaBoost分类 |
ensemble.AdaBoostRegressor | Adaboost分类 |
ensemble.BaggingClassifier | 装袋分类器 |
ensemble.BaggingRegressor | 装袋回归器 |
ensemble.ExtraTreesClassifier | Extra-trees分类(超树,极端随机树) |
ensemble.ExtraTreesRegressor | Extra-trees回归 |
ensemble.GradientBoostingClassifier | 梯度提升分类 |
ensemble.GradientBoostingRegressor | 梯度提升回归 |
ensemble.IsolationForest | 隔离森林 |
ensemble.RandomForestClassifier | 随机森林分类 |
ensemble.RandomForestRegressor | 随机森林回归 |
ensemble.RandomTreesEmbedding | 完全随机树的集成 |
ensemble.VotingClassifier | 用于不合适估算器的软投票/多规则分类器 |
二、RandomForestClassifier
class sklearn.ensemble.RandomForestClassifier (n_estimators=’10’, criterion=’gini’, max_depth=None,
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=’auto’,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, bootstrap=True, oob_score=False,
n_jobs=None, random_state=None, verbose=0,
warm_start=False, class_weight=None)
随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。
1、重要参数
- 控制基评估器的参数
参数 | 含义 |
---|---|
criterion | 不纯度的衡量指标,有基尼系数和信息熵两种选择 |
max_depth | 树的最大深度,超过最大深度的树枝都会被剪掉 |
min_samples_leaf | 一个节点在分枝后的每个自子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生 |
min_samples_split | 一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分 枝,否则分枝就不会发生 |
max_features | max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃, 默认值为总特征个数开平方取整 |
min_impurity_decrease | 限制信息增益的大小,信息增益小于设定数值的分枝不会发生 |
在决策树的文章中有对这些参数进行详解。
单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或 者少数服从多数原则来决定集成的结果的。
- 参数n_estimators
此参数控制基评估器的数量。该参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。 但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越 长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
随机森林用什么方法,来保证集成的效果一定好于单个分类器?
随机森林的本质是一种装袋集成算法(bagging),装袋集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果。
假设随机森林模型建立了25棵树,在平均或多数表决原则下,当且仅当13棵以上的树判断错误的时候,随机森林才会判断错误,若一棵树判断错误的可能性ε=0.2,则随机森林判断错误的可能性:
其中i为判错树的数量,ε是一棵树判断错误的概率,1-ε是判断正确的概率,Python代码:import numpy as np from scipy.special import comb np.array([comb(25, i) * (0.2 ** i) * ((1-0.2) ** (25-i)) for i in range(13, 26)]).sum() # 运行结果为:0.000369
从结果来看随机森林集成的结果比单个决策树好很多
- 参数random_state
随机森林中的random_state和决策树的random_state功能不一样,决策树中的random_state控制一棵树的生产,随机森林中的random_state控制的是生成森林的模型。设置了random_state参数之后每次训练生成的所有的树是一致的(即整个森林一致),森林中的每棵树的random_state不同。这符合:装袋法集成,基分类器应当是相互独立的原则。但这种做法有一个局限性,当森林非常大时,数据不一定能够提供成足够多的特征来让我们构建尽量多不同的树,因此还需要一些其他的随机性。 - bootstrap & oob_score
可以使用不同的训练集来训练基分类器,以达到让基分类器尽量不一样的目的。装袋法正是通过有放回的随机抽样技术来形成不同的训练集,bootstrap是用来控制抽样技术的参数。
在一个含有n个样本的原始训练集中,我们进行随机采样,每次采样一个样本,并在抽取下一个样本之前将该样本 放回原始训练集,也就是说下次采样时这个样本依然可能被采集到,这样采集n次,最终得到一个和原始训练集一 样大的,n个样本组成的自助集。由于是随机采样,这样每次的自助集和原始数据集不同,和其他的采样集也是不 同的。这样我们就可以自由创造取之不尽用之不竭,并且互不相同的自助集,用这些自助集来训练我们的基分类 器,我们的基分类器自然也就各不相同了。
bootstrap参数默认True,代表采用这种有放回的随机抽样技术。通常,这个参数不会被我们设置为False。
有放回抽样,当数据量很大时必然会导致一些样本在同一个自助集中出现多次。自助集大约平均包含63%的原始数据,因为每一个样本被抽到某个自助集中的概率为:1-(1-1/n)n。当n足够大时概率收敛于1-(1/e)约等于0.632。因此会有约37%的数据成为袋外数据(out of bag data,简写oob)。随机森林可以使用这部分数据作为测试集。即可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型。但是在数据集和n_estimators都不够大时,建模后没有袋外数据,就无法使用oob数据来测试模型了。但是可以通过oob_score参数来控制。设置为True,就可以使用袋外数据来测试模型。并通过oob_score_属性来查看结果。
前面介绍random_state参数说装袋法要求基评估器要尽量独立。不仅如此,使用装袋法还要求基评估器的判断准确率至少要超过随机分类器(即准确率要超过50%)。
import numpy as np from scipy.special import comb import matplotlib.pyplot as plt 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)时,集成效果是比基分类器要好的,相反,装袋的集成算法就失效了,所以使用随机森林之前,一定要检查用来组成随机森林的分类树们是否都有至少50%的预测正确率。
三、RandomForestRegressor
class sklearn.ensemble.RandomForestRegressor (n_estimators=’warn’, criterion=’mse’, max_depth=None,
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=’auto’,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, bootstrap=True, oob_score=False,
n_jobs=None, random_state=None, verbose=0, warm_start=False)
所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标, 参数criterion不一致。而这个参数和决策树中的回归树一样。故这里不再过多重复,不知道的同学可以回头看一下之前的文章《决策树》。
四、随机森林模型的运用
- 用来填充缺失数据
我们在现实中收集到的数据,不可能一上来就符合模型训练的要求,我们必须要做很多预处理的工作(数据预处理会有专门的文章来写)。其中一项就是缺失数据的填充,而随机森林可以用来填补特征的缺失。用随机森林来填充缺失值最理想的状态就是除了要填充的特征有缺失值,其他的特征很完整。如果数据中有多个特征都有缺失,则可以每次选择当前缺失最少的特征开始进行填充,直到所有缺失的特征都填充完成。 - 做分类任务
随机森林是集成学习模型,其基分类器是决策树,通过装袋法构建决策树森林,其分类效果比单个决策树的效果要好。并且树模型对数据的敏感度比较低,所以做分类任务是个不错的选择。
五、集成算法Bagging和Boosting对比
装袋法(把钩工) | 提升法(boosting) | |
---|---|---|
评估器 | 相互独立,同时运行 | 相互关联,按顺序依次构建,后建的模型会在先建模型预测失败的样本上有更多的权重 |
抽样数据 | 有放回抽样 | 有放回抽样,但会确认数据的权重,每次抽样都会给容易预测失败的样本更多的权重 |
决定集成的结果 | 平均或少数服从多数原则 | 加权平均,在训练集上表现更好的模型会有更大的权重 |
目标 | 降低方差,提高模型整体的稳定性 | 降低偏差,提高模型整体的精确度 |
单个评估器存在过拟合问题的时候 | 能够一定程度上解决过拟合问题 | 可能会加剧过拟合问题 |
单个评估器的效力比较弱的时候 | 不是非常有帮助 | 很可能会提升模型表现 |
代表模型 | 随机森林 | 梯度提升树、Adaboost |