您可以使用部分依赖图 (PDP)。 scikit 为他们的 GBM 提供了一个内置的 PDP - http://scikit-learn.org/stable/modules/ensemble.html#partial-dependence,它是在弗里德曼的贪婪函数逼近论文 http://statweb.stanford.edu/~jhf/ftp/trebst.pdf pp26-28 中创建的。
如果您使用 scikit-learn GBM,请使用他们的 PDP 功能。如果您使用了另一个估算器,您可以创建自己的 PDP,这只是几行代码。如您所问,PDP 和此方法与算法无关。它只是不会扩展。
逻辑
- 获取您的训练数据
- 对于您正在检查的特征,获取所有唯一值或一些分位数以减少时间
- 取唯一值
- 对于您正在检查的特征,在所有观察中,替换为 (3) 中的值
- 预测所有训练观察结果
- 获取所有预测的平均值
- 绘制点(唯一值,均值)
- 重复 3-7 以获取下一个唯一值,直到没有更多值为止
您现在有一个单向 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
已编辑以回答问题的新部分:
除了你的问题,你正在寻找一个带有系数的线性模型。如果必须用线性系数解释模型,请建立线性模型。
有时您需要如何解释模型会指导您构建什么类型的模型。