在特征重要性的上下文中解释决策树

数据挖掘 机器学习 可视化 scikit-学习 数据 决策树
2021-09-16 04:31:55

我试图了解如何充分理解用 sklearn 构建的决策树分类模型的决策过程。我正在研究的两个主要方面是树的图形表示和特征重要性列表。我不明白的是如何在树的上下文中确定特征重要性。例如,这是我的特征重要性列表:

特征排名:1. FeatureA (0.300237)

  1. 特征 B (0.166800)

  2. 特征 C (0.092472)

  3. 特色 D (0.075009)

  4. 特征 E (0.068310)

  5. 特征 F (0.067118)

  6. 特征G (0.066510)

  7. 特征 H (0.043502)

  8. 特征 I (0.040281)

  9. 特征J (0.039006)

  10. 特征K (0.032618)

  11. 特征 L (0.008136)

  12. 特征M (0.000000)

但是,当我查看树的顶部时,它看起来像这样:树片段

事实上,一些被评为“最重要”的特征直到树的更下方才会出现,而树的顶部是 FeatureJ,它是排名最低的特征之一。我幼稚的假设是,最重要的特征将排在树的顶部附近以产生最大的影响。如果这是不正确的,那么是什么使功能“重要”?

4个回答

一个特征越重要,它的节点在决策树上的位置就越高,这是不必要的。

这仅仅是因为不同的标准(例如基尼杂质、熵信息增益、MSE 等)可以用于这两种情况(拆分与重要性)中的每一种。

例如,SkLearn您可以选择根据熵信息增益标准(参见criterion& 'entropy'at SkLearn)在决策树上拆分节点,而特征的重要性由 Gini Importance 给出,它是 Gini 的平均减少随机森林的所有树中给定变量的杂质(参见feature_importances_atSkLearnhere)。

如果我是对的,SkLearn即使您选择根据 Gini Impurity 标准在决策树上拆分节点,而特征的重要性由 Gini Importance 给出,因为 Gini Impurity 和 Gini Importance 并不相同,这同样适用(另请参阅Stackoverflow 上关于 Gini Importance 的thisthis )。

在 scikit-learn 中,特征重要性是节点杂质的减少。关键是它仅在节点级别衡量重要性。然后,所有节点都根据到达该节点的样本数加权。

因此,如果在第一次拆分后只有少数样本最终到达左侧节点,这可能并不意味着 J 是最重要的特征,因为左侧节点上的增益可能只影响很少的样本。如果您另外打印出每个节点中的样本数量,您可能会更好地了解正在发生的事情。

仅仅因为树上的节点较低并不一定意味着它不那么重要。sci-kitlearn 中的特征重要性是通过纯粹的节点分离类别(基尼指数)来计算的。即使在您的裁剪树中,您也会注意到 A 与 J 的一次相比被分裂了三倍,并且 A 节点中的熵分数(与 Gini 类似的纯度度量)在 A 节点中略高于 J。

但是,如果您只能选择一个节点,您会选择 J,因为这会产生最佳预测。但是,如果您可以选择让许多节点做出几个不同的决定,那么 A 将是最佳选择。

变量重要性是通过删除变量时模型准确性的降低来衡量的。使用不带变量的新模型创建的新决策树可能看起来与原始树非常不同。图表中的拆分决策是在考虑模型中的所有变量时完成的。

在根(和其他节点)拆分什么变量是通过杂质来衡量的。良好的纯度(例如:左分支中的所有内容都具有相同的目标值)并不能保证良好的准确性。你的数据可能有偏差,你的右分支比左分支有更多的响应。因此,仅仅正确分类左分支是不行的,我们还需要考虑右分支。因此,分裂变量可能是也可能不是整体模型准确性的重要变量。

变量重要性是变量选择的更好度量。