精华内容
下载资源
问答
  • Python 随机森林特征重要度 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。 2 随机森林特征重要度简介 决策树的优点是通过树形结构以...

                               Python 随机森林特征重要度

    1 声明

    本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。

    2 随机森林特征重要度简介

    决策树的优点是通过树形结构以规则的形式查看模型的内在结构,但随机森林是由几十、上百甚至上千棵决策树组成的,这样很难再可视化查看模型的结构。但是我们可以通过随机森林查看特征的重要度。

    关于特征的重要性,需要注意两点:

    第一点scikit-learn要求我们将名义分类特征分解为多个二元特征(一种名义变量转化为数值型的常见方法 One-Hot编码);第二点如果两个特征高度相关,则会考虑其中一个特征,另外个特征将被弱化,如果不这么处理模型将难以解释。

    在scikit-learn中,分类回归决策树和随机森林可以使用特征重要性方法来查看每个特征的相对重要性。

    通过特征重要性筛选的步骤

    第一步随机森林用到所有特征建立模型,此时会计算出特征的重要性并形成特征矩阵,第二步对该该矩阵通过SelectFromModel的threshold阈值参数进行过滤,用这个模型作为最终的模型。

     

    3 随机森林特征重要度代码示例

    # 导入相关库和包
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.ensemble import RandomForestClassifier
    from sklearn import datasets
    # 装载数据
    iris = datasets.load_iris()
    features = iris.data
    target = iris.target
    # 创建随机森林模型并计算特征重要度
    randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)
    model = randomforest.fit(features, target)
    importances = model.feature_importances_
    indices = np.argsort(importances)[::-1]
    names = [iris.feature_names[i] for i in indices]
    #print(names)
    #print(range(features.shape[1]), importances[indices])
    # 画图
    plt.figure()
    from matplotlib.font_manager import FontProperties
    #设置支持中文字体
    fp= FontProperties(fname="c:/windows/fonts/simsun.ttc", size=12)
    plt.suptitle('特征重要性',fontproperties=fp)
    plt.bar(range(features.shape[1]), importances[indices])
    plt.xticks(range(features.shape[1]), names, rotation=90)
    plt.show()
    # 通过重要度的阈值筛选特征
    # 定义重要度的阈值
    selector = SelectFromModel(randomforest, threshold=0.3)
    features_important = selector.fit_transform(features, target)
    # 训练新的模型
    model = randomforest.fit(features_important, target)

    4 总结

     

     

    展开全文
  • 使用随机森林计算特征重要度

    万次阅读 2017-12-20 20:47:21
    随机森林包含很多决策树,决策树中的每一个节点是某一个特征的条件。这些条件用来将数据集分成两部分,...下面是两种计算特征重要度的方法: 1 基于sklearn的实现from sklearn.datasets import load_boston from sk

    随机森林包含很多决策树,决策树中的每一个节点是某一个特征的条件。这些条件用来将数据集分成两部分,使得每一部分的响应值归为同一个集合。最优条件的选择依据是不纯度。不纯度在分类中通常为Gini不纯度或信息增益/信息熵,对于回归问题来说是方差。
    下面是两种计算特征重要度的方法:
    1 基于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"]
    Y = boston["target"]
    names = boston["feature_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.5298, 'LSTAT'), (0.4116, 'RM'), (0.0252, 'DIS'), (0.0172, 'CRIM'), (0.0065, 'NOX'), (0.0035, 'PTRATIO'), (0.0021, 'TAX'), (0.0017, 'AGE'), (0.0012, 'B'), (0.0008, 'INDUS'), (0.0004, 'RAD'), (0.0001, 'CHAS'), (0.0, 'ZN')]

    基于不纯度对模型进行排序有几点需要注意:
    (1)基于不纯度降低的特征选择将会偏向于选择那些具有较多类别的变量(bias)。
    (2)当存在相关特征时,一个特征被选择后,与其相关的其他特征的重要度则会变得很低,因为他们可以减少的不纯度已经被前面的特征移除了。
    2 准确率降低的均值
    这种方法是直接测量每种特征对模型预测准确率的影响,基本思想是重新排列某一列特征值的顺序,观测降低了多少模型的准确率。对于不重要的特征,这种方法对模型准确率的影响很小,但是对于重要特征却会极大降低模型的准确率。
    下面是这种方法的示例:

    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/

    展开全文
  • 一、 随机森林输出特征重要度  用随机森林进行特征重要性评估的思想其实很简单,通俗来讲就是看每个特征在随机森林中的每颗树上做了多大的贡献,取平均值,然后比较特征之间的贡献大小。  常见的计算方法有两种...

    一、 随机森林输出特征重要度

           用随机森林进行特征重要性评估的思想其实很简单,通俗来讲就是看每个特征在随机森林中的每颗树上做了多大的贡献,取平均值,然后比较特征之间的贡献大小。

          常见的计算方法有两种,一种是平均不纯度的减少(mean decrease impurity),常用gini /entropy /information gain测量,现在sklearn中用的就是这种方法;另一种是平均准确率的减少(mean decrease accuracy),常用袋外误差率去衡量。

           平均不纯度计算以gini指数为例:将变量重要性评分(variable importance measures)用VIM来表示,将Gini指数用GI来表示,假设有m个特征X1,X2,X3,...,Xc,现在要计算出每个特征Xj的Gini指数评分VIM_j^{(Gini)},亦即第j个特征在RF所有决策树中节点分裂不纯度的平均改变量。

    Gini指数的计算公式为

                                                                 GI_m=\sum_{k=1}^{|K|}\sum_{k' \neq k } p_{mk} p_{mk'}=1-\sum_{k=1}^{|K|}p_{mk}^2

    其中,K表示有K个类别,pmk表示节点m中类别k所占的比例。 直观地说,就是随便从节点m中随机抽取两个样本,其类别标记不一致的概率。 特征Xj在节点m的重要性,即节点m分枝前后的Gini指数变化量为

                                                                       VIM_{jm}^{(Gini)}=GI_m-GI_l-GI_r

    其中,GI_lGI_r分别表示分枝后两个新节点的Gini指数。 
    如果,特征Xj在决策树ii中出现的节点在集合M中,那么Xj在第i颗树的重要性为 

                                                                     VIM_{ij}^{(Gini)}=\sum_{m \in M}VIM_{jm}^{(Gini)}

    假设RF中共有n颗树,那么              

                                                                     VIM_j^{(Gini)}=\sum_{i=1}^{n}VIM_{ij}^{(Gini)}

    最后,把所有求得的重要性评分做一个归一化处理即可:

                                                                       VIM_j=\dfrac{VIM_j}{\sum_{i=1}^cVIM_i}

          平均准确率的减少(mean decrease accuracy)即对每个特征加躁,看对结果的准确率的影响。影响小说明这个特征不重要,反之重要,具体步骤如下:
    1、对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1.
    2、随机地对袋外数据OOB所有样本的特征X加入噪声干扰(即随机的改变样本在特征X处的值),再次计算它的袋外数据误差,记为errOOB2.
    3、假设随机森林中有Ntree棵树,那么对于特征X的重要性=∑(errOOB2-errOOB1)/Ntree,之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入噪声之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

    风险:随机森林的变量重要性衡量的并不完全是变量对目标变量预测的贡献能力,而是在这个模型中对目标变量预测的贡献能力,所以单纯用来评价变量的重要性值得探究。例如:我们有A和B两个变量,且A和B之间有较强的相关性,如果A对模型贡献度较大,由于B很像A,所以B也应该对模型贡献较大,但实际上若在随机森林中输出A的特征重要度得分高,B得分往往会很低。

    二、逻辑回归计算特征重要度

    变量贡献率,反应各自变量对因变量影响程度的相对大小,计算步骤如下:

     1. 对所有自变量标准化;

     2. 对标准化后的自变量建逻辑回归模型,取各变量回归系数的绝对值;

     3. 计算各变量回归系数绝对值的占比即为特征贡献率。

     

     

    参考:

    1. https://blog.csdn.net/zjuPeco/article/details/77371645?utm_source=copy

    2. https://blog.csdn.net/code_caq/article/details/74066899?utm_source=copy

    3. https://zhuanlan.zhihu.com/p/29408863

    展开全文
  • 五、特征重要度 作为单个的决策树模型,在模型建立时实际上是寻找到某个特征合适的分割点。这个信息可以作为衡量所有特征重要性的一个指标。 基本思路如下:如果一个特征被选为分割点的次数越多,那么这个特征的重要...

    01 集成学习 - 概述、Bagging - 随机森林、袋外错误率

    五、特征重要度

    作为单个的决策树模型,在模型建立时实际上是寻找到某个特征合适的分割点。这个信息可以作为衡量所有特征重要性的一个指标。

    基本思路如下:
    如果一个特征被选为分割点的次数越多,那么这个特征的重要性就越强。这个理念可以被推广到集成算法中,只要将每棵树的特征重要性进行简单的平均即可。


    分别根据特征1和特征4进行分割,显然x1出现的次数最多,这里不考虑先分割和后分割的情况,只考虑每次分割属性出现的次数。

    计算得:
    x1的特征重要度:出现在2棵树上,两棵树一共分裂了6次,x1出现了3次。
    x1特征重要度 = 3/6 = 1/2
    x2的特征重要度= 4/6 = 2/3
    x3的特征重要度= 3/6 = 1/2
    x4的特征重要度: 出现在1棵树上,一个树分裂了3次,x4出现了1次。
    x4的特征重要度= 1/3

    根据特征重要度进行特征选择。


    六、随机森林RF推广算法

    随机森林推广算法的作用不是在于做预测。

    RF推广算法在实际应用中占有比较好的特性,应用比较广泛,主要应用在:分类、回归、特征转换、异常点检测等。常见的RF变种算法如下:Extra Tree、Totally Random Tree Embedding(TRTE)、Isolation Forest

    1、Extra Tree

    Extra Tree是随机森林(RF)的一个变种,原理基本和随机森林一样,区别如下:
    1、RF会随机采样来作为子决策树的训练集,而Extra Tree每个子决策树采用原始数据集训练。
    2、RF在选择划分特征点的时候会和传统决策树一样,会基于信息增益、信息增益率、基尼系数、均方差等原则来选择最优的特征值。Extra Tree则是随机选择一个特征值来划分决策树。

    由于Extra Tree是随机选择特征点进行划分,所以最后得到的决策树规模会大于RF生成的决策树,Extra Tree决策树的方差会减少,泛化能力比RF更强。

    2、Totally Random Tree Embedding(TRTE)

    TRTE 是一种非监督的数据转化方式。将低维的数据集映射到高维,从而让高维的数据更好得用于分类回归模型。

    TRTE的算法的转化过程类似于RF算法,建立T个决策树来拟合数据。当决策树构建完成之后,数据集里的每个数据在T个决策树中叶子节点的位置就固定下来了,将位置信息转换为向量即完成了算法的转换。

    有3棵决策树,每棵树都有五个叶子节点: □-□-□-□-□
    一个数据 x
    划分落入树1的第三个子节点:□-□-■-□-□ => 00100
    划分落入树2的第一个子节点:■-□-□-□-□ => 10000
    划分落入树3的第五个子节点:□-□-□-□-■ => 00001
    数据x的特征映射码:(0,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1)

    样本根据TRTE进行转化特征,最后可能得到更高维的数据,也可能得到更低维的数据,如词袋法中的特征有2000个,做完TRTE后只剩下几百个。

    经过TRTE转化后的编码可以用于无监督的分类操作,将相似的特征码聚类到一起,最后完成分类的操作。

    3、Isolation Forest (IForest)

    __IForest__是一种异常点检测算法,使用类似RF的方式来检测异常点。
    IForest和RF的区别在于:
    1、在随机采样的过程中,一般只需要少量的数据。
    2、在进行决策树的构建过程中,IForest会随机选择一个划分特征,并对划分特征随机选择一个划分阈值。
    3、IForest的划分深度是比较小的,即max_depth较小。
    区分原因:目的是异常点检测,所以只要能够区分出异常即可,不需要大量的数据;此外在异常点检测过程中,一般也不需要太大规模的决策树。

    下面说说 __IForest__为什么可以做异常点判断。

    __对于异常点的判断:__将测试样本x拟合到T棵决策树上,计算每棵树上该样本的叶子节点的深度ht(x),从而计算出平均深度h(x);然后就可以使用下列公式计算样本点x的异常概率值,p(x,m)的取值范围为[0,1],越接近1,说明异常点概率越大。
    ¶是欧拉常数,m为样本个数

    分析: 欧拉常数 ζ ≈ 0.57721566490153286060651209。当样本个数m确定的时候,c(m) 是一个定值。所以影响异常点出现的概率-p(x,m)的值,我们只考虑h(x)的取值即可。
    h(x)即每棵树上,该样本的叶子节点深度的平均值。h(x)越大说明叶子节点的深度越深,公式右侧 - 2的指数就越小,则说明p(x,m)的值越趋向于0。
    结论: 叶子节点的深度越深,异常点的概率越小。树平均深度越浅,说明异常值概率越大。

    七、RF随机森林总结

    RF的主要优点:
    1、训练可以并行化,对于大规模样本的训练具有速度的优势。
    2、由于进行随机选择决策树划分特征列表,这样在样本维度比较高的时候,仍然具有比较高的训练性能。
    3、可以给出各个特征值的重要性列表。
    4、由于存在随机抽样,训练出来的模型方差小,泛化能力强。
    5、RF实现简单。
    6、对于部分特征的丢失不敏感。

    RF的缺点:
    1、噪音过大的特征上,容易过拟合。
    2、取值比较多的划分特征对RF的决策会产生更大的影响,从而有可能影响模型的效果。

    展开全文
  • 前面的话:因为项目原因,需要特征选择,随机森林有自带的重要度属性,但是我需要观察前0.9(此处理解为能包含重要度之和为0.9的前几项特征为比较重要的,例如:20个特征可以包含重要度之和0.9,八个特征包含重要度0.1...
  • 一句话介绍随机森林是一种集成算法(Ensemble Learning),它属于Bagging类型,通过组合多个弱分类器,最终结果通过投票或取均值,使得整体模型的结果具有较高的精确和泛化性能。其可以取得不错成绩,主要归功于...
  • 随机森林特征选择

    2013-11-28 10:41:00
    摘要:在随机森林介绍中提到了随机森林一个重要特征:能够计算单个特征变量的重要性。并且这一特征在很多方面能够得到应用,例如在银行贷款业务中能否正确的评估一个企业的信用... 一:特征重要性 在随机森林中某个特...
  • 随机森林进行特征重要性评估的思想比较简单,主要是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献大小。贡献的衡量指标包括:基尼指数(gini)、袋外数据(OOB)错误...
  • 随机森林进行特征重要性评估的思想比较简单,主要是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献大小。贡献的衡量指标包括:基尼指数(gini)、袋外数据(OOB)错误...
  • 随机森林特征选择

    万次阅读 2017-05-14 14:36:33
    关于随机森林的介绍,...对于随机森林中的一颗决策树,其训练数据集是使用Bagging方法得到的,即套袋法,还有大约1/3的袋外数据我们可以用它进行特征重要性的度量,假设针对某个特征X,我们利用套袋法建立了一颗决策
  • 利用随机森林特征选择

    千次阅读 2017-06-21 14:25:54
    摘要:在随机森林介绍中提到了随机森林一个重要特征:能够计算单个特征变量的重要性。并且这一特征在很多方面能够得到应用,例如在银行贷款业务中能否正确的评估一个企业的信用,关系到是否能够有效地回收贷款。但是...
  • 利用随机森林进行特征选择

    千次阅读 2018-09-15 19:29:39
    之所以可以利用随即森立来进行特征筛选是由于决策树的特性,因此我们可以利用所有决策树得到的平均不纯度(基尼...根据重要性可以剔除相关很低的特征,精简模型。 接下来直接进入代码: import pandas as pd ...
  • RandomForest特征重要度问题

    千次阅读 2019-08-26 15:10:06
    在构建随机森林的过程中,每一颗树所使用的数据不同,这使得每一颗树上的特征重要性表现的都不同。所以要评估每个特征在每棵树上的重要度来...随机森林衡量特征重要度的方法主要有两种,分别是Gini系数,和袋外误差率。
  • 特征选择 GBDT 特征重要度

    万次阅读 2017-05-12 11:50:24
    Tree ensemble算法的特征重要度计算 集成学习因具有预测精度高的优势而受到广泛关注,尤其是使用决策树作为基学习器的集成学习算法。树的集成算法的著名代码有随机森林和GBDT。随机森林具有很好的抵抗过拟合...
  • 包括最大吸收深度D、吸收谷右面积Ra、吸收谷左面积La、吸收谷总面积A、面积归一化最大吸收深度DA和对称S, 将反射光谱水分吸收特征与SMC进行相关性分析,通过随机森林方法对光谱水分吸收特征参数进行分类,获取各...
  • 针对随机森林(RF)在高维空间特征选择过程中计算繁琐和内存开销大、分类准确率低等问题, 提出了基于二分搜索(BS)结合修剪随机森林(RFP)的特征选择算法(BSRFP); 该算法首先根据纯度基尼指数获取特征重要性评分, 删除...
  • 学习唐宇迪老师的机器学习课程——基于随机森林做回归任务 这是一个天气最高温度预测任务。 通常想法是训练出随机森林,然后因为是做回归任务,那么取叶子节点中样本的平均值作为预测值 (如果是分类任务就是取...
  • 机器学习--随机森林

    2020-03-26 23:55:30
    机器学习--随机森林机器学习--随机森林随机森林作用1.计算特征重要度2.检测异常值 机器学习–随机森林 随机森林作用 1.计算特征重要度 2.检测异常值 未完待续。。。 ...
  • 任务:利用随机森林法和随机逻辑回归法对数据特征的重要程度进行排序——因子重要度审查 1、获取数据 数据可以是多种形式存储的,可能是txt或者csv,如果是txt的可以先转换为dataframe数据格式写入csv文件(最好是...
  • 特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。并且常能听到“数据和...
  • 在特征选择的许多方法中,我们可以使用随机森林模型中的特征重要属性来筛选特征,并得到其与分类的相关性。 由于随机森林存在的固有随机性,该模型可能每次给予特征不同的重要性权重。但是通过多次训练该模型,即...
  • 特征重要性和特征提取时间为衡量标准,对深度图像中的各遮挡相关特征进行了分析评估,在此基础上,选取平均深度差、最大深度差、平均曲率、高斯曲率和深度值离散5种特征用于设计遮挡检测分类器;一种新的遮挡...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

随机森林特征重要度