使用K-Fold训练决策树 - 这是正确的方法吗?

时间:2018-01-13 16:35:26

标签: python pandas validation scikit-learn

我使用了两种方法,使用相同的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旨在提供一种比较“独立实例”的方法,但我想确保是这种情况,而不是我的代码在某种程度上存在缺陷。

2 个答案:

答案 0 :(得分:1)

  

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

K-fold的目的是防止分类器过度拟合训练数据。因此,在每个折叠上,您保留一个单独的测试集,分类器没有看到并验证其准确性。您可以对预测进行平均,以了解分类器的效果。

  

这不仅仅是将9个独立的结果进行比较吗?

是的,您比较不同的分数,看看分类器的表现最佳

答案 1 :(得分:1)

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

此外,我建议您使用StratifiedKFold [2]代替KFold

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

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

所以你有平衡的标签。