`graphviz` 在决策树的每个节点内呈现的值是什么意思?
What do the values that `graphviz` renders inside each node of a decision tree mean?
对于使用来自 scipy
和 graphviz
的 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
#
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())
注意:可能需要安装外部包才能在本地查看数据(显然)
这是数据文件的 link:
https://cs.rit.edu/~jro/courses/intelSys/dtree-data
决策树是二叉树,其中每个节点代表数据的一部分。每个不是叶子的节点(根或分支)将其部分数据拆分为两个 sub-parts。根节点包含所有数据(来自训练集)。此外,这是一棵 class化树。它预测 class 概率 - 节点值。
Root/branch节点:
samples = 134
表示节点'contains'134个样本。因为它是根节点,这意味着树在 134 个样本上进行了训练。
value = [0.373, 0.627]
是 class 个频率。大约 1/3 的样本属于 class A,2/3 属于 class B.
gini = 0.468
是节点的gini impurity。它描述了 classes 的混淆程度。
F5 <= 0.5
数据的列名是什么?正确的。这意味着节点被拆分,使得特征F5
低于0.5的所有样本都向左child,特征高于0.5的样本向右child ].
叶节点:
- 这些节点不会进一步拆分,因此不需要
F <= something
字段。
samples = 90
/ 44
总和为 134。左侧有 90 个样本 child,右侧有 44 个样本 child。
values = [0.104, 0.567]
/ [0.269, 0.06]
是children中的class频率。左侧 child 中的大多数样本属于 class B(56% vs 10%),右侧 child 中的大多数样本属于 class A(27% v 6% ).
gini = 0.263
/ 0.298
是child节点中剩余的杂质。它们低于 parent 节点,这意味着拆分提高了 classes 之间的可分离性,但仍然存在一些不确定性。
对于使用来自 scipy
和 graphviz
的 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
#
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())
注意:可能需要安装外部包才能在本地查看数据(显然)
这是数据文件的 link: https://cs.rit.edu/~jro/courses/intelSys/dtree-data
决策树是二叉树,其中每个节点代表数据的一部分。每个不是叶子的节点(根或分支)将其部分数据拆分为两个 sub-parts。根节点包含所有数据(来自训练集)。此外,这是一棵 class化树。它预测 class 概率 - 节点值。
Root/branch节点:
samples = 134
表示节点'contains'134个样本。因为它是根节点,这意味着树在 134 个样本上进行了训练。value = [0.373, 0.627]
是 class 个频率。大约 1/3 的样本属于 class A,2/3 属于 class B.gini = 0.468
是节点的gini impurity。它描述了 classes 的混淆程度。F5 <= 0.5
数据的列名是什么?正确的。这意味着节点被拆分,使得特征F5
低于0.5的所有样本都向左child,特征高于0.5的样本向右child ].
叶节点:
- 这些节点不会进一步拆分,因此不需要
F <= something
字段。 samples = 90
/44
总和为 134。左侧有 90 个样本 child,右侧有 44 个样本 child。values = [0.104, 0.567]
/[0.269, 0.06]
是children中的class频率。左侧 child 中的大多数样本属于 class B(56% vs 10%),右侧 child 中的大多数样本属于 class A(27% v 6% ).gini = 0.263
/0.298
是child节点中剩余的杂质。它们低于 parent 节点,这意味着拆分提高了 classes 之间的可分离性,但仍然存在一些不确定性。