本文总结了我在学习随机森林时关于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
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的方法确实要这样一个个特征换随机数,一个个决策树迭代…
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