本文总结了我在学习随机森林时关于oob产生的一系列问题以及学习到的问题答案

  • 1. 什么是oob
  • 2. 什么是oob_score
  • 3. 如何用oob判断特征的重要性
  • 错误理解与纠正
  • 参考文章


在学习随机森林算法参数解释以及参数择优的过程中,注意到oob_score这一参数对应是否采用袋外样本来评估模型的好坏。
同时在学习随机森林的优点时,其中一条是训练后可以给出各个特征对于输出的重要性。

一开始未能清楚理解该优点的理论原因是什么,但在今天学习oob_score的时候,我就想这个优点是不是就是基于oob实现的(不是!具体看后文!)。

1. 什么是oob

首先简单说一下什么是袋外样本oob (Out of bag):在随机森林中,m个训练样本会通过bootstrap (有放回的随机抽样) 的抽样方式进行T次抽样每次抽样产生样本数为m的采样集,进入到并行的T个决策树中。这样有放回的抽样方式会导致有部分训练集中的样本(约36.8%)未进入决策树的采样集中,而这部分未被采集的的样本就是袋外数据oob。

而这个袋外数据就可以用来检测模型的泛化能力,和交叉验证类似。可以理解成从train datasets 中分出来的validation datasets。

2. 什么是oob_score

对于单棵用采样集训练完成的决策树Ti,用袋外数据运行后会产生一个oob_score (返回的是R square来判断),对每一棵决策树都重复上述操作,最终会得到T个oob_score,把这T和oob_score平均,最终得到的就是整个随机森林的oob_score

R 随机森林协变量重要性的排序怎么获取 随机森林重要性评分_机器学习

3. 如何用oob判断特征的重要性

用oob样本在训练好的决策树T1上运行,可以得到袋外数据误差 e1,然后保持其他列不变, permutate(随机重排/洗牌)第 i 列特征的特征值或者加噪音在 oob中第 i 列特征的特征值上,得到袋外数据误差 ei2。

计算特征X的重要性=∑(ei2-e1)/T。改变特征值之后ei2变动越大,说明该特征产生的影响越大,该特征值越重要。

通过利用oob对每个特征分别permutation或加噪音,迭代进行,评估改变每个特征后的∑(ei2-e1)/T,然后做一个排序,值越高的特征越重要。
(OOB Error is the number of wrongly classifying the OOB Sample.)

错误理解与纠正

一开始我还在想着要真一个个特征换随机数,一个个决策树迭代的话估计头大…[too young too naive] 在搜索学习过程中发现有【1】sklearn.ensemble 里的RandomForestClassifier自带了这个功能属性。具体使用例子可参考文章【5】

但是在写这篇文章的过程中,发现自己产生了重大错误,确实是有feature_importances_这个功能,我一开始以为是基于oob的,但是读了sklearn文档和问了老师之后发现,并不是基于oob。而事实就是oob的方法确实要这样一个个特征换随机数,一个个决策树迭代…

R 随机森林协变量重要性的排序怎么获取 随机森林重要性评分_随机森林_02


sklearn文档里写的是 impurity-based,我的理解就是用基尼系数或者信息增益来判断。还没弄清这一部分的内容,还在学习中…同样可参考【5】

但是用oob来判断特征的重要性这一方法又是确实存在的,只不过因为一个个换随机数,一个个算比起feature_importances_原理的算法确实more computationally expensive。

以上就是我对oob_score以及用oob判断特征重要性的理解

文章内若有任何错误,欢迎指正!
(今天一天全在纠结这个oob了,以为想通了结果又错了,真的是不断读文章不断犯错又不断纠正错误的痛并快乐着的过程…)

参考文章

【1】sklearn.ensemble.RandomForestClassifier
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

【2】随机森林算法OOB_SCORE最佳特征选择

【3】随机森林如何评估特征重要性
https://www.jianshu.com/p/7a876bb876b9

【4】随机森林中oob以及oob的作用?
https://www.jianshu.com/p/b94ec2fc345d

【5】利用随机森林对特征重要性进行评估

【6】sklearn机器学习:随机森林回归器RandomForestRegressor