龙空技术网

Python机器学习系列之scikit-learn随机森林原理简要概述

强哥分享干货 281

前言:

如今大家对“随机森林python”可能比较注重,朋友们都想要分析一些“随机森林python”的相关知识。那么小编同时在网摘上网罗了一些关于“随机森林python””的相关内容,希望小伙伴们能喜欢,大家一起来学习一下吧!

1.决策树DecisionTree简单回顾

在前面的几个章节中,我们分别介绍了下决策树DecisionTree的简单概念和原理,以及决策树DecisionTree在分类问题和回归问题方面的简单实践:

Python机器学习系列之scikit-learn决策树原理简要概述Python机器学习系列之scikit-learn决策树分类问题简单实践Python机器学习系列之scikit-learn决策树回归问题简单实践

我们先复习一下决策树。决策树是一种原理简单,应用广泛的模型,它可以同时被用于分类和回归问题。决策树的主要功能是从一张有特征和标签的表格中,通过对特定特征进行提问,为我们总结出一系列决策规则,并用树状图来呈现这些决策规则。

决策树的核心问题有两个,一个是如何找出正确的特征来进行提问,即如何分枝,二是树生长到什么时候应该停下。

对于第一个问题,我们定义了用来衡量分枝质量的指标不纯度,分类树的不纯度用基尼系数或信息熵来衡量,回归树的不纯度用MSE均方误差来衡量。每次分枝时,决策树对所有的特征进行不纯度计算,选取不纯度最低的特征进行分枝,分枝后,又再对被分枝的不同取值下,计算每个特征的不纯度,继续选取不纯度最低的特征进行分枝。

决策树

每分枝一层,树整体的不纯度会越来越小,决策树追求的是最小不纯度。因此,决策树会一致分枝,直到没有更多的特征可用,或整体的不纯度指标已经最优,决策树就会停止生长。

决策树非常容易过拟合,这是说,它很容易在训练集上表现优秀,却在测试集上表现很糟糕。为了防止决策树的过拟合,我们要对决策树进行剪枝。

2.随机森林概述2.1集成算法概述

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

集成算法的目标是什么?

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

集成方法一般分为两种:

在平均法(averaging methods)中,该方法的原理是构建多个独立的估计器,然后取它们的预测结果的平均。一般来说,组合之后的估计器是会比单个估计器要好的,因为它的方差减小了;在提升法(boosting methods)中,基估计器是按照顺序建立的,并且试图减小组合估计器的偏差。其动机是将几个弱模型结合起来,形成一个强大的整体;

多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。

集成算法

装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结果。装袋法的代表模型就是随机森林。

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

2.2 Bagging meta-estimator(Bagging 元-估计器)

在集成算法中, bagging方法形成了一类算法,它在原始训练集的随机子集上建立几个黑箱估计器的实例,然后将它们的个体预测聚合起来,形成最终的预测。这些方法通过在基本估计器(例如决策树)的构造过程中引入随机化,然后将其集成起来,从而降低单个基本估计器(如决策树)的方差。在许多情况下,bagging方法是一个非常简单的方法可以用来改进相对单一模型,而不需要调整底层。由于bagging方法提供了一种减少过度拟合的途径,因此对强大模型和复杂模型(例如,充分生长的决策树)最有效,与之对比的提升法在弱模型(例如浅层决策树)上表现最好。

Bagging方法有许多不同的变种(flavours),但主要是因为它们提取训练集的随机子集的方式不同:

如果抽取的数据集的随机子集是样本的随机子集,我们叫做粘贴 (Pasting);如果样本抽取是有放回的,我们称为 Bagging;如果抽取的数据集的随机子集是特征的随机子集,我们叫做随机子空间 (Random Subspaces);最后,如果基估计器构建在对于样本和特征抽取的子集之上时,我们叫做随机补丁 (Random Patches);2.3 由随机树组成的森林

sklearn.ensemble集成模块包括两种基于随机决策树的平均算法:RandomForest算法和Extra-Trees算法。这两种算法都是专门为树设计的扰动和组合技术(perturb-and-combine techniques)[B1998] 。这意味着在分类器构造过程中引入随机性来创建一组不同的分类器的集合。集成之后的预测是每个分类器的平均。

与其他分类器一样,森林分类器(forest classifiers)必须拟合两个数组:一个稀疏或密集的X数组, 包含训练样本, 形状是[n_samples, n_features], 还有数组Y, 形状是 [n_samples], 包含训练样本的目标值(类标签):

from sklearn.ensemble import RandomForestClassifierX = [[0, 0], [1, 1]]Y = [0, 1]clf = RandomForestClassifier(n_estimators=10)clf = clf.fit(X, Y)
2.4 随机森林

在随机森林中(RandomForestClassifierRandomForestRegressor类),集成模型中的每棵树构建时的样本都是由训练集经过有放回抽样(比如一个bootstrap sample 自助式采样法)得来的。

另外,在构建树的过程中进行节点分割时,选择的分割点是所有特征的最佳分割点,或特征的大小为 max_features 的随机子集的最佳分割。

这两种随机的目的是降低森林估计器的方差。事实上,单个决策树通常表现出很高的方差,并且往往会过拟合。在森林中注入随机性产生的决策树具有一定的解耦预测误差(decoupled prediction errors)。通过取这些预测的平均值,可以抵消掉一些误差。随机森林通过组合不同的树来减少方差,有时以增加一点点偏差为代价。在实践中,方差减少通常是值得关注的,因此产生了一个整体更好的模型。

scikit-learn实现通过平均它们的概率预测来组合分类器,而不是让每个分类器为单个类别进行投票。

2.5 极端随机树

在极端随机树(参见 ExtraTreesClassifierExtraTreesRegressor 类)中,计算分割点方法中的随机性进一步增强。与随机森林中一样,使用了候选特征的随机子集,但不像随机森林中是寻找最具区分度的阈值,而是对每个候选特征随机绘制阈值,并选择这些随机生成的阈值中最佳的作为作为分割规则。这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差:

from sklearn.model_selection import cross_val_scorefrom sklearn.datasets import make_blobsfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.ensemble import ExtraTreesClassifierfrom sklearn.tree import DecisionTreeClassifierX, y = make_blobs(n_samples=10000, n_features=10, centers=100,    random_state=0)clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,    random_state=0)scores = cross_val_score(clf, X, y, cv=5)scores.mean()clf = RandomForestClassifier(n_estimators=10, max_depth=None,    min_samples_split=2, random_state=0)scores = cross_val_score(clf, X, y, cv=5)scores.mean()clf = ExtraTreesClassifier(n_estimators=10, max_depth=None,    min_samples_split=2, random_state=0)scores = cross_val_score(clf, X, y, cv=5)scores.mean() > 0.999
3.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集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。

3.1 重要参数3.1.1 控制基评估器的参数

参数

含义

criterion

不纯度的衡量指标,有基尼系数和信息熵两种选择

max_depth

树的最大深度,超过最大深度的树枝都会被剪掉

min_samples_leaf

一个节点在树分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生

min_samples_split

一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生

max_features

max_features限制分支时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整数

min_impurity_decrease

限制信息增益的大小,信息增益小于设定数值的分支不会发生

这些参数在随机森林中的含义,和介绍决策树时说明的内容一模一样,单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或者少数服从多数原则来决定集成的结果的。

3.1.2 n_estimators参数

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

n_estimators的默认值在现有版本的sklearn中是100,在早期的版本中,这个默认值是10。这个修正显示出了使用者的调参倾向:要更大的n_estimators。

3.1.3 random_state参数

随机森林的本质是一种装袋集成算法(bagging),装袋集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果。

随机森林中其实也有random_state,用法和决策树DecisionTree中相似,只不过在分类树中,一个random_state只控制生成一棵树,而随机森林中的random_state控制的是生成森林的模式,而非让一个森林中只有一棵树。

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

但这种做法的局限性是很强的,当我们需要成千上万棵树的时候,数据不一定能够提供成千上万的特征来让我们构筑尽量多尽量不同的树。因此,除了random_state我们还需要其他的随机性。

不积跬步,无以至千里;

不积小流,无以成江海;

标签: #随机森林python