如何知道特征影响模型预测的因素

时间:2017-02-08 08:40:59

标签: python machine-learning scikit-learn decision-tree

我已经在数据集上训练了我的模型,并且我使用决策树来训练我的模型,它有3个输出类 - 是,完成和否,我知道了决策时最具决定性的特征检查分类器的特征重要性。我使用python和sklearn作为我的ML库。现在我已经找到了最具决定性的特征,我想知道该特征是如何贡献的,在某种意义上说,如果关系是正的,那么如果特征值增加,它会导致是,如果它是负的,它会导致不,等等,我也想知道它的大小。

我想知道是否有解决方案并且也知道独立于所选算法的解决方案,请尝试提供不是特定于决策树的解决方案,而是针对所有算法的一般解决方案。

如果有某种方式可以告诉我:

对于特征x1,关系为0.8 * x1 ^ 2 对于特征x2,关系是-0.4 * x2

这样我就可以分析输出依赖于输入功能x1,x2等等

是否有可能找出特定类别的特定功能的高值,或特征的低值。

2 个答案:

答案 0 :(得分:1)

您可以使用部分依赖关系图(PDP)。 scikit有一个用于GBM的内置PDP - http://scikit-learn.org/stable/modules/ensemble.html#partial-dependence,它是在弗里德曼的贪婪函数逼近文件http://statweb.stanford.edu/~jhf/ftp/trebst.pdf第26-28页中创建的。

如果您使用了scikit-learn GBM,请使用他们的PDP功能。如果您使用了另一个估算器,则可以创建自己的PDP,这是几行代码。您询问,PDP和此方法与算法无关。它只是不会扩展。

逻辑

  1. 获取您的培训数据
  2. 对于您正在检查的功能,获取所有唯一值或一些分位数以减少时间
  3. 采取独特的价值
  4. 对于您正在检查的功能,在所有观察中,将替换为(3)
  5. 中的值
  6. 预测所有训练观察
  7. 获取所有预测的平均值
  8. 绘制点(唯一值,平均值)
  9. 重复3-7,取下一个唯一值,直到不再有值
  10. 您现在拥有单向PDP。当特征增加(X轴)时,预测(y轴)平均发生什么。变化的幅度是多少。

    进一步分析,您可以在PDP上插入平滑的曲线或样条,这有助于理解这种关系。正如@Maxim所说,没有一个完美的规则,所以你在这里寻找趋势,试图理解一种关系。我们倾向于运行此功能以获得您最感兴趣的最重要的功能和/或功能。

    以上scikit-learn参考文献有更多例子。

    对于决策树,您可以使用Friedman所描述的算法快捷方式,并通过scikit-learn实现。你需要走树,所以代码绑定到包和算法,因此它不回答你的问题,我不会描述它。但它是在我引用的scikit-learn页面和论文中。

    def pdp_data(clf, X, col_index):
        X_copy = np.copy(X)
    
        results = {}
    
        results['x_values'] = np.sort(np.unique(X_copy[:, col_index]))
        results['y_values'] = []
    
        for value in results['x_values']:
            X_copy[:, col_index] = value
            y_predict = clf.predict_log_proba(X_copy)[:, 1]
            results['y_values'].append(np.mean(y_predict))
    
        return results
    

    编辑回答问题的新部分: 对于您的问题的补充,您正在寻找具有系数的线性模型。如果必须使用线性系数解释模型,请构建线性模型。

    有时您需要如何解释模型来指导您构建的模型类型。

答案 1 :(得分:0)

总的来说 - 没有。决策树的工作方式与此不同。例如,如果特征X> 1,则可以在引擎盖下具有规则。 100或X< 10和Y ='某些值'而不是答案是,如果50< X< 70 - 答案是否等。在决策树的实例中,您可能想要显示其结果并分析规则。根据我所知,使用RF模型是不可能的,因为你有很多树在幕后工作,每个都有独立的决策规则。

相关问题