python中的KFold到底是做啥的?

Posted

技术标签:

【中文标题】python中的KFold到底是做啥的?【英文标题】:What does KFold in python exactly do?python中的KFold到底是做什么的? 【发布时间】:2016-07-03 22:42:59 【问题描述】:

我正在看这个教程:https://www.dataquest.io/mission/74/getting-started-with-kaggle

我进入第 9 部分,进行预测。其中有一些数据位于名为 titanic 的数据框中,然后使用以下命令将其分成折叠:

# Generate cross validation folds for the titanic dataset.  It return the row indices corresponding to train and test.
# We set random_state to ensure we get the same splits every time we run this.
kf = KFold(titanic.shape[0], n_folds=3, random_state=1)

我不确定它到底在做什么以及 kf 是什么类型的对象。我尝试阅读文档,但没有太大帮助。还有就是三折(n_folds=3),为什么后面这行只访问train和test(我怎么知道叫train和test)?

for train, test in kf:

【问题讨论】:

【参考方案1】:

该过程有一个称为 k 的参数,它指的是给定数据样本要分成的组数。因此,该过程通常称为 k 折交叉验证。 When a specific value for k is chosen, it may be used in place of k in the reference to the model, such as k=10 becoming 10-fold cross-validation..

您可以参考这篇文章了解更多信息。 https://medium.com/@xzz201920/stratifiedkfold-v-s-kfold-v-s-stratifiedshufflesplit-ffcae5bfdf

【讨论】:

【参考方案2】:

分享我目前学到的有关 KF 的理论信息。

KFOLD 是一种模型验证技术,它不使用您的预训练模型。相反,它只是使用超参数并使用 k-1 个数据集训练一个新模型,并在第 k 个数据集上测试相同的模型。

K 个不同的模型仅用于验证。

它将返回基于第 k 个测试数据集的 K 个不同的分数(准确率百分比)。 而我们一般取平均值来分析模型。

我们对要分析的所有不同模型重复此过程。 简要算法:

    将数据拆分为训练和测试部分。 在此训练数据上训练了不同的模型,例如 SVM、RF、LR。
   2.a Take whole data set and divide in to K-Folds.
   2.b Create a new model with the hyper parameter received after training on step 1.
   2.c Fit the newly created model on K-1 data set.
   2.d Test on Kth data set
   2.e Take average score.
    分析不同的平均分数,从 SVM、RF 和 LR 中选出最佳模型。

这样做的原因很简单,我们通常存在数据缺陷,如果我们将整个数据集划分为:

    培训 验证 测试

我们可能会遗漏相对较小的数据块,这可能会使我们的模型过拟合。 也有可能一些数据在我们的训练中保持不变,并且我们没有针对这些数据分析行为。

KF 克服了这两个问题。

【讨论】:

【参考方案3】:

KFold 将提供训练/测试索引来拆分训练和测试集中的数据。它将数据集拆分为k 连续折叠(默认情况下不进行洗牌)。然后每个折叠使用一次验证集,而k - 1 剩余折叠形成训练集(source)。

假设您有一些从 1 到 10 的数据索引。如果您使用 n_fold=k,在第一次迭代中您将获得 i'th (i<=k) 折叠作为测试索引,其余的 (k-1) 折叠(没有i'th fold) 一起作为训练索引。

一个例子

import numpy as np
from sklearn.cross_validation import KFold

x = [1,2,3,4,5,6,7,8,9,10,11,12]
kf = KFold(12, n_folds=3)

for train_index, test_index in kf:
    print (train_index, test_index)

输出

折叠 1:[ 4 5 6 7 8 9 10 11] [0 1 2 3]

折叠 2:[ 0 1 2 3 8 9 10 11] [4 5 6 7]

折叠 3:[0 1 2 3 4 5 6 7] [ 8 9 10 11]

sklearn 0.20 的导入更新:

KFold 对象在 0.20 版本中移至 sklearn.model_selection 模块。要在 sklearn 0.20+ 中导入 KFold,请使用 from sklearn.model_selection import KFold。 KFold 当前文档source

【讨论】:

我明白了。无论 n_folds 是什么,您最终仍然只是一个测试集和一个训练集。如果 n_folds 为 2,那么您只需将一半数据用于训练,另一半用于测试,然后交换它们。我理解正确吗? 是的。您将获得第 i 个 (1 这不是一个准确的描述,术语验证集和测试集可以互换使用,这是不正确的。请看scikit-learn.org/stable/modules/cross_validation.html

以上是关于python中的KFold到底是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

DrawShadow 中的 Elevation 到底是做啥的?

pcap 中的 ntohs() 到底是做啥的?

张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做啥的? (三题)

Perl 的“祝福”到底是做啥的?

“npm audit fix”到底是做啥的?

.join() 方法到底是做啥的?