精华内容
下载资源
问答
  • Git 实用技巧

    千人学习 2019-11-24 18:20:42
    这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先...
  • 在使用GBDT、RF、Xgboost等树类模型建模时,往往可以通过 feature_importance ...训练过程中通过记录特征的分裂总次数、总/平均信息增益来对特征重要性进行量化。例如实际工程中我们会用特征在整个GBDT、XgBoost里面...

    在使用GBDT、RF、Xgboost等树类模型建模时,往往可以通过 feature_importance 来返回特征重要性,各模型输出特征重要性的原理与方法

    一 计算特征重要性方法

    首先,目前计算特征重要性计算方法主要有两个方面:

    1.1 训练过程中计算

    训练过程中通过记录特征的分裂总次数、总/平均信息增益来对特征重要性进行量化。例如实际工程中我们会用特征在整个GBDT、XgBoost里面被使用的次数或者带来的总/平均信息增益来给特征重要度打分,最后进行排序。由于本身Ensemble模型在选择特征分裂时带有一定随机性,一般会跑多个模型然后把特征重要性求平均后排序。

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

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

    分别根据特征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

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

     

    1.2 训练后使用OOB(Out of Bag)数据计算

    第二种方式是训练好模型之后,用Out of Bag(或称Test)数据进行特征重要性的量化计算。具体来说,先用训练好的模型对OOB数据进行打分,计算出AUC或其他业务定义的评估指标;接着对OOB数据中的每个特征:

    (1)随机shuffle当前特征的取值;

    (2)重新对当前数据进行打分,计算评估指标;

    (3)计算指标变化率

    按照上面方式,对每个特征都会得到一个变化率,最后按照变化率排序来量化特征重要性。

    延伸到 DNN 对特征重要性判定:

    DNN不像Boosting这类模型那样存在所谓的分裂次数与信息增益,就需要使用第二种方式,对每个特征进行随机shuffle,观察模型指标的变化,最后按照变化率进行排序。比如AUC下滑率,下滑的越多说明当前这个指标越重要。当然,实际操作中需要结合业务经验先指定一个候选变量池,对这部分变量计算重要度,不然计算开销太大。

     

    二. 树模型特征重要性判定

    2.1 Random Foreast

    • 袋外数据错误率(可参考OOB特征选择方法)
    • 基尼指数(和GBDT的方法相同)

    随机森林特征重要性评定可参考:https://blog.csdn.net/zjuPeco/article/details/77371645?locationNum=7&fps=1

    2.2 GBDT

    基尼指数

    在sklearn中,GBDT和RF的特征重要性计算方法是相同的,都是基于单棵树计算每个特征的重要性,探究每个特征在每棵树上做了多少的贡献,再取个平均值。 


    2.3 XGBoost

    xgboost实现中Booster类get_score方法输出特征重要性,其中importance_type参数支持三种特征重要性的计算方法:

    • importance_type=weight(默认):the number of times a feature is used to split the data across all trees. 特征重要性使用特征在所有树中作为划分属性的次数。
    • importance_type=gain:is the average gain of splits which use the feature. 特征重要性使用特征在作为划分属性带来的平均增益。
    • importance_type=cover:is the average coverage of splits which use the feature where coverage is defined as the number of samples affected by the split. 使用该特作为分割影响的平均样本数。——可以理解为被分到该节点的样本的二阶导数之和,而特征度量的标准就是平均的coverage值。
    • importance_type=total_gain: the total gain across all splits the feature is used in.
    • importance_type=total_cover: the total coverage across all splits the feature is used in

    cover 的解释有点晦涩,在[R-package/man/xgb.plot.tree.Rd]有比较详尽的解释:

    (https://github.com/dmlc/xgboost/blob/f5659e17d5200bd7471a2e735177a81cb8d3012b/R-package/man/xgb.plot.tree.Rd)

    the sum of second order gradient of training data classified to the leaf, if it is square loss, this simply corresponds to the number of instances in that branch. Deeper in the tree a node is, lower this metric will be。实际上coverage可以理解为被分到该节点的样本的二阶导数之和,而特征度量的标准就是平均的coverage值。

     

    下面就结合这张图,解释下各指标含义: 

    1. weight:  {‘f0’: 1, ‘f1’: 2}
    在所有树中,某特征被用来分裂节点的次数,在本例中,可见分裂第1个节点时用到f0,分裂第2,3个节点时用到f1,所以weight_f0 = 1, weight_f1 = 2


    2. total_cover:  {‘f0’: 10.0, ‘f1’: 8.0}
    第1个节点,f0被用来对所有10个样例进行分裂,之后的节点中f0没再被用到,所以f0的total_cover为10.0,此时f0 >= 0.855563045的样例有5个,落入右子树;
    第2个节点,f1被用来对上面落入右子树的5个样例进行分裂,其中f1 >= -0.178257734的样例有3个,落入右子树;
    第3个节点,f1被用来对上面落入右子树的3个样例进行分裂。
    总结起来,f0在第1个节点分裂了10个样例,所以total_cover_f0 = 10,f1在第2、3个节点分别用于分裂5、3个样例,所以total_cover_f1 = 5 + 3 = 8。total_cover表示在所有树中,某特征在每次分裂节点时处理(覆盖)的所有样例的数量。


    3. cover:  {‘f0’: 10.0, ‘f1’: 4.0}
    cover = total_cover / weight,在本例中,cover_f0 = 10 / 1,cover_f1 = 8 / 2 = 4.


    4. total_gain:  {‘f0’: 0.265151441, ‘f1’: 0.75000003}
    在所有树中,某特征在每次分裂节点时带来的总增益,如果用熵或基尼不纯衡量分裂前后的信息量分别为i0和i1,则增益为(i0 - i1)。


    5. gain:  {‘f0’: 0.265151441, ‘f1’: 0.375000015}

    gain就是特征用于分割的平均增益 ,gain = total_gain / weight,在本例中,gain_f0 = 0.265151441 / 1,gain_f1 = 75000003 / 2 = 375000015.

    在平时的使用中,多用total_gain来对特征重要性进行排序。

     

    2.4 Lightgbm

    split:result contains numbers of times the feature is used in a mode (特征重要性使用特征在所有树中作为划分属性的次数)
    gain:result contains total gains of splits which use the feature (使用该特征作为分割带来的总增益)


     

    参考文献

    1. https://blog.csdn.net/tinkle181129/article/details/80231871
    2. https://blog.csdn.net/lz_peter/article/details/85010931
    展开全文
  • 用xgboost模型对特征重要性进行排序

    万次阅读 多人点赞 2018-08-12 21:08:21
    用xgboost模型对特征重要性进行排序 在这篇文章中,你将会学习到: xgboost对预测模型特征重要性排序的原理(即为什么xgboost可以对预测模型特征重要性进行排序)。 如何绘制xgboost模型得到的特征重要性条形图。...

    用xgboost模型对特征重要性进行排序

    在这篇文章中,你将会学习到:

    1. xgboost对预测模型特征重要性排序的原理(即为什么xgboost可以对预测模型特征重要性进行排序)。
    2. 如何绘制xgboost模型得到的特征重要性条形图。
    3. 如何根据xgboost模型得到的特征重要性,在scikit-learn进行特征选择。

     

    梯度提升算法是如何计算特征重要性的?

    使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个属性的重要性得分。一般来说,重要性分数,衡量了特征在模型中的提升决策树构建中价值。一个属性越多的被用来在模型中构建决策树,它的重要性就相对越高。

    属性重要性是通过对数据集中的每个属性进行计算,并进行排序得到。在单个决策书中通过每个属性分裂点改进性能度量的量来计算属性重要性,由节点负责加权和记录次数。也就说一个属性对分裂点改进性能度量越大(越靠近根节点),权值越大;被越多提升树所选择,属性越重要。性能度量可以是选择分裂节点的Gini纯度,也可以是其他度量函数。

    最终将一个属性在所有提升树中的结果进行加权求和后然后平均,得到重要性得分。

     

    绘制特征重要性

    一个已训练的xgboost模型能够自动计算特征重要性,这些重要性得分可以通过成员变量feature_importances_得到。可以通过如下命令打印:

    print(model.feature_importances_)

    我们可以直接在条形图上绘制这些分数,以获得数据集中每个特征的相对重要性的直观显示。例如:

    # plot
    pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
    pyplot.show()

    我们可以通过在the Pima Indians onset of diabetes 数据集上训练XGBOOST模型来演示,并从计算的特征重要性中绘制条形图。

    # plot feature importance manually
    from numpy import loadtxt
    from xgboost import XGBClassifier
    from matplotlib import pyplot
    # load data
    dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
    # split data into X and y
    X = dataset[:,0:8]
    y = dataset[:,8]
    # fit model no training data
    model = XGBClassifier()
    model.fit(X, y)
    # feature importance
    print(model.feature_importances_)
    # plot
    pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
    pyplot.show()

    运行这个示例,首先的输出特征重要性分数:

    [0.089701, 0.17109634, 0.08139535, 0.04651163, 0.10465116, 0.2026578, 0.1627907, 0.14119601]

    相对重要性条形图:

    这种绘制的缺点在于,只显示了特征重要性而没有排序,可以在绘制之前对特征重要性得分进行排序。

    通过内建的绘制函数进行特征重要性得分排序后的绘制,这个函数就是plot_importance()示例如下:

    # plot feature importance using built-in function
    from numpy import loadtxt
    from xgboost import XGBClassifier
    from xgboost import plot_importance
    from matplotlib import pyplot
    # load data
    dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
    # split data into X and y
    X = dataset[:,0:8]
    y = dataset[:,8]
    # fit model no training data
    model = XGBClassifier()
    model.fit(X, y)
    # plot feature importance
    plot_importance(model)
    pyplot.show()

    运行示例得到条形图:

    根据其在输入数组中的索引,特征被自动命名为f0-f7。在问题描述中手动的将这些索引映射到名称,我们可以看到,F5(身体质量指数)具有最高的重要性,F3(皮肤折叠厚度)具有最低的重要性。

     

    根据xgboost特征重要性得分进行特征选择

    特征重要性得分,可以用于在scikit-learn中进行特征选择。通过SelectFromModel类实现,该类采用模型并将数据集转换为具有选定特征的子集。这个类可以采取预先训练的模型,例如在整个数据集上训练的模型。然后,它可以阈值来决定选择哪些特征。当在SelectFromModel实例上调用transform()方法时,该阈值被用于在训练集和测试集上一致性选择相同特征。

    在下面的示例中,我们首先在训练集上训练xgboost模型,然后在测试上评估。使用从训练数据集计算的特征重要性,然后,将模型封装在一个SelectFromModel实例中。我们使用这个来选择训练集上的特征,用所选择的特征子集训练模型,然后在相同的特征方案下对测试集进行评估。

    示例:

    # select features using threshold
    selection = SelectFromModel(model, threshold=thresh, prefit=True)
    select_X_train = selection.transform(X_train)
    # train model
    selection_model = XGBClassifier()
    selection_model.fit(select_X_train, y_train)
    # eval model
    select_X_test = selection.transform(X_test)
    y_pred = selection_model.predict(select_X_test)

    我们可以通过测试多个阈值,来从特征重要性中选择特征。具体而言,每个输入变量的特征重要性,本质上允许我们通过重要性来测试每个特征子集。

    完整示例如下:

    # use feature importance for feature selection
    from numpy import loadtxt
    from numpy import sort
    from xgboost import XGBClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn.feature_selection import SelectFromModel
    # load data
    dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
    # split data into X and y
    X = dataset[:,0:8]
    Y = dataset[:,8]
    # split data into train and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
    # fit model on all training data
    model = XGBClassifier()
    model.fit(X_train, y_train)
    # make predictions for test data and evaluate
    y_pred = model.predict(X_test)
    predictions = [round(value) for value in y_pred]
    accuracy = accuracy_score(y_test, predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))
    # Fit model using each importance as a threshold
    thresholds = sort(model.feature_importances_)
    for thresh in thresholds:
    	# select features using threshold
    	selection = SelectFromModel(model, threshold=thresh, prefit=True)
    	select_X_train = selection.transform(X_train)
    	# train model
    	selection_model = XGBClassifier()
    	selection_model.fit(select_X_train, y_train)
    	# eval model
    	select_X_test = selection.transform(X_test)
    	y_pred = selection_model.predict(select_X_test)
    	predictions = [round(value) for value in y_pred]
    	accuracy = accuracy_score(y_test, predictions)
    	print("Thresh=%.3f, n=%d, Accuracy: %.2f%%" % (thresh, select_X_train.shape[1], accuracy*100.0))

    运行示例,得到输出:

    Accuracy: 77.95%
    Thresh=0.071, n=8, Accuracy: 77.95%
    Thresh=0.073, n=7, Accuracy: 76.38%
    Thresh=0.084, n=6, Accuracy: 77.56%
    Thresh=0.090, n=5, Accuracy: 76.38%
    Thresh=0.128, n=4, Accuracy: 76.38%
    Thresh=0.160, n=3, Accuracy: 74.80%
    Thresh=0.186, n=2, Accuracy: 71.65%
    Thresh=0.208, n=1, Accuracy: 63.78%

    我们可以看到,模型的性能通常随着所选择的特征的数量而减少。在这一问题上,可以对测试集准确率和模型复杂度做一个权衡,例如选择4个特征,接受准确率从77.95%降到76.38%。这可能是对这样一个小数据集的清洗,但对于更大的数据集和使用交叉验证作为模型评估方案可能是更有用的策略。

    展开全文
  •   2019-02-12 23:53:35 ...通常,除了想知道我们的机器学习模型的房价预测是什么之外,我们还想知道为什么它是这么高/低,以及哪些特征在确定预测时最重要。另一个例子是预测客户流失 - 拥有一个...

    https://www.toutiao.com/a6657142683347190284/

     

    2019-02-12 23:53:35

    在许多(业务)案例中,同样重要的是不仅要有一个准确的机器学习模型,还要有一个可解释的机器学习模型。通常,除了想知道我们的机器学习模型的房价预测是什么之外,我们还想知道为什么它是这么高/低,以及哪些特征在确定预测时最重要。另一个例子是预测客户流失 - 拥有一个能够成功预测哪些客户容易流失的机器学习模型是非常好的,但确定哪些变量很重要可以帮助我们及早发现甚至改进产品/服务!

    了解机器学习模型的特征重要性可以通过多种方式使您受益,例如:

    • 通过更好地理解机器学习模型的逻辑,您不仅可以验证它是正确的,还可以通过仅关注重要变量来改进模型
    • 您可以删除不那么重要的x变量,并且在更短的训练时间内具有类似或更好的性能
    • 在某些商业案例中,为了解释性而牺牲一些准确性是有道理的。

    这就是为什么在本文中,我想通过一个随机森林模型的例子来探索不同的方法来解释特征的重要性。它们中的大多数也适用于不同的模型,从线性回归开始,以XGBoost等黑盒结束。

    需要注意的一点是,我们的模型越精确,我们就越能够信任特征重要性度量和其他解释。我假设我们构建的模型相当准确(因为每个数据科学家都会努力建立这样的模型),在本文中我将重点关注重要性度量。

    数据

    对于这个例子,我将使用波士顿房价数据集(所以回归问题)。但是本文中描述的方法与分类问题一样,唯一的区别是用于评估的度量。Python代码如下:

    import pandas as pd
    from sklearn.datasets import load_boston
    boston = load_boston()
    y = boston.target
    X = pd.DataFrame(boston.data, columns = boston.feature_names)
    np.random.seed(seed = 42)
    X['random'] = np.random.random(size = len(X))
    X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size = 0.8, random_state = 42)

    通过随机森林的例子解释特征重要性

     

    下面我检查随机特征和目标变量之间的关系。可以看出,散点图上没有模式,相关性几乎为0。

    sns.scatterplot(x = 'random', y = 'target', data = X.assign(target = y)).set_title('Random feature vs. target variable', fontsize = 16)

    通过随机森林的例子解释特征重要性

     

    sns.heatmap(X.assign(target = y).corr().round(2), cmap = 'Blues', annot = True).set_title('Correlation matrix', fontsize = 16)

    通过随机森林的例子解释特征重要性

     

    这里需要注意的一点是,为CHAS解释相关性没有多大意义,因为它是一个二元变量,应该使用不同的方法。

    基准模型

    我训练一个普通的随机森林模型来获得一个基准。我设置了一个random_state以确保结果的可比性。我也使用bootstrap并设置,oob_score = True以便稍后我可以使用out-of-bag error。

    简单地说,随机森林中的每棵树都在不同的数据集上进行训练,从原始数据中进行替换取样。这导致每个训练集中大约有2/3的不同观测值。out-of-bag误差是根据所有观测值计算的,但是对于计算每一行的误差,模型只考虑在训练过程中没有看到这一行的树。这类似于在验证集上对模型进行评估。查看如下Python代码:

    from sklearn.ensemble import RandomForestRegressor
    rf = RandomForestRegressor(n_estimators = 100,
     n_jobs = -1,
     oob_score = True,
     bootstrap = True,
     random_state = 42)
    rf.fit(X_train, y_train)
    print('R^2 Training Score: {:.2f} 
    OOB Score: {:.2f} 
    R^2 Validation Score: {:.2f}'.format(rf.score(X_train, y_train), 
     rf.oob_score_,
     rf.score(X_valid, y_valid)))

    通过随机森林的例子解释特征重要性

     

    R^2 Training Score: 0.93

    OOB Score: 0.58

    R^2 Validation Score: 0.76

    模型中存在一些过度拟合,因为它在OOB样本上和验证集上的表现都差得多。但我们假设它已经足够好了,接下来是特征重要性(通过训练集的性能来衡量)。一些方法还可以用于验证/OOB集,以获得对不可见数据的进一步解释性。

    特征重要性

    默认Scikit-learn的特征重要性

    让我们从决策树开始建立一些直觉。在决策树中,每个节点都是在一个特征中拆分值的条件,这样在拆分后,相类似的因变量值就会在同一个集合中结束。该条件基于杂质,分类问题为基尼杂质/信息增益(熵),回归树为其方差。因此,当训练一棵树时,我们可以计算出每个特征对减少加权杂质的贡献有多大。Scikit-Learn中的feature_importances_是基于这个逻辑的,但是在随机森林中,我们正在讨论的是对树上的杂质减少进行平均。

    优点:

    • 快速计算
    • 易于检索

    缺点:

    • 有偏见的方法,因为它倾向于夸大连续特征或高基数分类变量的重要性
    base_imp = imp_df(X_train.columns, rf.feature_importances_)
    var_imp_plot(base_imp, 'Default feature importance (scikit-learn)')

    通过随机森林的例子解释特征重要性

     

    通过随机森林的例子解释特征重要性

     

    似乎最重要的三大特征是:

    • RM:平均房间数量
    • LSTAT:人口lower status的百分比
    • DIS:到波士顿五个就业中心的加权距离

    然而,令人惊讶的是,一列随机值竟然比以下内容更重要:

    • INDUS:城镇非零售商业用地比例
    • RAD:径向高速公路的可达性指数
    • ZN:占地面积超过25,000平方尺的住宅用地比例。
    • CHAS:Charles River虚拟变量(如果有河= 1;否则为0)

    直观地说,这个特征对目标变量的重要性应该是零。让我们看看它是如何通过不同的方法进行评估的。

    排列特征重要性

    这种方法通过观察每个预测器的随机re-shuffling(从而保持变量的分布)如何影响模型性能来直接度量特征的重要性。

    该方法可按以下步骤描述:

    1. 训练基线模型并通过传递验证集(或随机森林情况下设置的OOB)记录得分(准确度/R²/任何重要度量)。这也可以在训练集上完成,但代价是牺牲关于泛化的信息。
    2. 从所选数据集中的一个特征Re-shuffle值,再次将数据集传递给模型以获取预测并计算此已修改数据集的度量标准。特征重要性是基准分数与修改(置换)数据集之间的差异。
    3. 对数据集中的所有特征重复2.

    优点:

    • 适用于任何模型
    • 合理有效
    • 可靠的技术
    • 无需在每次修改数据集时重新训练机器学习模型

    缺点:

    • 比默认的feature_importances在计算上更昂贵
    • 排列重要性高估了相关预测因子的重要性

    我将可视化Spearman的相关性。标准皮尔逊相关性的不同之处在于,它首先将变量转换为秩,然后在秩上运行皮尔逊相关性。

    Spearman相关性:

    • 是非参数的
    • 不假设变量之间存在线性关系
    • 它寻找单调的关系。
    from rfpimp import plot_corr_heatmap
    viz = plot_corr_heatmap(X_train, figsize=(15,10))
    viz.view()

    通过随机森林的例子解释特征重要性

     

    通过随机森林的例子解释特征重要性

     

    rfpimp:关于这个库需要注意的一点是,我们必须我们必须以metric(model, X, y)的形式提供一个度量,这样我们就可以使用更高级的方法,比如使用随机森林的OOB评分。这个库已经包含了相应的函数(oob_regression_r2_score)。但是为了保持方法的一致性,我将计算训练集上的度量(失去了关于泛化的信息)。

    from sklearn.metrics import r2_score
    from rfpimp import permutation_importances
    def r2(rf, X_train, y_train):
     return r2_score(y_train, rf.predict(X_train))
    perm_imp_rfpimp = permutation_importances(rf, X_train, y_train, r2)
    perm_imp_rfpimp.reset_index(drop = False, inplace = True)
    var_imp_plot(perm_imp_rfpimp, 'Permutation feature importance (rfpimp)')

    通过随机森林的例子解释特征重要性

     

    通过随机森林的例子解释特征重要性

     

    该图证实了我们上面所看到的,4个变量不如随机变量重要!令人惊讶的是......前4名保持不变。关于`rfpimp`的一个更好的特性是它包含处理共线特征问题的功能(这是显示Spearman相关矩阵背后的想法)。

    eli5:rfpimp的基本方法和eli5的方法有一些不同。其中一些是:

    • 有参数cv和refit连接到使用交叉验证。在这个例子中,我将它们设置为None,因为我不使用它,但在某些情况下它可能会派上用场。
    • 有一个metric参数,在rfpimp中接受metric(model, X, y)形式的函数。如果未指定此参数,则该函数将使用score估计器的默认方法。
    • n_iter - 随机shuffle迭代次数,最终得分是平均值
    import eli5
    from eli5.sklearn import PermutationImportance
    perm = PermutationImportance(rf, cv = None, refit = False, n_iter = 50).fit(X_train, y_train)
    perm_imp_eli5 = imp_df(X_train.columns, perm.feature_importances_)
    var_imp_plot(perm_imp_eli5, 'Permutation feature importance (eli5)')

    通过随机森林的例子解释特征重要性

     

    通过随机森林的例子解释特征重要性

     

    结果与前面的结果非常相似,尽管这些结果来自于每列的多次reshuffles。eli5的另一个优点是,通过使用Scikit-learn的SelectFromModel或RFE,可以很容易地使用置换方法的结果进行特征选择。

    删除列特征重要性

    这种方法非常直观,因为我们通过将模型与所有特征进行比较来研究特征的重要性,而将模型与此特征进行比较以进行训练。

    我为下面的方法创建了一个函数(基于rfpimp的实现),它显示了底层逻辑。

    优点:

    • 最准确的特征重要性

    缺点:

    • 由于为数据集的每个变体重新训练模型而导致潜在的高计算成本(在删除单个特征列之后)
    from sklearn.base import clone 
    def drop_col_feat_imp(model, X_train, y_train, random_state = 42):
     
     # clone the model to have the exact same specification as the one initially trained
     model_clone = clone(model)
     # set random_state for comparability
     model_clone.random_state = random_state
     # training and scoring the benchmark model
     model_clone.fit(X_train, y_train)
     benchmark_score = model_clone.score(X_train, y_train)
     # list for storing feature importances
     importances = []
     
     # iterating over all columns and storing feature importance (difference between benchmark and new model)
     for col in X_train.columns:
     model_clone = clone(model)
     model_clone.random_state = random_state
     model_clone.fit(X_train.drop(col, axis = 1), y_train)
     drop_col_score = model_clone.score(X_train.drop(col, axis = 1), y_train)
     importances.append(benchmark_score - drop_col_score)
     
     importances_df = imp_df(X_train.columns, importances)
     return importances_df
    drop_imp = drop_col_feat_imp(rf, X_train, y_train)
    var_imp_plot(drop_imp, 'Drop Column feature importance')

    通过随机森林的例子解释特征重要性

     

    通过随机森林的例子解释特征重要性

     

    这里很有趣。首先,在这种情况下的负面重要性意味着从模型中删除给定的特征实际上提高了性能。这在随机情况下是很好的,但奇怪的是,在删除DIS之后可以观察到最高的性能提升,DIS是之前方法中第三个最重要的变量。不幸的是,我没有一个很好的解释。

    观察水平特征重要性

    通过观察水平特征重要性,我指的是对解释给予模型的特定观察具有最大影响的那些。例如,在信用评分的情况下,我们可以说这些特征对确定客户的信用评分影响最大。

    Treeinterpreter

    treeinterpreter的主要思想是使用随机森林中的底层树来解释每个特性如何贡献最终值。我们可以观察到预测的值(定义为每个特征贡献的总和+基于整个训练集的初始节点给出的平均值)在决策树中的预测路径上(每次分割之后)是如何变化的,

    以及导致分裂的信息(预测的变化也是如此)。

    预测函数的公式(f(x))可以写为:

    通过随机森林的例子解释特征重要性

     

    其中c_full是整个数据集(初始节点)的平均值,K是特征的总数。

    这可能听起来很复杂,但请看一下库作者的一个例子:

    通过随机森林的例子解释特征重要性

     

    由于随机森林的预测是树的平均值,因此平均预测的公式如下:

    通过随机森林的例子解释特征重要性

     

    其中J是森林中树的数量

    我首先确定具有最低和最高绝对预测误差的行,并尝试查看导致差异的原因。Python实现如下:

    pred_diff = pd.DataFrame({'difference': abs(y_train - rf.predict(X_train))})
    print('Index with smallest error:', pred_diff.sort_values('difference').head(1).index.values[0])
    print('Index with largest error:', pred_diff.sort_values('difference', ascending = False).head(1).index.values[0])

    通过随机森林的例子解释特征重要性

     

    Index with smallest error: 31

    Index with largest error: 85

    使用treeintrerpreter I获得3个对象:预测、偏差(数据集的平均值)和贡献。

    for i in range(len(selected_rows)):
     print("Row", selected_rows[i])
     print("Prediction:", prediction[i][0], 'Actual Value:', y_train[selected_rows[i]])
     print("Bias (trainset mean)", bias[i])
     print("Feature contributions:")
     for c, feature in sorted(zip(contributions[i], 
     X_train.columns), 
     key=lambda x: -abs(x[0])):
     print(feature, round(c, 2))
     print("-"*20)

    通过随机森林的例子解释特征重要性

     

    对于误差最小的观察,主要的影响因素是LSTAT和RM(在以前的例子中,这是最重要的变量)。在错误最高的情况下,最大的贡献来自DIS变量。

    通过随机森林的例子解释特征重要性

     

    为了更深入地研究,我们可能还会对许多变量的联合贡献感兴趣(如这里的XOR所解释的)。

    prediction1, bias1, contributions1 = ti.predict(rf, np.array([selected_df[0]]), joint_contribution=True)
    prediction2, bias2, contributions2 = ti.predict(rf, np.array([selected_df[1]]), joint_contribution=True)
    aggregated_contributions1 = utils.aggregated_contribution(contributions1)
    aggregated_contributions2 = utils.aggregated_contribution(contributions2)
    res = []
    for k in set(aggregated_contributions1.keys()).union(
     set(aggregated_contributions2.keys())):
     res.append(([X_train.columns[index] for index in k] , 
     aggregated_contributions1.get(k, 0) - aggregated_contributions2.get(k, 0))) 
     
    for lst, v in (sorted(res, key=lambda x:-abs(x[1])))[:10]:
     print (lst, v)

    通过随机森林的例子解释特征重要性

     

    ['RM', 'DIS'] [-3.65430351]

    ['RM', 'DIS', 'LSTAT'] [-2.15540094]

    ['CRIM', 'LSTAT'] [-1.65588589]

    ['DIS', 'LSTAT'] [-1.64678593]

    ['NOX', 'LSTAT'] [-1.28406056]

    ['RM', 'TAX', 'LSTAT'] [-1.00245007]

    ['CRIM', 'RM', 'LSTAT'] [-0.62160057]

    ['TAX', 'LSTAT'] [-0.55742577]

    ['RM', 'LSTAT'] [-0.45002332]

    ['B', 'LSTAT'] [-0.3516441]

    最佳和最差预测案例之间的差异主要来自房间(RM)特征的数量,以及到五个波士顿就业中心的加权距离(DIS)。

    LIME

    LIME (Local interpretation table Model-agnostic interpretation)是一种以可解释任何分类器/回归器的预测的技术。要做到这一点,可以通过使用可解释的模型(如带正则化的线性模型或决策树)局部逼近所选模型来获得解释。可解释模型是在原始观测(表格数据行)的小扰动(加噪声)上进行训练的,因此只能提供良好的局部逼近。

    要注意的一些缺点:

    • 只有线性模型用于近似局部行为
    • 需要对数据执行以获得正确解释的扰动类型通常是特定于用例的
    • 简单的(默认的)扰动通常是不够的。在理想的情况下,修改将由数据集中观察到的变化驱动

    您可以在下面看到LIME解释的输出。

    输出有3个部分:

    • 预测值
    • 特征重要性 - 在回归的情况下,它显示它是否对预测有负面或正面影响,按绝对影响下降排序。
    • 这些特征的实际值用于解释行。

    请注意,LIME已将解释中的特征离散化。这是因为在上面的构造函数中设置了`discretize_continuous = True`。离散化的原因在于它为连续特征提供了更直观的解释。

    import lime
    import lime.lime_tabular
    explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values,
     mode = 'regression',
     feature_names = X_train.columns,
     categorical_features = [3], 
     categorical_names = ['CHAS'], 
     discretize_continuous = True)
     
    np.random.seed(42)
    exp = explainer.explain_instance(X_train.values[31], rf.predict, num_features = 5)
    exp.show_in_notebook(show_all=False) #only the features used in the explanation are displayed
    exp = explainer.explain_instance(X_train.values[85], rf.predict, num_features = 5)
    exp.show_in_notebook(show_all=False)

    通过随机森林的例子解释特征重要性

     

    通过随机森林的例子解释特征重要性

     

    LIME解释认为,对于这两种观测结果,最重要的特征是RM和LSTAT,这一点在之前的方法中也有体现。

    结论

    在本文中,我展示了一些从机器学习模型(不限于随机森林)中导出特征重要性的方法。我相信理解结果通常与获得良好结果一样重要,因此每个数据科学家都应尽力了解哪些变量对模型最重要,以及为什么。这不仅有助于更好地了解业务,还可以进一步改进机器学习模型。

    展开全文
  • 微信小程序和支付宝小程序的开发记录
    本文主要记录开发微信小程序和支付宝小程序的心得体会,欢迎来喷
    
    背景:既要开发小程序客户端,也要开发服务端接口(php),俗称被逼成的伪全栈。经历了从申请账号,需求,开发,测试,上线的流程。
    微信小程序已开发上线4个,支付宝小程序3个。从数据上看,只有一个在未经推广情况下自然流量达八万左右。
    我们一般是先开发微信小程序,再在此基础上修改后开发支付宝小程序。
    1.客户端开发
    主要的基础是html  css 和javascript 这些,css 主要是用的是flex布局。html主要是各自文档中的各种组件。
    主要的是一定要符合规范,否则会有兼容性问题:
    (1)样式在微信上没问题的,在支付宝上有问题,主要是一定要注意html和css的规范使用。以及android和ios的差别、屏幕大小的差别。
    (2)事件响应:微信上是bind,支付宝是on
    2.接口的问题
    接口在微信上可以正常调用,但是在支付宝上就会有问题,发起网络请求后进入fail回调,错误代码为14(解
    码错误),本来想微信上没问题,支付宝就有,应该是支付宝侧的问题,结果在这个方案下,耽误了许多时间,最终发现是代码文件编码这样的基础问题,这种情况不易发现。
    3.审核
    支付宝审核很严格,会对程序进行功能测试,有一个小程序提测了十次左右才通过
    4.官方文档很重要
    后续会继续补充
    qq:1014970572
    展开全文
  • 可以看出记录和总结的重要性。 写博客,不一定非要是技术大牛才写博客,大家都可以写博客来记录自己的收获,每一个知识点 大家都可以写一篇技术博客(自己刷过的题,自己准备面试时候的知识点等等) 如果从来没有写...
  • 论EXCEL的重要性

    千次阅读 2019-11-10 22:00:44
    昨天参加同学聚会,非常详尽的谈了excel的重要性,这不仅是计算器,也是数据分析工具,也是展示模板,同时也是纠错必备。 只lookup函数吧,就能解决一连串的问题;它的绘图功能更是普通绘图工具所不能比,专业工具...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 MySQL 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15? 一般情况下,我们创建的表的类型是 InnoDB ,如果...
  • XGBoost学习(六):输出特征重要性以及筛选特征

    千次阅读 多人点赞 2020-09-03 16:03:17
    XGBoost输出特征重要性以及筛选特征 1,梯度提升算法是如何计算特征重要性的? 使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个属性的重要性得分。一般来说,重要性分数,衡量了特征在模型中的...
  • 工作中任务安排的重要性 个人的切身感受,一个好的领导会让团队更加高效快速的完成任务,好的规划起到的作用,以及效果不言而喻,事情要理清东西的逻辑以及需要实际操作的时候具体的流程以及过程中细节的考虑,...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    这里笔者把比较重要和使用频率最多的命令,按照它们在系统中的作用分成下面六个部分一一介绍。 ◆ 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last; ◆ 文件处理命令...
  • 在学习robodk的时候觉得要抓紧时间学习这个软件,笔记得比较少,但是在工作...总而言之,哪怕是大概个思维导图,简介一下这章讲了什么也好,一些关键的内容更是要记录一下,一时多花一些时间,对后来却是有利的。
  • 树模型特征重要性计算方法总结

    千次阅读 2019-04-14 13:03:56
    最近在复习特征重要性时候,考虑到我们在使用GBDT、RF、Xgboost等树类模型建模时,往往可以通过feature_importance 来返回特征...训练过程中通过记录特征的分裂总次数、总/平均信息增益来对特征重要性进行量化。例...
  • 树模型特征重要性评估方法

    千次阅读 2018-05-07 21:28:33
    在特征的选择过程中,如果学习器(基学习器)是树模型的话,可以根据特征的重要性来筛选有效的特征。本文是对Random Forest、GBDT、XGBoost如何用在特征选择上一个简单的介绍。 各种模型的特征重要性计算 ...
  • 网络信息安全的重要性

    万次阅读 2018-08-15 11:39:01
    1.网络安全的重要作用 在互联网普及的初期,人们更关注单纯的连接,以不受任何限制地建立互联网为最终目的。正如事情都具有两面,互联网的便捷给人们带来了负面问题,计算机病毒的侵害、信息泄露、网络欺诈等...
  • 1 分解代码1.1 最优叶子节点数与树数确定1.2 循环准备1.3 数据划分1.4 随机森林实现1.5 精度衡量1.6 变量重要程度排序1.7 保存模型2 完整代码   本文分为两部分,首先是将代码分段、详细讲解,方便大家理解;随后...
  • 工作复盘的重要性

    万次阅读 多人点赞 2018-11-07 10:02:22
    古语有云“学而不思则罔,思而不学则殆”,意思为一直在学习不思考人会被表面的现象蒙蔽,仅仅停留在思考而不进行深入的学习则会因为疑惑而更加危险。... 联想总裁柳传志将“复盘”作为联想重要的工作方法...
  • 谈谈工作总结的重要性

    千次阅读 2013-05-29 17:28:41
    入职一年多了,对工作内容越来越熟悉...那个时候这句话确实听进去了,不管什么都会写个文档,当然了文档主要是记录了很多细节,每天还坚持用EverNote写工作日记,隔一段时间稍稍把各种细节汇总一下输出一个文档,给me
  • 如果把运维看做是医生给病人看病,则日志...在医生看病时病人的描述和化验单上的数据对医生是非常重要的。同理日志在运维中的作用也是类似的,但非常不幸,日志在很多运维中被严重低估,直到磁盘空间不足的时候才想到
  • 论“事前-事中-事后”的重要性

    万次阅读 2018-09-08 17:33:31
    最近,公司生产上出现了两个事故,一次是软件版本部署失误,一次是测试过程中硬件板卡异常。就这两个事情,我们谈一下日常中非常熟悉...所谓事中,就是事情的过程中对事前规划的事情进行执行,以及记录过程中出现...
  • 回顾和总结的重要性

    千次阅读 2017-08-16 14:42:23
    回顾和总结的重要性一段时间的紧张开发结束了,作为一个技术开发者,不知道大家是不是和我一样,在每次开发新项目的时候都会用到一些新的技术,新的知识点,遇到一些技术难点,一些很奇怪的bug。或许你在当时解决了...
  • 复杂网络节点重要性评价方法初探

    万次阅读 2016-04-18 08:13:28
    在使用复杂网络分析业务问题时,如何区分网络中不同节点的重要性程度,就是一个需要考虑的问题。为了解决我们自己的业务问题,顺便了解了一下相关的方法,特记录一下,若有益于相关领域的同学,则幸甚。  一、要...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进成小工具。 Java右键弹出...
  • 数据完整 要想了解这三类完整约束首先要了解什么是数据完整。数据完整是指数据库中存储的数据是有意义的或正确的,和现实世界相符。关系模型中三类完整约束: – 实体完整(Entity Integrity) – 参照...
  • 物联网安全的重要性

    千次阅读 2015-02-06 15:16:36
    为了与朋友聊天,你的聊天记录自然会保存在厂商的服务器上。但是,用户的信息和厂商之间,应该遵循平等交换的原则。什么叫平等交换?用户享受服务,厂商获取信息,但在这个过程中,用户要有知情权,厂商要得到用户...
  • 谈谈数据库的重要性

    千次阅读 2013-04-14 11:38:11
    由于不了解数据库特性(位图索引),不清楚它些什么以及怎么,就导致这个数据库从一开始可扩缩就很差。一旦找出了问题,修正起来就很容易了。处理标志列上确实要有一个索引,但不能是位图索引。这里需要一个...
  • 如何做好科研实验记录

    千次阅读 2019-03-20 21:07:27
    ... “实践是检验真理的唯一标准”,科研实验是实践中的一环。 科学研究是以诚实守信为基础的事业,自诞生之始就把追求真理、...科研实验记录是科技档案的一部分,是指科学研究过程中,关于实验计划、过程、结果、分...
  • AHP层次分析法

    万次阅读 多人点赞 2014-02-21 01:07:12
    在比赛中,我们运用了层次分析法(AHPAnalytic Hierarchy Process)进行建模,好不容易理解了这一方法的思想,在自己的博客里记录一下,希望可以帮助初次接触层次分析法的人,更快地理解这一的整体思想,也利于...
  • 谷歌与CMU联合发文:审视数据对深度学习的重要性 深度学习在视觉问题上所取得的成功可归因于以下几点: 高容量模型; 高速增长的计算力; 大规模标记数据的可用性 。 原文链接: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 853,340
精华内容 341,336
关键字:

做记录的重要性