精华内容
下载资源
问答
  • 随机森林对特征重要性排序

    万次阅读 2018-05-18 17:00:47
    two methods: 1.Mean decrease impurity 大概是对于每颗树,按照impurity(gini /entropy /information gain)给特征排序,然后...影响小说明这个特征不重要,反之重要 具体步骤如下: 在随机森林中某个特征X...

    two methods: 
    1.Mean decrease impurity 不纯度降低

    大概是对于每颗树,按照impurity(gini /entropy /information gain)给特征排序,然后整个森林取平均。最优条件的选择依据是不纯度。不纯度在分类中通常为Gini不纯度或信息增益/信息熵,对于回归问题来说是方差。 

    基于不纯度对模型进行排序有几点需要注意: 
    (1)基于不纯度降低的特征选择将会偏向于选择那些具有较多类别的变量(bias)。 
    (2)当存在相关特征时,一个特征被选择后,与其相关的其他特征的重要度则会变得很低,因为他们可以减少的不纯度已经被前面的特征移除了。

    sklearn实现如下:

    from sklearn.datasets import load_boston
    from sklearn.ensemble import RandomForestRegressor
    import numpy as np
    #Load boston housing dataset as an example
    boston = load_boston()
    X = boston["data"]
    print type(X),X.shape
    Y = boston["target"]
    names = boston["feature_names"]
    print names
    rf = RandomForestRegressor()
    rf.fit(X, Y)
    print "Features sorted by their score:"
    print sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names), reverse=True)

    结果如下:

    Features sorted by their score:
    [(0.5104, 'RM'), (0.2837, 'LSTAT'), (0.0812, 'DIS'), (0.0303, 'CRIM'), (0.0294, 'NOX'), (0.0176, 'PTRATIO'), (0.0134, 'AGE'), (0.0115, 'B'), (0.0089, 'TAX'), (0.0077, 'INDUS'), (0.0051, 'RAD'), (0.0006, 'ZN'), (0.0004, 'CHAS')]

    2.Mean decrease accuracy 准确率降低

    这种方法是直接测量每种特征对模型预测准确率的影响,基本思想是重新排列某一列特征值的顺序,观测降低了多少模型的准确率。对于不重要的特征,这种方法对模型准确率的影响很小,但是对于重要特征却会极大降低模型的准确率。 大概就是measure一下对每个特征加躁,看对结果的准确率的影响。影响小说明这个特征不重要,反之重要 

    具体步骤如下: 
    在随机森林中某个特征X的重要性的计算方法如下: 
    a:对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1. 
    b: 随机地对袋外数据OOB所有样本的特征X加入噪声干扰(就可以随机的改变样本在特征X处的值),再次计算它的袋外数据误差,记为errOOB2. 

    c:假设随机森林中有Ntree棵树,那么对于特征X的重要性=∑(errOOB2-errOOB1)/Ntree,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

    示例如下

    from sklearn.cross_validation import ShuffleSplit
    from sklearn.metrics import r2_score
    from collections import defaultdict
    
    X = boston["data"]
    Y = boston["target"]
    
    rf = RandomForestRegressor()
    scores = defaultdict(list)
    
    #crossvalidate the scores on a number of different random splits of the data
    for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):
        X_train, X_test = X[train_idx], X[test_idx]
        Y_train, Y_test = Y[train_idx], Y[test_idx]
        r = rf.fit(X_train, Y_train)
        acc = r2_score(Y_test, rf.predict(X_test))
        for i in range(X.shape[1]):
            X_t = X_test.copy()
            np.random.shuffle(X_t[:, i])
            shuff_acc = r2_score(Y_test, rf.predict(X_t))
            scores[names[i]].append((acc-shuff_acc)/acc)
    print "Features sorted by their score:"
    print sorted([(round(np.mean(score), 4), feat) for
                  feat, score in scores.items()], reverse=True)

    输出结果:

    Features sorted by their score:
    [(0.7276, 'LSTAT'), (0.5675, 'RM'), (0.0867, 'DIS'), (0.0407, 'NOX'), (0.0351, 'CRIM'), (0.0233, 'PTRATIO'), (0.0168, 'TAX'), (0.0122, 'AGE'), (0.005, 'B'), (0.0048, 'INDUS'), (0.0043, 'RAD'), (0.0004, 'ZN'), (0.0001, 'CHAS')]

    在这个例子中, LSTAT 和RM是两个对模型影响较大的特征,打乱他们的顺序将会降低模型约73%与57%的准确率。


    参考:http://blog.datadive.net/selecting-good-features-part-iii-random-forests/


    展开全文
  • from sklearn.datasets import load_boston from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split import numpy as np #Load boston housing dataset as an ...
    from sklearn.datasets import load_boston
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.model_selection import train_test_split
    import numpy as np
    #Load boston housing dataset as an example
    boston = load_boston()
    x = boston.data
    y = boston.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=33)
    
    names = boston["feature_names"]
    print(names)   # ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO','B' 'LSTAT']
    rf = RandomForestRegressor(random_state=48, n_estimators=10, min_samples_split=0.02)
    rf.fit(x_train, y_train)
    importamce = rf.feature_importances_ / np.max(rf.feature_importances_)
    print("Features sorted by their score:")
    print(sorted(zip(map(lambda x: round(x, 4), importamce), names), reverse=True))
    
    
    indices = np.argsort(importamce)[::-1]
    for f in range(x_train.shape[1]):
        print("%2d) %-*s %f" % (f + 1, 30, names[indices[f]], importamce[indices[f]]))
    
    # Features sorted by their score:
    # [(1.0, 'LSTAT'),
    # (0.5397, 'RM'),
    # (0.0978, 'DIS'),
    # (0.0536, 'CRIM'),
    # (0.0412, 'PTRATIO'),
    # (0.022, 'B'),
    # (0.0204, 'TAX'),
    # (0.0194, 'NOX'),
    # (0.0117, 'INDUS'),
    # (0.0113, 'AGE'),
    # (0.0014, 'RAD'),
    # (0.0011, 'ZN'),
    # (0.0011, 'CHAS')]
    
    
    展开全文
  • 随机森林的特征重要性排序

    千次阅读 2019-09-03 23:11:35
    Feature Selection ...在这个特征里面加入一些垃圾,如果和不放的准确率类似,那么就可以说明是重要的。 加什么垃圾呢?垃圾还能选吗? 一个是把原数据的分布改掉,一个是杂絮的影响。 有放回抽样boo...

    OOB计算

    用未被选择到的学习的数据,做验证集计算。不必另外做validation了
    在这里插入图片描述

    Feature Selection

    如果没有做好这部分,也是有缺点的:
    在这里插入图片描述
    其中最致命的就是,可能得到的是错误的答案,一不小心找到的关系就是关联,而不是原因。
    所以RF中加入了在哪里切一刀。

    pemunitation

    随机打乱这个特征的数据,看最后的结果和之前是否一致,这样保证了数据分布的一致。
    如果一致,说明特征影响并不大。
    直接删除呢?并没办法很好的决定出是否重要,因为该特征可能对组合有效?改变太多对结果的影响并不好说。

    特征重要性排序

    在这个特征里面加入一些垃圾,如果和不放的准确率类似,那么就可以说明是重要的。
    加什么垃圾呢?垃圾还能选吗?
    一个是把原数据的分布改掉,一个是杂絮的影响。
    有放回抽样bootstrap,这里选择类似的思想。

    pemunitation test:看下原来的表现和现在被污染之后的表现的差距

    importance(i)=performance(D)performance(Dp)importance(i) = performance(D) - performance(D^p)
    这样的操作需要训练P次,实际的算法采用了近似的方法,采用OOB的方法计算特征重要度排序。
    importance(i)=Eoob(D)Eoob(Dp)importance(i) = E_{oob}(D) - E_{oob}(D^p) 如果是对原数据的分布进行改变,依旧没有什么影响。
    但是可进一步转化为:
    importance(i)=Eoob(D)Eoobp(D)importance(i) = E_{oob}(D) - E_{oob}^p(D),直接在验证上动手脚,训练只训练一次,但是计算OOB的时候对相应的特征,计算相应的OOB分数。

    课后:

    在这里插入图片描述

    展开全文
  • 利用随机森林进行特征重要性排序

    千次阅读 2019-07-09 21:29:31
    round(x,4),rf.feature_importances_),names))) 这里也可以不用随机森林,看到有人用线性回归的,有兴趣的同学也可以实现下,后面会附上相关链接 一般来说维数比较小的数据集得出来的重要性排序都不会有很低的,...

    第一步就是导包,这里我们主要需要用到的就是sklearn和pandas
    我们先对自己的数据集进行一下处理

    import numpy as np
    import pandas as pd
    testset=pd.read_csv("data.csv")
    testset.head(5)
    

    数据集导入

    dataset=testset
    dataset.target=testset['标签']
    dataset.target.head(5)
    


    因为数据集比较大就放前几个拿出来给大家看看,提取完标签之后,为了让后面的步骤更加简洁,直接在数据集中删除掉最后的一列target

    testset.drop(columns=['currentdepth'],inplace=True)
    testset.head(5)
    

    除去target这一列的标签,剩下的都是需要进行排序的特征

    dataset.feature_names=testset.columns
    dataset.feature_names
    

    特征都被输出来了
    在这里插入图片描述

    dataset.data=testset[['特征1','特征2', '特征3', '特征4'......]]
    dataset.data.head(5)
    

    这里我赋给dataset的data值都是根据上面输出的特征属性来的,需要对部分属性排序也可以,为了方便可以多drop掉几个特征然后赋给新的dataset

    print("data shape:{}".format(dataset.data.shape))
    print("target shape:{}".format(dataset.target.shape))
    print("line head 5:\n{}".format(dataset.data[:5]))
    print("target head 5:\n{}".format(dataset.target[:5]))
    

    分别输出前五个数据看看有没有缺特征或者data和target有空值的
    在这里插入图片描述
    数据集处理完成后检查一下是不是data、target、feature_names这三个都有赋值,它们在数据集中对应的位置应该是这样的(以西瓜数据集为例)
    在这里插入图片描述
    色泽、根蒂、敲声、纹理、脐部、触感这些是feature_names,好瓜这一列是target,中间的青绿、乌黑这些是data,在数据处理时最好把data以行的形式存储起来,这样一行是一个实例

    第二步是处理我们通过处理初始的数据集得到的data、target和feature_names

    X=dataset.data
    X.shape
    Y=dataset.target
    names=dataset.feature_names
    print(names)
    

    第三步利用sklearn这个包中的随机森林对特征进行排序,前面都是准备工作,如果是网上可下载的那种数据集不需要花那么多功夫在处理数据集上

    from sklearn.ensemble import RandomForestClassifier
    rf=RandomForestClassifier()
    rf.fit(X,Y)
    print("Features sorted by their score:")
    print(sorted(zip(map(lambda x:round(x,4),rf.feature_importances_),names)))
    

    这里也可以不用随机森林,看到有人用线性回归的,有兴趣的同学也可以实现下,后面会附上相关链接

    一般来说维数比较小的数据集得出来的重要性排序都不会有很低的,针对维数比较大的数据集可以利用这个方法剔除掉数据集中影响比较小的特征,在保证准确度的情况下训练速度更快。

    线性回归进行重要性排序
    使用标准数据集对特征进行重要性排序
    两种重要性排序的方法

    展开全文
  • python绘制随机森林重要排序条形图,以及把重要度之和前0.9显示出来,用于观察 前面的话:因为项目原因,需要特征选择,随机森林有自带的重要度属性,但是我需要观察前0.9(此处理解为能包含重要度之和为0.9的前几...
  • " 雨天天气下随机森林算法中各个特征的排序 " + "\n" ) file.write( "———————————————————————————————————" + "\n" ) for f in range (X.shape[ 1 ]): print( "%d. ...
  • 1 分解代码1.1 最优叶子节点数与树数确定1.2 循环准备1.3 数据划分1.4 随机森林实现1.5 精度衡量1.6 变量重要程度排序1.7 保存模型2 完整代码   本文分为两部分,首先是将代码分段、详细讲解,方便大家理解;随后...
  • 本人想写一篇文章,但在模型方法上遇到一些困难,所以想求助...选用相对重要性评价变量重要性,要求实现步骤如下:(1)对所有变量计算随机森林重要性得分,按相对重要性得分降序排序(2)将变量分为N组,每组变量数...
  • 早上好我在R(randomForest,caret)中的随机林实现中使用置换重要性对变量进行排序。所有变量都是连续的,结果是明确的。在为了处理共线特性Terence Parr,Jeremy Howard和其他人更新了Python中的rfpimp包,将高度...
  •   本文详细介绍在Python中,实现随机森林(Random Forest,RF)回归与变量重要性分析、排序的代码编写与分析过程。其中,关于基于MATLAB实现同样过程的代码与实战,大家可以点击查看这篇博客1。   本文分为两...
  • # 得到特征重要性 importances = list(rf.feature_importances_) feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)] print(type(feature_...
  • 昨晚,小伙伴收到了大鱼海棠为我们带来的FigureYa182RFSurv,使用随机森林对生存数据降维,根据变量重要性排序并筛选基因组成prognostic signature。这是我们第二次众筹随机森林相关分析,上次的FigureYa159LR_RF,...
  • 随机森林模型

    2019-10-14 16:14:14
    模型构建思想 随机采样->随机特征->多棵决策树->... “随机”体现在哪里: 1)特征随机 ...2)样本随机 ...2. 随机性的引入,增加了多样性,泛化能力非常强,抗噪声能力强... (1)可得到特征重要性排序,因此可做...
  • 决策树 熵定义为信息的期望值 为了好理解 分类数目,熵越大,随机变量的不确定性就越大。 随机森林(Random Forests) 随机森林是一种重要的...训练速度快,可以得到变量重要性排序 容易实现并行化 随机森林的缺点
  • 昨晚,小伙伴收到了大鱼海棠为我们带来的FigureYa182RFSurv,使用随机森林对生存数据降维,根据变量重要性排序并筛选基因组成prognostic signature。这是我们第二次众筹随机森林相关分析,上次的FigureYa159LR_RF,...
  • 随机森林之特征选择

    2013-11-28 10:41:00
    摘要:在随机森林介绍中提到了随机森林一个重要特征:能够计算单个特征变量的重要性。并且这一特征在很多方面能够得到应用,例如在银行贷款业务中能否正确的评估一个企业的信用度,关系到是否能够有效地回收贷款。但是...
  • 根据每一个特征分类后的gini系数之和除于总特征的gini系数来计算特征重要性 ...# 显示出随机森林特征的重要性,并做条形图 rfr = RandomForestRegressor(min_samples_split=6, n_estimators=100) rfr.fit(tr...
  • 机器学习面试笔记整理6-随机森林

    千次阅读 2019-03-31 15:37:26
    机器学习面试笔记整理6-随机森林算法思想优缺点面试问题收集 算法思想 随机采样->随机特征->多棵决策树->...(1)可得到特征重要性排序,因此可做“特征选择”; (2)可处理高维特征,且不...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

随机森林重要性排序