混洗的K倍和迭代K倍之间的区别

时间:2018-11-17 17:34:58

标签: python deep-learning

K折叠验证,您可以将数据分成大小相等的K个分区。对于每个分区i,在剩余的K – 1个分区上训练模型,并在分区i上进行评估。 您的最终分数就是获得的K分数的平均值。当您的模型的性能根据火车测试拆分显示出显着差异时,此方法很有用。

带换页的迭代K折叠验证适用于您可用数据相对较少并且需要尽可能精确地评估模型的情况。

它包括多次应用K折验证,改组 每次将数据拆分为K种方式之前。最终分数是 每次进行K折验证时获得的分数

如果有人可以通过示例代码或流程图来显示k折与k折之间的差​​异,我将无法理解一种工具的k折。

2 个答案:

答案 0 :(得分:0)

值得一提的是,问题正文的前三段是Deep Learning with Python by Francois Chollet第4.2.1章中的文本摘要。不幸的是,作者没有详细解释带混洗的迭代K折叠验证的概念。

我找到了这种解释,希望可以使概念更清晰:

三重交叉验证步骤:

  1. 随机播放数据
  2. 将您的数据拆分为k = 3个段(又称折叠)
  3. 针对每一个折痕:训练一个没有相关折痕的模型,并在左侧折痕上进行测试
  4. 所有k = 3折完成后,计算平均测试准确度(全部3折=)

迭代的K倍交叉验证(又名K交叉验证)重复/重复步骤1-4中描述的过程选定次数(例如100次)。您现在有100个平均分数(每个人都是重复执行步骤1-4的结果)。您获得这100个分数的平均值,该最终结果将代表您以稳健的方式获得的最终测试准确性,并且将对模型进行“尽可能精确的评估”。

K折验证和带混洗的迭代K折验证之间的关键区别似乎是在后面的步骤1-4中重复执行然后取平均值(代表最终测试精度),而在以前的步骤1-4中执行一次(不一定包括步骤1),并且在步骤4获得的分数代表您的最终测试精度。

由于用户 here ,该解释与@cbeleites supports Monica紧密相关。

答案 1 :(得分:0)

在阅读完Francois Chollet的Python深度学习之后,我也来到了这里。我在自己的代码中实现了迭代的K折交叉验证,并在此处发布以防其他人受益。

两者之间的区别是您是否实现外部循环以多次运行K折交叉验证。目的是计算平均值,以更准确地表示模型在测试集上的表现。希望这可以帮助。

import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold

model = RandomForestClassifier()

N_iterations = 10
N_folds = 5

# Initialize array to store the scores of each K-fold cross-validation
scores = np.zeros((N_iterations, N_folds))

# This loop is what makes it iterated K-fold validation
for i in range(N_iterations):

    skf = StratifiedKFold(n_splits=N_folds, shuffle=True)

    # This loops is traditional K-fold cross validation
    for j, (train_index, test_index) in enumerate(skf.split(X_train, y_train), 0):

        X_tr = X_train[train_index]
        X_te = X_train[test_index]

        y_tr = y_train[train_index]
        y_te = y_train[test_index]

        model.fit(X_tr, y_tr)

        scores[i][j] = model.score(X_te, y_te)

    print("Iteration", i+1, "avg: %.4f" % np.mean(scores[i]))

print("\nAvg score: %.4f" % np.mean(np.mean(scores, axis=1)))