【问题标题】:Training a decision tree with K-Fold - Is this the correct approach?使用 K-Fold 训练决策树 - 这是正确的方法吗?
【发布时间】:2018-06-22 20:09:39
【问题描述】:

我在同一个 SKlearn 决策树中使用了两种方法,一种方法使用验证集,另一种方法使用 K-Fold。但是,我不确定我是否真的通过使用 KFold 实现了任何目标。从技术上讲,交叉验证确实显示出 5% 的准确性提高,但我不确定这是否只是这个特定数据的特殊性导致了结果的偏差。

对于我的 KFold 实现,我首先使用以下方法将训练集拆分为多个部分:

 f = KFold(n_splits=8)
 f.get_n_splits(data)

然后使用

从中获取数据帧
y_train, y_test = y.iloc[train_index], y.iloc[test_index]

在一个循环中,正如许多关于如何做到这一点的在线教程所见证的那样。然而,棘手的部分来了。我看到的教程有一个 .train() 函数,我认为这个决策树分类器没有。相反,我只是这样做:

    tree = tree.DecisionTreeClassifier()
    tree.fit(X_train, y_train)
    predictions = tree.predict(X_test)

获得的准确度分数是:

Accuracy score: 0.79496591505
Accuracy score: 0.806502359727
Accuracy score: 0.800734137389
... and so on

但我不确定这样做是否真的让我的分类器变得更好,因为分数会上下波动。这不只是比较 9 个独立的结果吗? K-fold 的目的不是为了把分类器训练得更好吗?

我读过类似的问题,发现 K-fold 旨在提供一种在“独立实例”之间进行比较的方法,但我想确保情况确实如此,而不是我的代码在某些方面存在缺陷。

【问题讨论】:

    标签: python pandas validation scikit-learn


    【解决方案1】:

    K-fold 的目的不是为了把分类器训练得更好吗?

    K-fold 的目的是防止分类器过度拟合训练数据。因此,在每次折叠时,您都会保留一个分类器没有看到的单独测试集并验证其准确性。你平均你的预测,看看你的分类器的表现如何。

    这不只是比较 9 个独立的结果吗?

    是的,您可以比较不同的分数以了解您的分类器的表现如何

    【讨论】:

    • 好的。您知道为什么使用 k-fold 而不是仅使用验证集,准确率会提高 5% 吗?只是意外吗?
    • 所以在验证方法中。您将数据分为测试和训练。但是,如何公平划分是导致准确性低的一种方式。为了迎合它,我们进行了 k 折交叉验证。如果满足您的需求,您能接受答案吗?
    • @MateuszJ 在 KFold 中,您指定了 splits=8,这意味着每次大约 88% 的数据将用于训练,12% (100/8) 的数据用于测试。在您在上述评论中谈论的自定义验证集中,您是否使用相同数量的数据?我想不是。这就是准确性发生变化的原因。
    • 我的数据集非常大,所以我认为大小不会对其产生太大影响,但是谢谢,我想这可以解释它。
    • @MateuszJ 这是您所做的假设。交叉验证更具经验性。
    【解决方案2】:

    通常使用交叉验证可以防止过度拟合。为此,您将数据分成多个部分并评估损失、准确性或其他指标(例如f-1 score)。很好的介绍可以在官网[1]上找到。


    此外,我建议使用StratifiedKFold [2] 而不是KFold

    skf = StratifiedKFold(n_splits=8)
    skf.get_n_splits(X, y)
    

    此交叉验证对象是返回分层折叠的 KFold 的变体。通过保留每个类的样本百分比来进行折叠。

    所以你有平衡的标签。

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 2021-07-08
      • 2019-06-01
      • 2016-08-09
      • 2014-02-21
      • 2015-06-27
      • 2012-06-02
      • 2019-11-09
      • 2016-05-24
      相关资源
      最近更新 更多