使用 scikit-learn 时,如何找到我的树分裂的属性?

Posted

技术标签:

【中文标题】使用 scikit-learn 时,如何找到我的树分裂的属性?【英文标题】:How do I find which attributes my tree splits on, when using scikit-learn? 【发布时间】:2013-12-08 01:07:38 【问题描述】:

我一直在探索 scikit-learn,制作具有熵和基尼分裂标准的决策树,并探索其中的差异。

我的问题是,我如何“打开引擎盖”并准确找出树在每个级别上分裂的属性以及它们的相关信息值,以便我可以看到这两个标准在哪里做出不同的选择?

到目前为止,我已经探索了文档中列出的 9 种方法。他们似乎不允许访问此信息。但是这些信息肯定是可以访问的吗?我正在设想一个包含节点和增益条目的列表或字典。

感谢您的帮助,如果我遗漏了一些非常明显的事情,我深表歉意。

【问题讨论】:

【参考方案1】:

直接来自文档(http://scikit-learn.org/0.12/modules/tree.html):

from io import StringIO
out = StringIO()
out = tree.export_graphviz(clf, out_file=out)

Python3 不再支持StringIO 模块,而是导入io 模块。

您的决策树对象中还有tree_ 属性,它允许直接访问整个结构。

你可以简单地阅读它

clf.tree_.children_left #array of left children
clf.tree_.children_right #array of right children
clf.tree_.feature #array of nodes splitting feature
clf.tree_.threshold #array of nodes splitting points
clf.tree_.value #array of nodes values

更多详情请查看source code of export method

一般你可以使用inspect 模块

from inspect import getmembers
print( getmembers( clf.tree_ ) )

获取对象的所有元素

【讨论】:

“左”总是“真”值,右是“假”吗? 第一个链接坏了 如何从图中获取样本值? 链接已失效。【参考方案2】:

如果您只想快速查看树中发生的情况,请尝试:

zip(X.columns[clf.tree_.feature], clf.tree_.threshold, clf.tree_.children_left, clf.tree_.children_right)

其中X是自变量的数据框,clf是决策树对象。请注意,clf.tree_.children_leftclf.tree_.children_right 一起包含进行拆分的顺序(每个都对应于 graphviz 可视化中的一个箭头)。

【讨论】:

【参考方案3】:

Scikit learn 在 0.21 版(2019 年 5 月)中引入了一种名为 export_text 的美味新方法,用于查看树中的所有规则。 Documentation here。

拟合模型后,您只需要两行代码。一、导入export_text

from sklearn.tree.export import export_text

其次,创建一个包含您的规则的对象。为了使规则看起来更具可读性,请使用 feature_names 参数并传递您的功能名称列表。例如,如果您的模型名为 model,并且您的特征在名为 X_train 的数据框中命名,您可以创建一个名为 tree_rules 的对象:

tree_rules = export_text(model, feature_names=list(X_train))

然后打印或保存tree_rules。您的输出将如下所示:

|--- Age <= 0.63
|   |--- EstimatedSalary <= 0.61
|   |   |--- Age <= -0.16
|   |   |   |--- class: 0
|   |   |--- Age >  -0.16
|   |   |   |--- EstimatedSalary <= -0.06
|   |   |   |   |--- class: 0
|   |   |   |--- EstimatedSalary >  -0.06
|   |   |   |   |--- EstimatedSalary <= 0.40
|   |   |   |   |   |--- EstimatedSalary <= 0.03
|   |   |   |   |   |   |--- class: 1

【讨论】:

父母们,有没有可能把这个结构转换成一组叶子? 注意:FutureWarning: The sklearn.tree.export module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.tree. Anything that cannot be imported from sklearn.tree is now part of the private API. 我有很多功能,我正在研究 jupyter notebook。你知道我应该使用哪个命令来不让所有东西都在同一行(但“扩展”在右边)吗?

以上是关于使用 scikit-learn 时,如何找到我的树分裂的属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 时,如何找到我的树分裂的属性?

如何知道使用 Scikit-learn 构建的树的大小(节点数)?

使用 Scikit-Learn 在 Python 中绘制随机森林的树

可以在 scikit-learn 中修改/修剪学习的树吗?

如何在 CHM 文件左侧的树视图中设置 Selected 项

使用 scikit-learn PCA 找到具有最高方差的维度