`graphviz` 在决策树的每个节点内呈现的值是啥意思?

Posted

技术标签:

【中文标题】`graphviz` 在决策树的每个节点内呈现的值是啥意思?【英文标题】:What do the values that `graphviz` renders inside each node of a decision tree mean?`graphviz` 在决策树的每个节点内呈现的值是什么意思? 【发布时间】:2018-05-10 06:10:40 【问题描述】:

对于使用scipygraphviz 中的AdaBoostClassifier 库的上图,我能够创建这个子树视觉效果,我需要帮助解释每个节点中的值吗?例如,“gini”是什么意思? “样本”和“值”字段的意义是什么?属性 F5

这是我的代码(我都是在 jupyter notebook 中完成的):

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
%matplotlib inline

f = open('dtree-data.txt')
d = dict()
for i in range(1,9):
    key = 'F' + str(i)
    d[key] = []
d['RES'] = []
for line in f:
    values = [(True if x == 'True' else False) for x in line.split()[:8]]
    result = line.split()[8]
    d['RES'].append(result)
    for i in range(1, 9):
        key = 'F' + str(i)
        d[key].append(values[i-1])
df = pd.DataFrame(data=d, columns=['F1','F2','F3','F4','F5','F6','F7','F8','RES'])

from sklearn.model_selection import train_test_split

X = df.drop('RES', axis=1)
y = df['RES']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier()
ada.fit(X_train, y_train)

from IPython.display import Image
from sklearn.externals.six import StringIO
from sklearn.tree import export_graphviz
import pydot

# https://***.com/questions/46192063/not-fitted-error-when-using-sklearns-graphviz 

sub_tree = ada.estimators_[0]
dot_data = StringIO()
features = list(df.columns[1:])
export_graphviz(sub_tree, out_file=dot_data,feature_names=features,filled=True,rounded=True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())  
Image(graph[0].create_png())

注意:可能需要安装外部包才能在本地查看数据(显然)

这是数据文件的链接: https://cs.rit.edu/~jro/courses/intelSys/dtree-data

【问题讨论】:

【参考方案1】:

决策树是一棵二叉树,其中每个节点代表数据的一部分。每个不是叶子(根或分支)的节点都将其数据部分拆分为两个子部分。根节点包含所有数据(来自训练集)。此外,这是一个分类树。它预测类概率 - 节点值。

根/分支节点:

samples = 134 表示节点“包含”134 个样本。因为它是根节点,这意味着这棵树在 134 个样本上进行了训练。 value = [0.373, 0.627] 是班级频率。大约 1/3 的样本属于 A 类,2/3 属于 B 类。 gini = 0.468 是节点的gini impurity。它描述了类的混合程度。 F5 <= 0.5数据的列名是什么?正确的。这意味着该节点被拆分,以便所有特征F5 低于 0.5 的样本进入左孩子,而特征高于 0.5 的样本进入右孩子。

叶节点:

这些节点没有进一步拆分,因此不需要F <= something 字段。 samples = 90 / 44 总和为 134。左孩子有 90 个样本,右孩子有 44 个样本。 values = [0.104, 0.567] / [0.269, 0.06] 是孩子们的班级频率。左孩子的大多数样本属于 B 类(56% 对 10%),右孩子的大多数样本属于 A 类(27% 对 6%)。 gini = 0.263 / 0.298是子节点中剩余的杂质。它们低于父节点,这意味着拆分提高了类之间的可分离性,但仍然存在一些不确定性。

【讨论】:

只是一个旁注,其他用户可能会在以百分比或千分之一格式格式的 graphviz 框中找到类概率的值列表。例如,假设一个 3 类问题。不要怀疑根节点中有 [29, 38, 33] 之类的值列表,另一个节点中有 [0, 11, 8] 之类的值列表。这意味着:该节点涵盖了第 1 类的 29 个中的 0 个、第 2 类的 38 个中的 11 个以及第 3 类的 33% 概率中的 8 个百分点。

以上是关于`graphviz` 在决策树的每个节点内呈现的值是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

管道内决策树的可视化

安装graphviz,没有名为graphviz的模块

使用 Graphviz 显示此决策树

如何找到决策树中每个叶子或节点的索引?

《统计学习方法》读书笔记之决策树

更改使用导出 graphviz 创建的决策树图的颜色