机器学习之理解随机森林

一、概述
1、 集成算法

集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预 测疾病的风险和病患者的易感性。在现在的各种算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等集成算法的身影也随处可见,可见其效果之好,应用之广。

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

多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器 (base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。
在这里插入图片描述
装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结 果。装袋法的代表模型就是随机森林。

提升法中,基评估器是相关的,是按顺序一一构建的。其核心思想是结合弱评估器的力量一次次对难以评估的样本 进行预测,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树。

2、sklearn中的集成算法

sklearn中的集成模型ensemble

类的功能
ensemble.AdaBoostClassifierAdaBoost分类
ensemble.AdaBoostRegressorAdaboost分类
ensemble.BaggingClassifier装袋分类器
ensemble.BaggingRegressor装袋回归器
ensemble.ExtraTreesClassifierExtra-trees分类(超树,极端随机树)
ensemble.ExtraTreesRegressorExtra-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、重要参数
  1. 控制基评估器的参数
参数含义
criterion不纯度的衡量指标,有基尼系数和信息熵两种选择
max_depth树的最大深度,超过最大深度的树枝都会被剪掉
min_samples_leaf一个节点在分枝后的每个自子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
min_samples_split一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分 枝,否则分枝就不会发生
max_featuresmax_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃, 默认值为总特征个数开平方取整
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生

决策树的文章中有对这些参数进行详解。

单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或 者少数服从多数原则来决定集成的结果的。

  1. 参数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

从结果来看随机森林集成的结果比单个决策树好很多

  1. 参数random_state
    随机森林中的random_state和决策树的random_state功能不一样,决策树中的random_state控制一棵树的生产,随机森林中的random_state控制的是生成森林的模型。设置了random_state参数之后每次训练生成的所有的树是一致的(即整个森林一致),森林中的每棵树的random_state不同。这符合:装袋法集成,基分类器应当是相互独立的原则。但这种做法有一个局限性,当森林非常大时,数据不一定能够提供成足够多的特征来让我们构建尽量多不同的树,因此还需要一些其他的随机性。
  2. 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不一致。而这个参数和决策树中的回归树一样。故这里不再过多重复,不知道的同学可以回头看一下之前的文章《决策树》。

四、随机森林模型的运用
  1. 用来填充缺失数据
    我们在现实中收集到的数据,不可能一上来就符合模型训练的要求,我们必须要做很多预处理的工作(数据预处理会有专门的文章来写)。其中一项就是缺失数据的填充,而随机森林可以用来填补特征的缺失。用随机森林来填充缺失值最理想的状态就是除了要填充的特征有缺失值,其他的特征很完整。如果数据中有多个特征都有缺失,则可以每次选择当前缺失最少的特征开始进行填充,直到所有缺失的特征都填充完成。
  2. 做分类任务
    随机森林是集成学习模型,其基分类器是决策树,通过装袋法构建决策树森林,其分类效果比单个决策树的效果要好。并且树模型对数据的敏感度比较低,所以做分类任务是个不错的选择。
五、集成算法Bagging和Boosting对比
装袋法(把钩工)提升法(boosting)
评估器相互独立,同时运行相互关联,按顺序依次构建,后建的模型会在先建模型预测失败的样本上有更多的权重
抽样数据有放回抽样有放回抽样,但会确认数据的权重,每次抽样都会给容易预测失败的样本更多的权重
决定集成的结果平均或少数服从多数原则加权平均,在训练集上表现更好的模型会有更大的权重
目标降低方差,提高模型整体的稳定性降低偏差,提高模型整体的精确度
单个评估器存在过拟合问题的时候能够一定程度上解决过拟合问题可能会加剧过拟合问题
单个评估器的效力比较弱的时候不是非常有帮助很可能会提升模型表现
代表模型随机森林梯度提升树、Adaboost
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值