精华内容
下载资源
问答
  • 利用随机森林对特征重要性进行评估

    万次阅读 多人点赞 2017-08-18 16:22:48
    随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能,因此,...本文是对随机森林如何用在特征选择上做一个简单的介绍。

    1 前言

    随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能,因此,随机森林也被誉为“代表集成学习技术水平的方法”。

    本文是对随机森林如何用在特征选择上做一个简单的介绍。

    2 随机森林(RF)简介

    只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:

    1. 用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集
    2. 用抽样得到的样本集生成一棵决策树。在生成的每一个结点:
    • 随机不重复地选择d个特征
    • 利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数、增益率或者信息增益判别)
    1. 重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。
    2. 用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。

    下图比较直观地展示了随机森林算法(图片出自文献2):

    随机森林算法

    图1:随机森林算法示意图

    没错,就是这个到处都是随机取值的算法,在分类和回归上有着极佳的效果,是不是觉得强的没法解释~

    然而本文的重点不是这个,而是接下来的特征重要性评估。

    3 特征重要性评估

    现实情况下,一个数据集中往往有成百上前个特征,如何在其中选择比结果影响最大的那几个特征,以此来缩减建立模型时的特征数是我们比较关心的问题。这样的方法其实很多,比如主成分分析,lasso等等。不过,这里我们要介绍的是用随机森林来对进行特征筛选。

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

    好了,那么这个贡献是怎么一个说法呢?通常可以用基尼指数(Gini index)或者袋外数据(OOB)错误率作为评价指标来衡量。

    我们这里只介绍用基尼指数来评价的方法,想了解另一种方法的可以参考文献2。

    我们将变量重要性评分(variable importance measures)用VIMVIM来表示,将Gini指数用GIGI来表示,假设有mm个特征X1X2X3...XcX_1,X_2,X_3,...,X_c,现在要计算出每个特征XjX_j的Gini指数评分VIMj(Gini)VIM_j^{(Gini)},亦即第jj个特征在RF所有决策树中节点分裂不纯度的平均改变量。

    Gini指数的计算公式为

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

    其中,KK表示有KK个类别,pmkp_{mk}表示节点mm中类别kk所占的比例。

    直观地说,就是随便从节点mm中随机抽取两个样本,其类别标记不一致的概率。

    特征XjX_j在节点mm的重要性,即节点mm分枝前后的GiniGini指数变化量为

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

    其中,GIlGI_lGIrGI_r分别表示分枝后两个新节点的GiniGini指数。

    如果,特征XjX_j在决策树ii中出现的节点为集合MM,那么XjX_j在第ii颗树的重要性为

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

    假设RFRF中共有nn颗树,那么

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

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

    VIMj=VIMji=1cVIMiVIM_j=\dfrac{VIM_j}{\sum_{i=1}^cVIM_i}

    4 举个例子

    值得庆幸的是,sklearnsklearn已经帮我们封装好了一切,我们只需要调用其中的函数即可。

    我们以UCI上葡萄酒的例子为例,首先导入数据集。

    import pandas as pd
    url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
    df = pd.read_csv(url, header = None)
    df.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 
                  'Alcalinity of ash', 'Magnesium', 'Total phenols', 
                  'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 
                  'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline']
    

    然后,我们来大致看下这时一个怎么样的数据集

    import numpy as np
    np.unique(df['Class label'])
    

    输出为

    array([1, 2, 3], dtype=int64)
    

    可见共有3个类别。然后再来看下数据的信息:

    df.info()
    

    输出为

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 178 entries, 0 to 177
    Data columns (total 14 columns):
    Class label                     178 non-null int64
    Alcohol                         178 non-null float64
    Malic acid                      178 non-null float64
    Ash                             178 non-null float64
    Alcalinity of ash               178 non-null float64
    Magnesium                       178 non-null int64
    Total phenols                   178 non-null float64
    Flavanoids                      178 non-null float64
    Nonflavanoid phenols            178 non-null float64
    Proanthocyanins                 178 non-null float64
    Color intensity                 178 non-null float64
    Hue                             178 non-null float64
    OD280/OD315 of diluted wines    178 non-null float64
    Proline                         178 non-null int64
    dtypes: float64(11), int64(3)
    memory usage: 19.5 KB
    

    可见除去class label之外共有13个特征,数据集的大小为178。

    按照常规做法,将数据集分为训练集和测试集。

    from sklearn.cross_validation import train_test_split
    from sklearn.ensemble import RandomForestClassifier
    x, y = df.iloc[:, 1:].values, df.iloc[:, 0].values
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)
    feat_labels = df.columns[1:]
    forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
    forest.fit(x_train, y_train)
    

    好了,这样一来随机森林就训练好了,其中已经把特征的重要性评估也做好了,我们拿出来看下。

    importances = forest.feature_importances_
    indices = np.argsort(importances)[::-1]
    for f in range(x_train.shape[1]):
        print("%2d) %-*s %f" % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))
    

    输出的结果为

     1) Color intensity                0.182483
     2) Proline                        0.158610
     3) Flavanoids                     0.150948
     4) OD280/OD315 of diluted wines   0.131987
     5) Alcohol                        0.106589
     6) Hue                            0.078243
     7) Total phenols                  0.060718
     8) Alcalinity of ash              0.032033
     9) Malic acid                     0.025400
    10) Proanthocyanins                0.022351
    11) Magnesium                      0.022078
    12) Nonflavanoid phenols           0.014645
    13) Ash                            0.013916
    

    对的就是这么方便。

    如果要筛选出重要性比较高的变量的话,这么做就可以

    threshold = 0.15
    x_selected = x_train[:, importances > threshold]
    x_selected.shape
    

    输出为

    (124, 3)
    

    瞧,这不,帮我们选好了3个重要性大于0.15的特征了吗~

    5 参考文献

    [1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.
    [2] 杨凯, 侯艳, 李康. 随机森林变量重要性评分及其研究进展[J]. 2015.

    展开全文
  • 下面从以下几个方面介绍特征重要性:1 特征重要性概念2 特征重要性方法2.1 系数作为特征重要性2.2 决策树特征重要性2.3 排列特征重要性2.4 重要特征选取1 特征重要性概念特征重要性指的是为预测建模中的输入特征分配...

    8cc9c77ac852a117be2403432f719ed8.png

    特征重要性指的是根据输入特征在预测目标变量时的有用程度给它们打分的技术。

    计算特征重要性的方法很多,如统计上的相关系数,线性模型的相关系数、决策树和排列重要性分数。

    下面从以下几个方面介绍特征重要性: 

    • 1 特征重要性概念

    • 2 特征重要性方法

      • 2.1 系数作为特征重要性

      • 2.2 决策树特征重要性

      • 2.3 排列特征重要性

      • 2.4 重要特征选取

    1 特征重要性概念

    特征重要性指的是为预测建模中的输入特征分配分数的一种技术,即表示每个特征在进行预测时的相对重要性。

    在数值预测(回归)和标签预测(分类)中,可以计算特征重要性得分。

    重要性得分在预测建模型中,可以使我们更好的理解数据和模型以及减少输入特征数。

    特征重要性得分在预测建模中具有重要的作用:

    • 提供对数据的洞察。相对得分可以突出哪些特征与目标最相关以及哪些特征与目标最不相关。领域专家可能会对此进行解释,并将其用作收集更多或不同数据的基础。
    • 提供对模型的洞察。多数重要性得分是通过预测模型在数据集上的拟合计算得到的。通过对重要性得分检查,可以深入了解特定模型,以及在进行预测时,哪些特征对模型来说是最重要的,哪些是最不重要的。这可以作为模型支持它的模型解释。
    • 为降维和特征选择提供依据,从而提高预测模型的效率和有效性。这可以通过重要性得分来选择要删除的特征(最低分)或要保留的特征(最高分)来实现。这是一种特征选择,可以简化用于建模的问题,加快建模过程(删除特征称为降维),在某些情况下,还可以提高模型的性能。

    通常,我们希望量化预测因素(特征)和结果之间的关系强度。在筛选时,对预测因素排名(ranking)是很有用的。

    特征重要性得分可用于包裹模型(wrapper model),例如SelectFromModel类[1],来执行特征选择。

    2 特征重要性方法

    首先准备数据:

    from sklearn.datasets import make_classification, make_regression# 创建分类数据集,5个有用特征,5个无用特征
    X_class,y_class=make_classification(n_samples=1000,n_features=10,n_informative=5,n_redundant=5,random_state=1)
    X_reg,y_reg=make_regression(n_samples=1000,n_features=10,n_informative=5,random_state=1)

    2.1 系数作为特征重要性

    线性机器学习算法拟合的模型的预测是输入值的加权和,如线性回归、逻辑回归、加入正则项的岭回归、套索回归和弹性网络。

    所有这些算法都是通过找到一组系数用于加权和,然后用于预测。这些系数可以直接用作特征重要性评分的一种粗略类型。

    下面看一下如何使用系数作为分类和回归的重要特征。我们将在数据集上拟合一个模型来找到系数,然后总结每个输入特征的重要性分数,最后创建一个条形图来了解这些特征的相对重要性。

    # 系数作为特征重要性from sklearn.linear_model import LinearRegression,LogisticRegressionimport matplotlib.pyplot as plt# 定义函数def plot_importance(model,X,y):
        model.fit(X,y)
        importance=model.coef_if importance.ndim==2:importance=importance[0]for i,v in enumerate(importance):
            print('Feature: %0d, Score: %.5f'%(i,v))  
        plt.bar([*range(len(importance))],importance)    
        plt.show()# 1 线性回归特征重要性# 在回归数据集上拟合线性回归模型,并检索coeff_属性,该属性包含为每个输入变量找到的系数# 这些系数可以为粗略的特征重要性评分提供依据。这假设输入变量具有相同的比例,或者在拟合模型之前已经进行了比例调整。
    model = LinearRegression()
    plot_importance(model,X_reg,y_reg) # 选出了5个重要特征# 2 逻辑回归# 输入数据已进行比例调整
    model = LogisticRegression()
    plot_importance(model,X_class,y_class) # 看不出哪个重要#这是类0和1的分类问题。系数是正的和负的。#正的分数表示预测类别1的特征,负的分数表示预测类别0的特征。

    1bcddd9e7b68e897b35f3e64806342ca.png
    c0bdd78482dc59cf933c2eb6dff80d48.png

    2.2 决策树特征重要性

    决策树算法,如分类和回归树(CART),在用于选择分割点的准则如基尼指数或熵的减少的基础上提供重要性得分。

    # 决策树、随机森林,XGBoost重要性from sklearn.tree import DecisionTreeClassifier,DecisionTreeRegressorfrom sklearn.ensemble import RandomForestClassifier,RandomForestRegressorfrom xgboost import XGBRegressor,XGBClassifier# 定义函数def plot_importance(model,X,y):
        model.fit(X,y)
        importance=model.feature_importances_if importance.ndim==2:importance=importance[0]for i,v in enumerate(importance):
            print('Feature: %0d, Score: %.5f'%(i,v))  
        plt.bar([*range(len(importance))],importance)    
        plt.show()# 1 CART特征重要性# 1.1 回归
    model = DecisionTreeRegressor()
    plot_importance(model,X_reg,y_reg) # 选出了3个重要特征# 1.2 分类
    model = DecisionTreeClassifier()
    plot_importance(model,X_class,y_class) # 选出了4个重要特征# 2 随机森林# 2.1 回归
    model = RandomForestRegressor()
    plot_importance(model,X_reg,y_reg) # 选出了2-3个重要特征# 2.2 分类
    model = RandomForestClassifier()
    plot_importance(model,X_class,y_class) # 选出了2-3个重要特征# 3 XGBoost# 3.1 回归
    model = XGBRegressor()
    plot_importance(model,X_reg,y_reg) # 选出了2-3个重要特征# 3.2 分类
    model = XGBClassifier()
    plot_importance(model,X_class,y_class) # 选出了7个重要特征

    1f48a1e767debd7750948ecca99a4806.png
    cba2e7fcab951497191122dc07bf77d8.png
    12b2d86575e4befcdd69aa57b86c877b.png
    ce10a07ff847fe0038cd3765da6c7f50.png
    c5a009cad05e318bd9f1d18248105021.png
    c8328564adbfa1fa4a1c54d3b246732f.png

    2.3 排列特征重要性

    排列特征重要性(permutation feature importance )[2]是一种计算相对重要性分数的技术,独立于所使用的模型。

    首先模型对数据进行拟合,该模型自身不支持特征重要性评分。然后,该模型对数据集进行预测,但是数据集中的某一个特征的值被打乱。对数据集中的每个特征都重复此操作。然后整个过程重复3,5,10或更多次。每个输入特征的平均重要性分数(以及给定重复的分数分布)作为结果。

    该方法可用于回归和分类,但需要提供一个性能指标作为重要性评分的基础,如回归的均方误差和分类的准确率。

    # 排列特征重要性# 模型选用不支持特征选择的KNNfrom sklearn.inspection import permutation_importancefrom sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor# 定义函数def plot_importance(model,X,y,scoring):
        model.fit(X,y)
        results=permutation_importance(model,X,y,scoring=scoring)
        importance=results.importances_meanif importance.ndim==2:importance=importance[0]for i,v in enumerate(importance):
            print('Feature: %0d, Score: %.5f'%(i,v))  
        plt.bar([*range(len(importance))],importance)    
        plt.show()# 1 回归
    model = KNeighborsRegressor()
    plot_importance(model,X_reg,y_reg,scoring='neg_mean_squared_error'# 选出了2-3个重要特征# 2 分类
    model = KNeighborsClassifier()
    plot_importance(model,X_class,y_class,scoring='accuracy'# 选出了2-3个重要特征

    1baad709ec9e47bd7174d5a01771927e.png
    45fb6ac4d3974fc6b5bfd87fb22060c7.png

    2.4 重要特征选取

    特征重要性得分可以用来解释数据,但也可以直接用来排序和选择对预测建模最有用的特征。

    用下面的列子进行说明。

    # 1 用所有特征建模并评估模型表现from sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.feature_selection import SelectFromModel
    X_train,X_test,y_train,y_test=train_test_split(X_class,y_class,test_size=0.33,random_state=1)
    model=LogisticRegression(solver='liblinear')
    model.fit(X_train,y_train)
    yhat=model.predict(X_test)
    accuracy=accuracy_score(y_test,yhat)
    print('Accuracy: %.2f'%(accuracy*100))# 2 从模型中进行特征选择
    fs=SelectFromModel(RandomForestClassifier(n_estimators=200),max_features=5)# 特征选择方法对训练数据进行拟合,然后计算所有输入特征的重要性得分并排序最后选取特征# learning relationship from training datda
    fs.fit(X_train,y_train)# transform train input data
    X_train_fs=fs.transform(X_train)# transform test input data
    X_test_fs=fs.transform(X_test)
    model=LogisticRegression(solver='liblinear')
    model.fit(X_train_fs,y_train)
    yhat=model.predict(X_test_fs)
    accuracy=accuracy_score(y_test,yhat)
    print('Accuracy: %.2f'%(accuracy*100))# Accuracy: 84.55# Accuracy: 84.55

    可以看到模型在数据集上取得了相同的性能,尽管只有一半的输入特征。正如预期的那样,随机森林计算出的特征重要性得分允许我们对输入特征进行排序,并删除那些与目标变量无关的特征。

    参考资料

    [1]

    SelectFromModel类: https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html

    [2]

    排列特征重要性: https://scikit-learn.org/stable/modules/permutation_importance.html

    31aa4fceadc998bfcd5cabb351a86a59.png

    展开全文
  • feature_importance的特征重要性There are indeed several ways to get feature "importances". As often, there is no strict consensus about what this word means.In scikit-learn, we implement the importance...

    feature_importance的特征重要性

    There are indeed several ways to get feature "importances". As often, there is no strict consensus about what this word means.

    In scikit-learn, we implement the importance as described in [1] (often cited, but unfortunately rarely read...). It is sometimes called "gini importance" or "mean decrease impurity" and is defined as the total decrease in node impurity (weighted by the probability of reaching that node (which is approximated by the proportion of samples reaching that node)) averaged over all trees of the ensemble.

    In the literature or in some other packages, you can also find feature importances implemented as the "mean decrease accuracy".

    Basically, the idea is to measure the decrease in accuracy on OOB data when you randomly permute the values for that feature. If the decrease is low, then the feature is not important, and vice-versa.

    (Note that both algorithms are available in the randomForest R package.)

    [1]: Breiman, Friedman, "Classification and regression trees", 1984.

    其实sklearn的作者说并没有给出feature importance的具体定义。

    feature importance有两种常用实现思路:

    (1) mean decrease in node impurity:

    feature importance is calculated by looking at the splits of each tree.

    The importance of the splitting variable is proportional to the improvement to the gini index given by thatsplit and it is accumulated (for each variable) over all the trees in the forest.

    就是计算每棵树的每个划分特征在划分准则(gini或者entropy)上的提升,然后对聚合所有树得到特征权重

    (2) mean decrease in accuracy:

    This method, proposed in the original paper, passes the OOB samples down the tree and records prediction accuracy.

    A variable is then selected and its values in the OOB samples are randomly permuted. OOB samples are passed down the tree and accuracy is computed again.

    A decrease in accuracy obtained by this permutation is averaged over all trees for each variable and it provides the importance of that variable (the higher the decreas the higher the importance).

    简单来说,如果该特征非常的重要,那么稍微改变一点它的值,就会对模型造成很大的影响。

    自己造数据太麻烦,可以直接在OOB数据集对该维度的特征数据进行打乱,重新训练测试,打乱前的准确率减去打乱后的准确率就是该特征的重要度。该方法又叫permute。

    以random forest为例

    以random forest为例,feature importance特性有助于模型的可解释性。简单考虑下,就算在解释性很强的决策树模型中,如果树过于庞大,人类也很难解释它做出的结果。

    随机森林通常会有上百棵树组成,更加难以解释。好在我们可以找到那些特征是更加重要的,从而辅助我们解释模型。更加重要的是可以剔除一些不重要的特征,降低杂讯。比起pca降维后的结果,更具有人类的可理解性。

    sklearn中实现的是第一种方法【mean decrease in node impurity】实现的。使用iris数据集我们来看下效果。

    首先,对于单棵决策树,权重是怎么计算的呢?

    iris = load_iris()

    X = iris.data

    y = iris.target

    dt = DecisionTreeClassifier(criterion='entropy', max_leaf_nodes=3)

    dt.fit(X, y)

    使用Graphviz画出生成的决策树

    sklearn中tree的代码是用Cython编写的,具体这部分的源码在compute_feature_importances方法中

    根据上面生成的树,我们计算特征2和特征3的权重

    特征2: 1.585*150 - 0*50 - 1.0*100 = 137.35

    特征3: 1.0*100 - 0.445*54 - 0.151*46 = 69.024

    归一化之后得到[0, 0, 0.665, 0.335] 我们算的结果和sklearn输出的结果相同。

    得到每课树的特征重要度向量之后,就加和平均得到结果,具体代码如下:

    def feature_importances_(self):"""Return the feature importances (the higher, the more important the

    feature).

    Returns-------feature_importances_ : array, shape=[n_features]""" check_is_fitted(self, 'n_outputs_')if self.estimators_ is None or len(self.estimators_) == 0:

    raise ValueError("Estimator not fitted,"

    "call `fit` before `feature_importances_`.")

    all_importances= Parallel(n_jobs=self.n_jobs, backend="threading")(

    delayed(getattr)(tree,'feature_importances_')for tree inself.estimators_)

    returnsum(all_importances) / len(self.estimators_)

    View Code

    利用permutation importance挑选变量

    为什么引入置换重要性:

    决策树适合于寻找也可以解释的非线性预测规则,尽管它们的不稳定性和缺乏平滑性引起了人们的关注(Hastie等,2001)。RandomForest(RF; Breiman,2001)分类器旨在克服这些问题,并且由于将决策树的可解释性与现代学习算法(例如人工神经网络和SVM)的性能相结合而受到广泛欢迎。RF的作者提出了两种用于特征排名的度量,即变量重要性(VI)和基尼重要性(GI)。最近的一项研究表明,如果预测变量是分类的,则这两种方法都偏向于采用更多类别的变量(Strobl等,2007)。这篇文章的作者将偏爱归因于使用bootstrap采样和吉尼分裂准则来训练分类树和回归树(CART; Breiman等,1984)。在文献中,多年来已经报道了由基尼系数引起的偏差(Bourguignon,1979; Pyatt等,1980)。),并且通常不仅会影响分类变量,还会影响分组变量(即,将变量聚类的值分成多个独立的组,例如多峰高斯分布)。在生物学中,预测因子通常具有分类或分组的值(例如,微阵列和序列突变)。Strobl等。(2007)提出了一种新的算法(cforest),用于基于条件推理树构建RF模型(Hothorn等,2006),并计算可校正偏差的VI值。

    关于生物学数据的学习通常具有大量特征和少量可用样本的特征。通常的做法是在模型拟合之前滤除不重要的特征,例如,通过拒绝与结果最少相关的特征。互信息(MI)是在这种情况下经常使用的一种关联度量(Guyon和Elisseeff,2003年)。它与基尼指数密切相关,并且事实证明,它也偏向于具有更多类别的变量(Achard等,2005)。

    们在构建树类模型(XGBoost、LightGBM等)时,如果想要知道哪些变量比较重要的话。可以通过模型的feature_importances_方法来获取特征重要性。

    例如LightGBM的feature_importances_可以通过特征的分裂次数或利用该特征分裂后的增益来衡量。一般情况下,不同的衡量准则得到的特征重要性顺序会有差异。

    一般是通过多种评价标准来交叉选择特征,当一个特征在不同的评价标准下都是比较重要的,那么该特征对label有较好的预测能力。

    为大家介绍一种评价特征重要性的方法:PermutationImportance。

    文档对该方法介绍如下:

    eli5 provides a way to compute feature importances for any black-box estimator by measuring how score decreases when a feature is not available;

    the method is also known as “permutation importance” or “Mean Decrease Accuracy (MDA)”.

    若将一个特征置为随机数,模型效果下降很多,说明该特征比较重要;反之则不是。

    下面为大家举一个简单的例子,我们利用不同模型来挑选变量(RF、LightGBM、LR)。并挑选出来重要性排在前30的变量(总变量200+)进行建模。

    参考博客:

    展开全文
  • 特征重要性评估

    2020-07-07 09:37:11
    1、gbdt、xgb 特征重要性源码解释:https://zhuanlan.zhihu.com/p/64759172 2、shap对xgboost特征重要性评估 https://zhuanlan.zhihu.com/p/64799119

    1、分类树特征重要性

    参考:gbdt、xgb 特征重要性源码解释https://zhuanlan.zhihu.com/p/64759172

    importance_type指importance的计算类型;可取值有5个:

    • weight
      权重(某特征在整个树群节点中出现的次数,出现越多,价值就越高)
    • gain
      (某特征在整个树群作为分裂节点的信息增益之和再除以某特征出现的频次)
    • total_gain
      (同上,代码中有介绍,这里total_gain就是gain)
    • cover和total_cover
      cover比较复杂,是指某特征节点样本的二阶导数和再除以某特征出现的频次

    原始的get_score()方法只是输出按照weight、gain、cover计算的统计值,为了得到百分比形式,将feature_importance_中特征归一化,分母为所有特征的重要性统计量之和。

    注意:xgboost sklearn API在计算特征重要性的时候默认importance_type=“gain”,而原始的get_score方法默认importance_type=“weight”

    2、回归树 特征重要性

    gbdt是根据分裂前后节点的impurity减少量来评估特征重要性;impurity计算和节点的分裂标准是MSE或MAE
    步骤:
    i 遍历每个节点,该节点对应分裂特征重要性统计量=分裂前impurity减去分裂后左右二叉树impurity之和
    ii 计算impurity的差值时,每个impurity都乘以对应权重(分支的样本数)
    iii 一个特征在树中可以被用来多次分裂,基于上一步的数据,等同于这里按照特征groupby后对其重要性统计量求和

    3、利用SHAP解释Xgboost模型

    https://zhuanlan.zhihu.com/p/64799119

    展开全文
  • 用xgboost模型对特征重要性进行排序

    万次阅读 多人点赞 2018-08-12 21:08:21
    用xgboost模型对特征重要性进行排序 在这篇文章中,你将会学习到: xgboost对预测模型特征重要性排序的原理(即为什么xgboost可以对预测模型特征重要性进行排序)。 如何绘制xgboost模型得到的特征重要性条形图。...
  • 随机森林计算特征重要性The feature importance describes which features are relevant. It can help with a better understanding of the solved problem and sometimes lead to model improvement by utilizing ...
  • 1 特征重要性​度量计算某个特征X的重要性时,具体步骤如下:1)对每一颗决策树,选择相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1.所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个...
  • 我正在努力从我的随机森林回归器中找出特征重要性,我得到一个:AttributeError: 'GridSearchCV' object has no attribute'feature_importances_'.有人知道为什么没有属性吗?根据文件应该存在这个属性吗?在完整...
  • 当涉及到决策树时,特征重要性不是一个黑匣子。来自DecisionTreeRegressor的文档:The importance of a feature is computed as the (normalized) totalreduction of the criterion brought by that feature. It is ...
  • 问题引入笔者在所有的面试中都会被问答到项目中的具体特征的情况,包括特征是如何得到的,为啥这个特征有效,做了哪些特征筛选,特征重要性是如何看的,和线性回归、逻辑回归这种广义线性模型不一样,简单的决策树的...
  • XGBoost 输出特征重要性以及筛选特征

    千次阅读 2018-08-26 10:27:00
    1.输出XGBoost特征的重要性 from matplotlib import pyplot pyplot.bar(range(len(model_XGB.feature_importances_)), model_XGB....XGBoost 特征重要性绘图 也可以使用XGBoost内置的特征重要性绘图函数 # pl...
  • 特征重要性评估及筛选

    千次阅读 2020-03-04 17:55:21
    sklearn中特征重要性的计算方法, 基于重要性来进行特征选择
  • LR模型特征重要性排序

    千次阅读 2019-09-17 23:10:02
    1.特征重要性的意义 LR模型也就是逻辑回归模型,作为一个简单的常用的模型,其有非常多的有点,除了模型简单,容易实现分布式,还有一个重要的优点就是模型的可解释性非常好。因为每个特征都对应一个模型参数wiw_{i}...
  • 这篇文章的作者将带领我们认识一种新颖的特征选择方法—排列重要性,它可以帮助我们找到任何BlackBox模型的特征重要性,那么它又是怎么起作用的以及又是如何使用ELI5对其进行编码的呢?这篇文章给你答案。本文来自...
  • 根据特征重要性进行特征选择

    千次阅读 2018-06-02 15:36:26
    对钓鱼网页特征进行提取 使用随机森林进行分类 分类结果不够准确 前几天看书看到了根据特征重要性进行特征筛选 今天拿来试一下原本选择了11个特征进行了特征提取 feature_names = ['img_num', 'form_num', 'input...
  • 输入数据包括原始协方差矩阵,特征重要性得分,spearman相关阈值和原始数据。 运行后,该功能会将最终协方差矩阵保存为文件“ cov.csv”。 所有相关将小于输入阈值。 较长的说明: 此功能通过在每次调用时过滤最...
  • 基于 UCI 葡萄酒数据,使用随机森林进行特征重要性分析,这些数据是对意大利同一地区种植的三种不同品种葡萄酒的化学分析结果,分析确定了三种葡萄酒中13种成分的含量,数据的第一列是葡萄酒的类别
  • 特征重要性评分是一种为输入特征评分的手段,其依据是输入特征在预测目标变量过程中的有用程度。特征重要性有许多类型和来源,尽管有许多比较常见,比如说统计相关性得分,线性模型的部分系数,基于决策树的特征重要...
  • 1 feature importancegradient boosting 有一个优点是可以给出训练好的模型的特征重要性,这样就可以知道哪些变量需要被保留,哪些可以舍弃。首先要进入两个类:from xgboost import plot_importancefrom matplotlib...
  • 打印模型特征重要性

    2020-12-29 14:09:36
    1. 获得特征重要性信息 def get_feature_importance_pair(gbm_model): feature_name_list = gbm_model.feature_name() importance_list = list(gbm_model.feature_importance()) feature_importance_pair = [...
  • 卷积神经网络特征重要性分析及增强特征选择模型_卢泓宇张敏
  • 如何用Python计算特征重要性

    千次阅读 2020-07-07 16:10:07
    特征重要性评分是一种为输入特征评分的手段,其依据是输入特征在预测目标变量过程中的有用程度。 特征重要性有许多类型和来源,尽管有许多比较常见,比如说统计相关性得分,线性模型的部分系数,基于决策树的特征...
  • 逻辑回归特征重要性查看

    千次阅读 2020-01-10 19:26:23
    逻辑回归特征重要性查看 LR模型也就是逻辑回归模型,作为一个简单的常用的模型,其有非常多的优点,除了模型简单,容易实现分布式, 还有一个重要的优点就是模型的可解释性非常好。因为每个特征都对应一个模型参数wi...
  • 在使用GBDT、RF、Xgboost等树类模型建模时,往往可以通过 feature_importance 来返回特征重要性,各模型输出特征重要性的原理与方法 一 计算特征重要性方法 首先,目前计算特征重要性计算方法主要有两个方面: ...
  • 在建立模型之前,特征重要性能够帮助训练模型,防止过拟合,提升模型的RUC效果。 建立模型之后,特征重要性能够增强模型(集成模型 非深度学习模型)的可解释性,帮助建立模型信任、做出现实意义上的决策。 建模前...
  • 基于袋外数据误差,对特征X给于扰动,得到特征重要性评分 参考: https://www.cnblogs.com/justcxtoworld/p/3447231.html#3975497
  • 特征重要性评分是一种为输入特征评分的手段,其依据是输入特征在预测目标变量过程中的有用程度。特征重要性有许多类型和来源,尽管有许多比较常见,比如说统计相关性得分,线性模型的部分系数,基于决策树的特征重要...
  • 在XGBoost中提供了三种特征重要性的计算方法:‘weight’ - the number of times a feature is used to split the data across all trees.‘gain’ - the average gain of the feature when it is used in trees...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,075
精华内容 4,430
关键字:

特征重要性