黑客/克隆 sklearn 以支持修剪决策树?

Posted

技术标签:

【中文标题】黑客/克隆 sklearn 以支持修剪决策树?【英文标题】:Hacking/cloning sklearn to support pruning Decision Trees? 【发布时间】:2015-03-20 08:01:38 【问题描述】:

我想创建一个决策树,然后在 python 中对其进行修剪。但是,sklearn 本身不支持剪枝。 通过互联网搜索,我发现了这个: https://github.com/sgenoud/scikit-learn/blob/4a75a4aaebd45e864e28cfca897121d1199e41d9/sklearn/tree/tree.py

但我不知道如何使用该文件。我试过了:

from sklearn.datasets import load_iris
import tree

clf = tree.DecisionTreeClassifier()
iris = load_iris()

clf = clf.fit(iris.data, iris.target)

但我收到错误 ValueError: Attempted relative import in non-package. 这不是我导入的方式吗?我需要以其他方式保存文件吗?谢谢。

【问题讨论】:

你使用哪个 sklearn 分支?原来的?由 sgenoud 分叉的那个?您是否从 fork 将 tree-python 文件下载到您的工作区?如果没有这些信息,我无法告诉您您的导入出了什么问题。 由 sgenoud 分叉的那个。我只下载了tree.py。不知道你说的工作区是什么意思。我的 iris 文件(如上所述)和 tree.py 保存在同一个文件夹 C:\Users\Beck\Anaconda\machine_learning 如果你真的想在 2012 年使用 scikit-learn 的 sgenoud's 7-year-old fork 或 git clonerepo 的基本目录,不要只是尝试复制/克隆单个文件。 ...但是这个想法听起来是错误的:您可以通过更改参数来获得较浅/修剪的树以提前停止DecisionTreeClassifier parameters max_depth, min_samples, min_samples_leaf, min_impurity_decrease, min_impurity_split。查看文档并使用参数,它们会满足您的要求。 【参考方案1】:

在 Python 中,模块(=其他语言中的包)通常定义相互依赖的例程。在这些情况下,您不能只下载一个 .py 文件并将其放入您的工作区(即您的源代码所在的目录)。相反,将整个包下载到该文件夹​​中,并相对导入,即像这样:

# a general import, should only be used if you are absolutely certain that there will be no namespace conflicts
from sklearn.tree.tree import * 
# a more "safe" way is to import the classes/functions you need explicitely
from sklearn.tree.tree import DecisionTreeClassifier

【讨论】:

【参考方案2】:

如果你真的想在 2012 年使用 scikit-learn 中的 sgenoud's 7-year-old fork 或 git clone 在 repo 的基本目录上,不要只是尝试复制/克隆单个文件(当然你会自 2012 年以来失去任何改进/修复;回到 v 0.12)

但这个想法听起来是错误的:您可以通过更改参数来获得较浅/修剪的树以提前停止DecisionTreeClassifier parameters max_depth, min_samples, min_samples_leaf, min_impurity_decrease, min_impurity_split。请参阅文档并使用参数,它们会满足您的要求。我从事 ML 已有 10 年以上,从未见过需要破解 DT 源。有很多充分的理由不这样做,也没有充分的理由这样做。

(如果您尝试使用 DecisionTreeClassifier 参数但仍然无法获得所需的内容,请在此处使用 iris 等开源数据集发布可重现的代码示例。)

【讨论】:

这是最好的答案,但如果有人想提出改进建议,请提出建议。一般来说,克隆陈旧 7 年历史的过时版本的实验分支是一个坏主意。特别是在这种情况下,因为一开始就没有必要,DecisionTreeClassifier 为您提供了很多旋钮来调整以修剪树木。【参考方案3】:

Scikit-learn 0.22 版在 DecisionTreeClassifier 中引入了剪枝。一个名为ccp_alpha 的新超参数可让您校准修剪量。请参阅文档here。

【讨论】:

以上是关于黑客/克隆 sklearn 以支持修剪决策树?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn-分类决策树

sklearn 决策树

sklearn库学习----决策树(分类树DecisionTreeClassifier)

决策树修剪的效果

以流水线方式输出决策树

决策树过拟合检验