我在数据集上训练了我的模型,并使用决策树来训练我的模型。它有3个输出类-是、完成和否。通过检查分类器的特征重要性,我了解了在做出决策时最具决定性的特征。我使用python和sklearn作为我的ML库。既然我已经找到了最具决定性的特征,我想知道这个特征是如何起作用的,因为如果关系是正的,那么如果特征值增加,就会导致是,如果是负的,就会导致否,以此类推,我也想知道它的大小。
我想知道是否有解决方案,也想知道一个独立于所选算法的解决方案,请尝试为所有算法提供不是特定于决策树而是通用解决方案的解决方案。
如果有什么方法可以告诉我,比如:
对于特征x1,关系为0.8*x1^2对于特征x2,关系为-0.4*x2
只是为了让我能够根据上的输入特征x1、x2等来分析输出
是否可以找出某个类的特定特征的高值,还是该特征的低值。
您可以使用部分依赖关系图(PDP)。scikit为他们的GBM-http://scikit-learn.org/stable/modules/ensemble.html#partial-Friedman的贪婪函数近似论文中创造的依赖性http://statweb.stanford.edu/~jhf/fftp/trebst.pdf第26-28页。
如果您使用scikit学习GBM,请使用其PDP功能。如果您使用另一个估计器,您可以创建自己的PDP,这是几行代码。正如你所问的,PDP和这种方法是算法无关的。它只是不会扩大。
逻辑
- 获取训练数据
- 对于您正在检查的功能,获取所有唯一值或一些分位数以减少时间
- 取唯一值
- 对于正在检查的特征,在所有观察中,用(3)中的值替换
- 预测所有训练观察结果
- 获取所有预测的平均值
- 绘制点(唯一值,平均值)
- 重复3-7,取下一个唯一值,直到不再有值为止
您现在有了一个单向PDP。当特征增加时(X轴),预测平均会发生什么(y轴)。变化的幅度是多少。
进一步分析,您可以将平滑曲线或样条曲线拟合到PDP,这可能有助于理解关系。正如@Maxim所说,没有完美的规则,所以你在这里寻找趋势,试图了解一段关系。我们倾向于为您感兴趣的最重要的功能和/或功能运行此功能。
上面的scikit学习参考资料有更多的例子。
对于决策树,您可以使用由Friedman描述并由scikit-learn实现的算法捷径。你需要遍历树,这样代码就与包和算法绑定在一起,因此它不会回答你的问题,我也不会描述它。但它在我引用的scikit学习页面和论文中。
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
编辑以回答问题的新部分:对于您的问题,您正在寻找一个带系数的线性模型。如果必须使用线性系数来解释模型,请构建线性模型。
有时,您需要如何解释模型来指导您构建什么类型的模型。
一般来说-没有。决策树的工作方式与此不同。例如,它可以有一条规则,即如果特征X>100或X<100;10和Y="某个值",则答案为是,如果50<X<70-答案是否等。在决策树的例子中,你可能想可视化它的结果并分析规则。就我所知,使用RF模型是不可能的,因为有很多树在引擎盖下工作,每个树都有独立的决策规则。