机器学习教程 之 随机森林: 算法及其特征选择原理

随机森林是集成学习bagging类方法的一种,也是最早的集成学习算法之一,Breiman在2001年提出了这种方法。作为一种bagging类的方法,随机森林几乎可以在绝大多数的数据集上表现出比单独的决策树更好的性能,同时随机森林本身也可以作为一种特征选择的方法。称为迄今为止最著名的算法之一。

关于boosting和bagging类方法的区别和特性我已经在下面这篇博客中具体介绍过,这里不会再重复讲解
机器学习教程 之 Boosting 与 bagging:集成学习框架
此外,相比于提升学习器泛化能力的bagging类方法,提升分类器精度的boosting方法在今天更受人关注,下面这几篇博文,讲述了三个主流的boosting方法
机器学习教程 之 梯度提升方法:GBDT及其扩展模型XGBoost
机器学习教程 之 梯度提升方法:GBDT处理分类问题
机器学习教程 之 加性模型:GBDT退化为AdaBoost原理
机器学习教程 之 集成学习算法: 深入刨析AdaBoost
人工智能里的数学修炼 | AdaBoost的数学原理: 分布更新推导

随机森林原理

随机森林是一种相当简单、容易理解的方法,他的基本原理就是,从原数据集中有放回的采样获得若干个子集,基于每个子集训练出不同的基分类器,再通过基分类器的投票获得最终的分类结果。随机森林采用自助采样法(bootstrap)获得原数据集的子集,先了解自助采样法有助于我们更好的理解随机森林

自助采样法

给定一个包含 m m 个样本的数据集 D D , 我们对它进行采样产生数据集 D D ′ : 每次随机从 D D 中挑选出一个样本,将其拷贝放入 D D ′ ,然后再将该样本放回初始数据集 D D 中,使得该样本在下次采样中仍有可能被采到;这个过程重复执行 m m 次以后,我们就得到了包含 m m 个样本的数据集 D D ′ ,这就是自助采样的结果。显然, D D 中有一部分样本会在 D D ′ 中多次出现,而另一部分样本 不出现。可以做一个简单的估计,样本在 m m 次采样中始终不被采到的概率是 (11/m)m ( 1 − 1 / m ) m ,该式取极限得到 1/e=0.368 1 / e = 0.368 ,即通过自助采样,初始数据集 D 中约有 36.8% 的样本未出现在数据集 D D ′ 中, 于是我们可以将 D D ′ 作为训练集,而剩下的作为测试集

基于自助采样法随机森林的构建过程为:

  1. 从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
  2. 对于n_tree个训练集,我们分别训练n_tree个决策树模型
  3. 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
  4. 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
  5. 将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

另外,随机森林还有值得一提的是,随机森林不但对样本进行采样,也会对属性进行采样,即横竖采样,不过对属性的采样不再是自助采样法了,只是简单的按一定比例随机采样

那么,随机森林是如何进行特征选择的呢?

随机森林的特征选择

要进行特征选择,得现有一个对特征好坏的度量,我们先来看一下,随机森林是如何度量一个特征的好坏的,再来看它如何进行的特征选择

特征好坏衡量

  1. 对每一颗决策树,选择相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1.
    所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练​决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。
  2. 随机对袋外数据OOB所有样本的特征X加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2。
  3. ​假设森林中有N棵树,则特征X的重要性=∑(errOOB2-errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。

特征选择

在特征重要性的基础上,特征选择的步骤如下:

  1. 计算每个特征的重要性,并按降序排序
  2. 确定要剔除的比例,依据特征重要性剔除相应比例的特征,得到一个新的特征集
  3. 用新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)
  4. 根据上述过程中得到的各个特征集和特征集对应的袋外误差率,选择袋外误差率最低的特征集

sklearn 里的随机森林

我们来看看sklearn里的随机森林库函数是如何使用的

from sklearn.ensemble import RandomForestClassifier #分类器

print("DecisionTreesClassifier")

clf1 = RandomForestClassifier(n_estimators = 100) #训练100个基分类器
clf1.fit(traindata,trainlabel)
res = clf1.predict(testdata)
from sklearn.ensemble import RandomForestRegressor #回归器

print("DecisionTreesRegressor")

clf1 = RandomForestRegressor(n_estimators = 100) #训练100个基分类器
clf1.fit(traindata,trainlabel)
res = clf1.predict(testdata)

参考文献

[1] Breiman L. Random Forest[J]. Machine Learning, 2001, 45:5-32.

你可能感兴趣的:(机器学习教程,人工智能的数理模型与优化)