决策树中如何计算特征重要性?举个例子

决策树中如何计算特征重要性?举个例子

理解背后的数学

决策树是最流行的 ML 算法之一,它被用作大多数 bagging 和 boosting 技术的弱学习器,无论是 RandomForest 还是 Gradient Boosting。

笔记: 需要围绕决策树的基础知识才能继续前进

决策树的 sklearn 实现的一大优势是 feature_importances_,它可以帮助我们了解哪些特征与其他特征相比实际上是有用的。

但为什么我们首先需要特征重要性?

为此,您需要访问我上一篇关于原因的帖子 人工智能中的可解释性和可解释性 很重要,如果忽略会产生什么后果。

希望您阅读了上面的帖子,我们现在可以继续了解特征重要性计算背后的数学原理。首先假设

我们有一个二元分类问题来预测一个动作是“有效”还是“无效”

我们有 3 个功能,即响应大小、延迟和总展示次数

我们已经在训练数据上训练了一个决策树分类器

训练数据有 2k 个样本,两个类具有相同的表示

所以,我们已经有了一个训练有素的模型。现在我们将跳到计算feature_importance。但在此之前,让我们看看我们训练过的决策树的结构

Trained Decision Tree

训练和预处理的代码片段已被跳过,因为这不是帖子的目标。不过,下面的代码片段可以帮助您像上面一样可视化您的训练模型

 将 matplotlib.pyplot 导入为 plt  
 从 sklearn 导入树 #dt_model 是一个 DecisionTreeClassifier 对象  
 #df 是训练数据集 fig = plt.figure(figsize=(15,7)) _ = tree.plot_tree(dt_model,feature_names = df.columns,  
 填充=真)

了解几个参数

基尼指数 用作杂质测量。

上图中的值是每个节点上两个类的总样本,即如果 value=[24,47],当前节点从类 1 接收到 24 个样本,从类 2 接收到 47 个样本。

计算特征重要性涉及 2 个步骤

计算每个节点的重要性

使用该特征上的节点重要性拆分计算每个特征的重要性

因此,为了计算特征重要性,我们首先需要计算决策树中每个节点的重要性。

怎么做?

重要性_节点ₖ =

_(%of_sample_reaching_Nodeₖ X Impurity_Nodeₖ -

_%of_sample_reaching_left_subtree_NodeₖX Impurity_left_subtree_Nodeₖ-

_%of_sample_reaching_right_subtree_NodeₖX Impurity_right_subtree_Nodeₖ) / 100

让我们计算每个节点的重要性(左→右,上→下)

  • 第一个节点:值=[1000,1000]

=(100 x 0.5 — 52.35 x 0.086 —47.65 x 0) / 100

=(50–4.5)/100 = 0.455

我们如何在上述等式中得到 100、52.35 和 47.65?

100*2000/2000=100%

100*1047/2000(左子树)= 52.35%

100*953/2000(左子树)= 47.65%

其余节点遵循相同的逻辑

  • 第二个节点:值=[1000,47]

=( 52.35 x 0.086 — 48.8 x 0 — 0.035 x 0.448)/100

= 4.48/100=0.0448

  • 第三个节点:值=[24,47]

= ( 0.035 x 0.448–0.024x0.041–0)

= 0.014/100 = 0.00014

:第 4 个节点:值 = [1,47]

=(0.024x0.041–0–0)/100

=0.0000098

第一步完成了,我们现在开始计算每个特征的特征重要性。

公式很简单,

特征 K= 的特征重要性

Σnode 对特征 K / Σ 所有节点的重要性的重要性拆分

这意味着分子是所有节点重要性的总和,这些节点在所有节点重要性的总和上分裂在特定特征 K

重要性总展示次数:

由于总印象数上只有第一个节点分裂,在分子中我们将只考虑第一个节点的节点重要性

=0.455/ (0.00098+0.00014+0.0448+0.455)

=0.455/0.5=0.91

重要性总响应大小:

考虑分子中的第二和第三节点

(0.048+0.00014)/ (0.00098+0.00014+0.0448+0.455)

=0.062/0.5=0.124

重要性延迟:

0.00098/ (0.00098+0.00014+0.0448+0.455)

=0.00098/0.5=0.002

因此,我们可以看到总展示次数是最关键的特征,其次是总响应大小。

我们的答案是否与 python 给出的答案相符?

正如我们所看到的,该值在条形图中看起来 lumsum 相同。

这是一个包装 !!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/36918/57251609

posted @ 2022-09-16 09:58  哈哈哈来了啊啊啊  阅读(986)  评论(0编辑  收藏  举报