“graphviz”在决策树的每个节点中呈现的值是什么意思?

8

这里输入图片描述

针对上图,我使用了来自scipygraphviz的AdaBoostClassifier库,创建了这个子树可视化图,我需要帮助解释每个节点中的值。比如,“gini”是什么意思?“samples”和“value”字段的含义是什么?属性F5 <= 0.5是什么意思?

以下是我的代码(我全部在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://dev59.com/jlYO5IYBdhLWcg3wMO1y 

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个回答

17
决策树是一棵二叉树,其中每个节点表示数据的一部分。非叶子节点(根节点或分支节点)将其数据部分分成两个子部分。根节点包含所有数据(来自训练集)。此外,这是一棵分类树。它预测类别概率 - 节点值。
根/分支节点:
- `samples = 134` 表示节点“包含”134个样本。由于这是根节点,这意味着树是在134个样本上训练的。 - `value = [0.373, 0.627]` 是类频率。约1/3的样本属于A类,2/3属于B类。 - `gini = 0.468` 是节点的基尼不确定性。它描述了类别有多么混杂。 - `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% vs 10%),右侧子节点中的大多数样本属于A类(27% v 6%)。
  • gini = 0.263 / 0.298是子节点中剩余的杂质。它们比父节点中的杂质更低,这意味着分裂提高了类别之间的可分性,但仍然存在一些不确定性。

1
只是一点小提示,其他用户可能会发现图形化显示的类概率值列表以百分比或千分比格式进行格式化。例如,假设有一个三类问题。当您在根节点中有一个值列表[29、38、33],在另一个节点中有一个值列表[0、11、8]时,请不要惊讶。这意味着:在该节点中覆盖了1类的29个样本中的0个,2类的38个样本中的11个,以及3类的33%概率中的8个百分点。 - questionto42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接