【问题标题】:Python - scikit-learn: how to specify a validation subset in decision and regression trees?Python - scikit-learn:如何在决策树和回归树中指定验证子集?
【发布时间】:2015-01-30 21:35:24
【问题描述】:

我正在尝试使用 Python 构建决策树和回归树。我正在使用 sci-kit,但对替代品持开放态度。

我不明白这个库是否可以提供训练和验证子集,以便库在训练子集上构建模型,在验证上对其进行测试并根据某些规则停止拆分(通常当额外的拆分不会导致验证子集的性能更好时——这可以防止过度拟合)。 例如,这就是 JMP 软件所做的 (http://www.jmp.com/support/help/Validation_2.shtml#1016975)。

我在官方网站 (http://scikit-learn.org/stable/modules/tree.html) 和互联网上都没有提到如何使用验证子集。

非常欢迎任何帮助!谢谢!

【问题讨论】:

  • Sklearn 将交叉验证工具与分类器分开,我认为这是一种更优雅的做事方式。有关示例,请参见 herehere

标签: python scikit-learn decision-tree


【解决方案1】:

scikit learn cross validation section of the userguide 中有一组相当丰富的交叉验证例程和示例。

请注意,SK-Learn 0.14 版和 0.15 版之间的交叉验证似乎已经取得了很大进展,因此如果您还没有升级到 0.15,我建议您升级到 0.15。

正如 jme 在他的评论中所指出的,一些交叉验证功能也已被纳入 SK-learn 的网格搜索和管道功能中。

为了完整回答您的问题,这里是一个简单的示例,但更高级的 k-fold、leave-one-out、leave-p-out、shuffle-split 等都可用:

import numpy as np
from sklearn import cross_validation
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()
iris.data.shape, iris.target.shape
((150, 4), (150,))

X_train, X_test, y_train, y_test = cross_validation.train_test_split(iris.data,
                                                                     iris.target,
                                                                     test_size=0.4,
                                                                     random_state=0)

X_train.shape, y_train.shape
((90, 4), (90,))
X_test.shape, y_test.shape
((60, 4), (60,))

clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
clf.score(X_test, y_test)                           
0.96...

我希望这会有所帮助...祝你好运!

【讨论】:

  • 这里也是recursive feature elimination 使用支持向量分类器的示例,该分类器可以轻松切换到决策树。
  • 这非常有用,但恐怕这与我的想法不太一样——或者,如果是的话,我会感到困惑。我想复制这个 JMP 功能:jmp.com/support/help/Partition_Method.shtml#1036390> >当您单击 Go 按钮时,平台会重复 > 拆分,直到验证 R-Square 优于 >next 10 拆分将获得的结果。换句话说,我希望一些停止修剪规则基于模型在样本外(测试/验证/我们想称之为的)数据集上的性能。
  • 相反,如果我理解正确,上面的例子展示了如何评估样本外的性能,而不是根据样本外的性能来修剪模型。我还注意到这里: scikit-learn.org/stable/modules/tree.html> 它说:“修剪(目前不支持)”
  • 本质上,您要查找的内容很像 SK-Learn 所拥有的random forests regressor/classifier。我知道您可能正在寻找相当于 JMP 的苹果对苹果,但您可能想检查一下。随机森林是一种元估计器,它在数据集的各种子样本上拟合多个决策树分类器,并使用平均来提高预测准确性和控制过拟合。
  • 不完全。但是,我想我可以自己编写一个类似于 JMP 的停止规则:假设我从 max_depth = 4 开始。我在样本外检查树的分数。然后我增加 max_depth 直到样本外的分数不再增加。 mytree.fit(x_train,y_train) mytree.score(x_test,y_test)
猜你喜欢
  • 2017-02-23
  • 2020-04-05
  • 2019-03-25
  • 2020-09-16
  • 2014-06-26
  • 2017-03-26
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多