验证决策树图

Posted

技术标签:

【中文标题】验证决策树图【英文标题】:Verifying the decision tree graph 【发布时间】:2020-04-17 23:29:53 【问题描述】:

我以下列方式创建了决策树模型。

# first create the model
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from IPython.display import Image  
from sklearn import tree
import pydotplus
import pandas as pd
iris = datasets.load_iris()

X = iris.data
y = iris.target
clf = DecisionTreeClassifier(random_state=0)
clf.fit(X, y);

X = pd.DataFrame(X, columns=["sepal_length","sepal_width","petal_length","petal_width"])
# converted to data frame for easy analysis

然后按以下方式绘制图形

import pydotplus
# Create DOT data
dot_data = tree.export_graphviz(clf, out_file=None, feature_names=X.columns, 
class_names = iris.target_names)
# Draw graph
graph = pydotplus.graph_from_dot_data(dot_data)  
# Show graph
Image(graph.create_png())

我找到了以下结果

我在第 3a 阶段获取了数据子集。

X3a = X.query("petal_width >.8 and petal_width <=1.75")

并为每一列创建了一个查找基尼指数的函数。

 def gini2(x):
        # (Warning: This is a concise implementation, but it is O(n**2)
        # in time and memory, where n = len(x).  *Don't* pass in huge
        # samples!)
        # Mean absolute difference
        mad = np.abs(np.subtract.outer(x, x)).mean()
        # Relative mean absolute difference
        rmad = mad/np.mean(x)
        # Gini coefficient
        g = 0.5 * rmad
        return g

终于在第3a阶段验证了每列数据的基尼指数

gini2( X3a["sepal_length"] ) # returns 0.051
gini2( X3a["sepal_width"] ) # returns 0.063
gini2( X3a["petal_length"] ) # returns 0.0686
gini2( X3a["petal_width"] ) # returns 0.08, highest among all the columns

我发现最高基尼指数是petal_width (0.08)。所以我预计这个阶段的分裂会在petal_width上。但是图片显示分割是在petal_length上。 有人可以解释为什么使用petal_length(用于分割)而不是petal_width吗?

【问题讨论】:

【参考方案1】:

我终于找到了问题的答案。

“根据最大信息增益进行拆分。在第 3a 阶段(如上所示),petal_length 上的拆分产生最大的信息增益(即使petal_length 在列中没有最高的基尼值)”

【讨论】:

以上是关于验证决策树图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 r studio 中缩小决策树图?

在 jupyter notebook 中显示 scikit 决策树图

python 决策树图

如何使用 export_graphviz 显示决策树图

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

如何使用 R 在随机森林中生成决策树图和变量重要性图?