随机森林oob_score及oob判断特征重要性

       目录

1. oob

2. oob_score

3. oob选择重要特征

4.与其它方法对比


        Sklearn RandomForest算法(有监督学习),可以根据输入数据,选择最佳特征,减少特征冗余;同理,可以通过特征的排列组合,选择最优的组合特征,优化下游算法性能

        原理:由于随机决策树生成过程采用的Boostrap,所以在一棵树的生成过程并不会使用所有的样本,未使用的样本就叫(out_of_bag)oob袋外样本。通过袋外样本,可以评估这个树的准确度;此外,其他子树按这个原理评估。最后,取平均值即是随机森林算法的性能。

        特征选择原理:因为袋外样本的存在,因此不需要进行十字交叉测试(节省时间),通过依次对每个特征赋予一个随机数,观察算法性能的变化,倘若变化大,则说明该特征重要,sklearn中会对每个特征赋予一个分数,分数越大,特征越重要,因此,可以根据特征重要性排序,然后选择最佳特征组合。

       在学习随机森林算法参数解释以及参数择优的过程中,注意到oob_score这一参数对应是否采用袋外样本来评估模型的好坏。

1. oob

        袋外样本oob (Out of bag):在随机森林中,n个训练样本会通过bootstrap (有放回的随机抽样) 的抽样方式进行T次抽样每次抽样产生样本数为n的采样集,进入到并行的T个决策树中。

        有放回的抽样方式会导致有部分训练集中的样本(约36.8%)未进入决策树的采样集中,而这部分未被采集的的样本就是袋外数据oob。袋外数据就可以用来检测模型的泛化能力,和交叉验证类似。

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.)

       sklearn.ensemble 里的RandomForestClassifier有选择重要特征的功能,其采用的是impurity-based(用基尼系数或者信息增益)来判断特征重要性。并不等同于OOB,OOB方法确实要一个个特征换随机数,一个个决策树迭代。

示例:

"""
Created on Mon Mar 19 20:22:09 2018
@author: test
function: iteritor for features combintaion
date:2018/3/19
"""
 
import copy 
import sys
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
 
data = pd.read_csv(r"C:\Users\huzhipeng_sx\Desktop\data",header = None,sep = '\t')
 
y_train = data[0].values
X_train = data.drop(0,axis=1).values
X_train = pd.DataFrame(np.delete(X_train,-5,axis=1))
 
features_name = ['a','b','c']
 
 
rf = RandomForestClassifier(n_estimators=200,oob_score=True)
rf.fit(X_train,y_train)
features_imp = rf.feature_importances_
 
X_train = X_train.as_matrix()  #输入要是数组,不然无法切片,报错slice
 
def select_combine(X_train,y_train,features_name,features_imp,select_num):
    oob_result = []
    fea_result = []
    features_imp = list(features_imp)
    iter_count = X_train.shape[1] - select_num  #迭代次数
    if iter_count < 0:
        print("select_nume must less or equal X_train columns")
    else:
        features_test  = copy.deepcopy(features_imp)   #生成一个排序特征,进行筛选
        features_test.sort()
        features_test.reverse() 
        
        while iter_count >= 0:
            iter_count -= 1
            train_index = [features_imp.index(j) for j in features_test[:select_num]]
            train_feature_name = [features_name[k] for k in train_index][0]
            train_data = X_train[:,train_index]
            rf.fit(train_data,y_train)
            acc = rf.oob_score_
            print(acc)
            oob_result.append(acc)
            fea_result.append(train_index)
            if select_num < X_train.shape[1]:
                select_num += 1
            else:
                break
    return max(oob_result),oob_result,fea_result[oob_result.index(max(oob_result))]
 
select_num = 20
max_result, oob_result, fea_result = select_combine(X_train,y_train,features_name,features_imp,select_num)

4.与其它方法对比

        随机森林算法特征维度,不同于PCA,随机森林算法能够考虑到特征对类别的影响,而PCA是单纯的数据方差;但是随机森林的缺点是需要迭代计算,如果在大数据条件下,进行选择,就难免有点捉襟见肘了;与LDA区别在于:LDA根据标签,通过变换将同标签数据距离缩小,将累间距离方法;LDA是一种有监督方法,PCA属于无监督方法;
 

转载文章连接:

        https://blog.csdn.net/MingRachel/article/details/115038730

        https://blog.csdn.net/zehui6202/article/details/79625639

  • 0
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值