Python 中的 K 折交叉验证

Manav Narula 2023年1月30日
  1. 在 Python 中需要交叉验证
  2. Python 中的 K 折交叉验证
  3. 在 Python 中使用 sklearn.model_selection.KFold 类实现 K-Fold
Python 中的 K 折交叉验证

在 Python 中,我们有很多机器学习算法。在对实时数据使用算法之前,我们可以使用数据集训练和测试有监督和无监督学习模型。

在 Python 中需要交叉验证

训练和测试模型的传统方法涉及将数据集拆分为训练和测试数据集。通常,火车与测试的比例为 70:30。

直接拆分数据集有一些缺点。

主要缺点与过度拟合有关。为了从模型中获得最佳性能,我们相应地调整超参数以提高模型在测试数据上的性能。

然而,在反复更改超参数的同时,我们将知识泄漏到模型中,增加了过度拟合测试数据的风险。

人们开始使用训练、测试和验证数据集来应对这种情况。

我们使用训练和验证数据集调整超参数。
但是,用于学习模型的样本数量受到显着影响和减少。

最近,人们开始使用 K-Fold 交叉验证技术来应对早期的问题。这是一项必不可少的技术,因为它可以帮助调整模型以选择具有最佳性能的模型。

Python 中的 K 折交叉验证

数据被拆分而不改组为 K 个连续折叠。现在,每个折叠都用于验证一次,而剩余的折叠形成训练集 (K - 1)。

简而言之,训练集的一部分用于验证。

让我们详细讨论一下。

我们将数据集分为训练和测试两部分,除此之外,训练数据集进一步分为 K-Folds。其中一部分用于验证,其余用于训练。

记录了该模型的超参数和性能。重复这些步骤,直到每个拆分都验证数据集。

每个折叠都记录了模型的性能和平均标准偏差。对不同的超参数值重复此操作,并选择性能最佳的模型。

在 Python 中使用 sklearn.model_selection.KFold 类实现 K-Fold

我们可以使用 sklearn 模块在 Python 中实现不同的机器学习算法和技术。model_selection.KFold 类可以在 Python 中实现 K-Fold 交叉验证技术。

KFold 类中,我们使用 n_splits 参数指定折叠,默认为 5。

我们还可以提供 shuffle 参数,决定是否在拆分前对数据进行混洗。默认为 False

random_state 参数还控制每个折叠的随机性。为此,需要将 shuffle 设置为 True

我们将使用这个类的一个实例和一个简单的 numpy 数组。

我们将为数组提供 split() 函数。此方法将返回数据集的索引。

例子:

from sklearn.model_selection import KFold
import numpy as np

x = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
k_fold = KFold(n_splits=3)
for indices_train, indices_test in k_fold.split(x):
    print(indices_train, indices_test)

输出:

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

在上面的示例中,我们将折叠数设置为 3。

在处理大型数据集时,我们通常将 K 的值设置为 5。随着数据集变小,K 的值往往会增加。

应该注意的是,在 sklearn 0.20 之前,KFold 类是 sklearn.cross_validation 模块的一部分。还有其他技术可用于 Python 中的数据交叉验证。

对于小型数据集,我们倾向于使用 LOOCV 技术。K-Fold 的其他改进版本是 StratifiedKFoldGroupKFold

ShuffleSplit 也是一种常用的交叉验证技术,我们有 StratifiedShuffleSplitGroupShuffleSplit 方法。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn