随机森林

  1. 集成学习
    集成学习 (ensemble learning)通过构建并结合多个学习器来完成学习任务。先产生一组"个体学习器" (individual learner),再用某种策略将它们结合起来。

  2. 个体学习器
    个体学习器通常由一个现有的学习算法从训练数据产生,例如 C4.5 决策树算法、 BP 神经网络算法等。当集成中只包含同种类型的个体学习器,例如"决策树集成" 中全是决策树,“神经网络集成"中全是神经网络,这样的集成是"同质” 的(homogeneous)。 集成也可包含不同类型的个体学习器,例如同时包含决策树和神经网络,这样的集成是"异质"的(heterogenous)。
    在一般经验中,如果把好坏不等的东西掺到一起,那么通常结果会是比最坏的要好一些,比最好的要坏一些。集成学习把多个学习器结合起来,如何能获得比最好的单一学习器更好的性能呢?
    随机森林_第1张图片
    考虑一个简单的例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如图 所示,集成学习的结果通过投票法产生,即"少数服从多数"在图(a) 中,每个分类器都只有 66.6% 的精度,但集成学习却达到了 100%;在图(b)中,三个分类器没有差别,集成之后性能没有提高;在图 ©中,每个分类器的精度都只有 33.3%,集成学习的结果变得更糟。这个简单的例子显示出:要获得好的集成,个体学习器应"好而不同”,即个体学习器要有一定的准确性,且个体学习器之间要有差异。

  3. boosting与bagging
    Boosting串行式集成学习方法最著名的代表。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值 T, 最终将这 T 个基学习器进行加权结合。Boosting 族算法最著名的代表是 AdaBoost。
    从偏差一方差分解的角度看出, Boosting 主要关住降低偏差,因此 Boosting 能基于泛化性能相当弱的学习器构建出很强的集成。
    Bagging并行式集成学习方法最著名的代表。从名字即可看出,它直接基于西瓜书 2.2.3 节介绍过的自助采样法 (bootstrap sampling)。给定包含 m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过 m 次随机采样操作,我们得到含 m 个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。由西瓜书中式(2.1)可知,初始训练集中约有 63.2% 的样本出现在来样集中。
    采样出 T 个含 m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。这就是 Bagging 的基本流程。在对预测输出进行结合时, Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。
    Bagging 是一个很高效的集成学习算法,与标准 AdaBoost 只适用于二分类任务不同, Bagging 能不经修改地用于多分类、回归等任务。
    自助采样过程还给 Bagging 带来了另一个优点:由于每个基学习器只使用了初始训练集中约 63.2% 的样本,剩下约 36.8% 的样本可用作验证集来对泛化性能进行"包外估计" 。事实上,包外样本还有许多其他用途。例如当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理;当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险。
    从偏差-方差分解的角度看, Bagging 主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

  4. 结合策略
    学习器结合的必要性:第一,若假设空间很大,可能有多个假设在训练集上达到同等性能,若使用单学习器可能导致错选而使泛化性能变差。第二,算法可能陷入局部极小,而有的局部极小可能泛化性能很差,使用结合策略可能降低此风险。第三,真实假设可能不在当前考虑的假设空间中,通过多学习器结合可将假设空间扩大。
    结合策略主要有平均法、投票法和学习法三类。
    (1)平均法
    分为简单平均法和加权平均法两种。加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠。尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合。因此,实验和应用均显示出,加权平均法未必优于简单平均法。 一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。

(2)投票法
分为绝对多数投票法、相对多数投票法和加权投票法。
在现实任务中,不同类型个体学习器可能产生不同类型的f (x) 值,常见的有:
-类标记: h(x) ε{0, 1},若将样本 z 预测为类别 Cj, 则取值为 1,否则为 0. 使用类标记的投票亦称"硬投票" (hard voting).
-类概率: h (x) ε[0, 1],相当于对后验概率 P(Cj I x) 的一个估计。使用类概率的投票亦称"软投票" (soft voting).
不同类型的h(x) 值不能混用。对一些能在预测出类别标记的同时产生分类置信度的学习器,其分类置信度可转化为类概率使用。若此类概率未进行规范化,例如支持向量机的分类间隔值,则必须使用一些技术如 Platt 缩 放、等分回归等进行"校准" (calibration)后才能作为类概率使用。有趣的是, 虽然分类器估计出的类概率值一般都不太准确,但基于类概率进行结合却往往比直接基于类标记进行结合性能更好。需注意的是,若基学习器的类型不同,则其类概率值不能直接进行比较;在此种情形下,通常可将类概率输出转化为类标记输出(例如将类概率输出最大的h(x) 设为 1,其他设为 0) 然后再投票。

(3)学习法
当训练数据很多时,一种更为强大的结合策略是"学习法",即通过另一个学习器来进行结合. Stacking是学习法的典型代表。这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。
Stacking 先从初始数据集训练出初级学习器,然后"生成"一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。
贝叶斯模型平均(Bayes Model Averaging,简称 BMA)基于后验概率来为不同模型赋予权重,可视为加权平均法的一种特殊实现。对 Stacking 和 BMA 进行了比较,理论上来说,若数据生成模型在当前考虑的模型中,且数据噪声很少,则 BMA 不差于 Stacking;然而,在现实应用中无法确保数据生成模型一定在当前考虑的模型中,甚至可能难以用当前考虑的模型来进行近似,因此,Stacking 通常优于 BMA,因为其鲁棒性比 BMA 更好,而且 BMA 对模型近似误差非常敏感。

  1. 随机森林思想
    随机森林(Random Forest,简称 RF) 是 Bagging的一个扩展变体。在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有 d 个属性)中选择一个最优属性;而在 RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k个属性的子集,然后再从这个子集中选择一个最优属性用于划分. 这里的参数 k 控制了随机性的引入程度;若令 k = d,则基决策树的构建与传统决策树相同; 若令 k = 1, 则是随机选择一个属性用于划分; 一般情况下,推荐值 k = log2 d 。随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成的泛化性能可通 过个体学习器之间差异度的增加而进一步提升。
    随机森林的起始性能往往相对较差, 特别是在集成中只包含一个基学习器时这很容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。 值得一提的是,随机森林的训练效率常优于 Bagging,因为在个体决策树的构建过程中, Bagging 使用的是 “确定型” 决策树,在选择划分属性时要对结点的所有属性进行考察, 而随机森林使用的"随机型"决策树则只需考察一个属性子集。

  2. 随机森林优缺点
    优势:
    1、它能够处理很高维度(feature很多)的数据,并且不用做特征选择
    原因:特征子集是随机选择的,子集大小可以控制。
    2、在训练完后,它能够给出feature重要大小
    3、训练速度快,容易做成并行化方法
    原因:训练时树与树之间是相互独立的
    4、如果有很大一部分的特征遗失,仍可以维持准确度。
    缺陷:
    1、随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合
    2、对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,(跟决策树算法类似,以信息增益划分数据集的特征,都有这个问题,可以用信息增益比校正)所以随机森林在这种数据上产出的属性权值是不可信的。

  3. sklearn的随机森林
    在scikit-learn中,RF的分类器是RandomForestClassifier,回归器是RandomForestRegressor。和GBDT的调参类似,RF需要调参的参数也包括两部分,第一部分是Bagging框架的参数,第二部分是CART决策树的参数

classsklearn.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_split=1e-07,bootstrap=True,
        oob_score=False, n_jobs=1, 
        random_state=None, verbose=0,
        warm_start=False, class_weight=None)

随机森林框架参数
由于RandomForestClassifier和RandomForestRegressor参数绝大部分相同,这里会将它们一起讲,不同点会指出。

  1. n_estimators:
    最大的弱学习器的个数。一般来说n_estimators太小,容易过拟合,n_estimators太大,又容易欠拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。

  2. oob_score:
    即是否采用袋外样本来评估模型的好坏。默认是False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。

  3. criterion:
    即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。

从上面可以看出, RF重要的框架参数比较少,主要需要关注的是 n_estimators,即RF最大的决策树个数。

随机森林决策树参数
RF的决策树参数,它要调参的参数基本和GBDT相同,如下:

  1. max_features
    决策树划分时考虑的最大特征数max_features:可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log2(n_features)个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑sqrt(n_features) 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
    参数效果:max_features 值越大,模型学习能学习到的信息越多,越容易过拟合。

2)max_depth
决策树最大深度max_depth, 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
参数效果:值越大,决策树越复杂,越容易过拟合。

  1. min_samples_split
    内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
    参数效果:值越大,决策树越简单,越不容易过拟合。

4)min_samples_leaf
叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
参数效果:值越大,叶子节点越容易被被剪枝,决策树越简单,越不容易过拟合。

5)min_weight_fraction_leaf
叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

  1. max_leaf_nodes
    最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
    参数效果:值越小,叶子节点个数越少,可以防止过拟合。

7)min_impurity_split
节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。

常用方法
predict_proba(x):给出带有概率值的结果。每个点在所有label(类别)的概率和为1.
predict(x):直接给出预测结果。内部还是调用的predict_proba(),根据概率的结果看哪个类型的预测值最高就是哪个类型。
predict_log_proba(x):和predict_proba基本上一样,只是把结果给做了log()处理。
特征重要性(模型可解释性)
训练完模型后可以使用属性feature_importances_,查看特征的重要性 ,值越大特征越重要。

sklearn部分参考:https://blog.csdn.net/geduo_feng/article/details/79558572

  1. 随机森林的应用场景
    随机森林应用比较广泛,可用于多分类问题和回归问题。对于特征高维的问题,随机森林很有优势,可以不用事先做特征选择。另外,对于部分特征值缺失的场景,随机森林比较友好。
    在特征工程中,随机森林算法也常用于特征选择。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

1)平均不纯度减少(mean decrease impurity)
随机森林由多颗CART决策树构成,决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。
CART利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度,对于回归问题,通常采用的是方差或者最小二乘拟合。
当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的标准。
随机森林基于不纯度的排序结果非常鲜明,在得分最高的几个特征之后的特征,得分急剧的下降。

2)平均精确度减少(mean decrease accuracy)
通过直接度量每个特征对模型精确率的影响来进行特征选择。
主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。
对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大。
对于重要的变量来说,打乱顺序就会降低模型的精确率。

你可能感兴趣的:(机器学习)