Python中的交叉验证:你需要知道的一切
已发表: 2020-02-14在数据科学中,验证可能是数据科学家用来验证 ML 模型的稳定性并评估其泛化到新数据的能力的最重要技术之一。 验证确保 ML 模型从数据集中提取正确(相关)模式,同时成功消除数据集中的噪声。 本质上,验证技术的目标是确保 ML 模型具有低偏差方差因子。
今天我们将详细讨论一种这样的模型验证技术——交叉验证。
目录
什么是交叉验证?
交叉验证是一种验证技术,旨在评估和评估统计分析(模型)的结果将如何推广到独立数据集。 交叉验证主要用于以预测为主要目标的场景,用户希望估计预测模型在现实世界中的表现如何。
交叉验证旨在通过在训练阶段测试模型来定义数据集,以帮助最大限度地减少过度拟合和欠拟合等问题。 但是,您必须记住,验证集和训练集必须从同一分布中提取,否则会导致验证阶段出现问题。
学习世界顶尖大学的数据科学认证课程。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
交叉验证的好处
- 它有助于评估模型的质量。
- 它有助于减少/避免过拟合和欠拟合的问题。
- 它使您可以选择将在看不见的数据上提供最佳性能的模型。
阅读:面向初学者的 Python 项目
什么是过拟合和欠拟合?
过度拟合是指模型变得对数据过于敏感并最终捕获大量噪声和随机模式而无法很好地推广到看不见的数据的情况。 虽然这样的模型通常在训练集上表现良好,但在测试集上表现不佳。
欠拟合是指模型未能在数据集中捕获足够多的模式,从而导致训练集和测试集的性能不佳的问题。
从这两个极端来看,完美的模型是在训练集和测试集上表现同样出色的模型。
资源
交叉验证:不同的验证策略
验证策略根据数据集中完成的拆分数量进行分类。 现在,让我们看看 Python 中不同的交叉验证策略。
1.验证集
这种验证方法将数据集分成两个相等的部分——50% 的数据集保留用于验证,剩余的 50% 保留用于模型训练。 由于这种方法仅基于给定数据集的 50% 来训练模型,因此总是有可能遗漏隐藏在其他 50% 数据中的相关且有意义的信息。 因此,这种方法通常会在模型中产生更高的偏差。
资源
Python代码:
训练,验证 = train_test_split(数据,test_size=0.50,random_state = 5)
2. 训练/测试拆分
在这种验证方法中,数据集分为两部分——训练集和测试集。 这样做是为了避免训练集和测试集之间的任何重叠(如果训练集和测试集重叠,模型就会出错)。 因此,确保用于模型的数据集不能在我们的数据集中包含任何重复的样本至关重要。 训练/测试拆分策略允许您基于整个数据集重新训练模型,而无需更改模型的任何超参数。
资源
然而,这种方法有一个明显的局限性——模型的性能和准确性在很大程度上取决于它的分割方式。 例如,如果拆分不是随机的,或者数据集的一个子集只有完整信息的一部分,则会导致过度拟合。 使用这种方法,您无法确定哪些数据点将在哪个验证集中,从而为不同的集创建不同的结果。 因此,只有当您手头有足够的数据时,才应使用训练/测试拆分策略。
Python代码:
>>> 从 sklearn.model_selection 导入 train_test_split
>>> X, y = np.arange(10).reshape((5, 2)), range(5)
>>> X
数组([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>>列表(y)
[0, 1, 2, 3, 4]
3. K折
如前两种策略所见,有可能遗漏数据集中的重要信息,这增加了偏差导致的错误或过拟合的可能性。 这就需要一种方法,既要为模型训练保留大量数据,又要为验证留下足够的数据。
输入 K 折验证技术。 在该策略中,数据集被分成“k”个子集或折叠,其中 k-1 个子集保留用于模型训练,最后一个子集用于验证(测试集)。 该模型对各个折叠进行平均,然后最终确定。 模型完成后,您可以使用测试集对其进行测试。

资源
在这里,每个数据点在验证集中只出现一次,而在训练集中保留 k-1 次。 由于大部分数据用于拟合,因此欠拟合问题显着减少。 同样,由于大部分数据也用于验证集中,因此消除了过度拟合的问题。
阅读: Python vs Ruby:完整的并排比较
K-fold 策略最适合数据量有限且折叠质量或它们之间存在不同最佳参数的情况。
Python代码:
从 sklearn.model_selection 导入 KFold # 导入 KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]]) # 创建一个数组
y = np.array([1, 2, 3, 4]) # 创建另一个数组
kf = KFold(n_splits=2) # 定义拆分 - 成 2 折
kf.get_n_splits(X) # 返回交叉验证器中的分裂迭代次数
打印(kf)
KFold(n_splits=2, random_state=None, shuffle=False)
4.留下一个
当 k 等于特定数据集中的样本数时,留一法交叉验证 (LOOCV) 是 K-fold 的一种特殊情况。 这里只为测试集保留一个数据点,数据集的其余部分是训练集。 因此,如果您使用“k-1”对象作为训练样本,使用“1”对象作为测试集,它们将继续遍历数据集中的每个样本。 当可用数据太少时,这是最有用的方法。
资源
由于这种方法使用所有数据点,因此偏差通常很低。 但是,由于验证过程重复“n”次(n = 数据点数),因此会导致更长的执行时间。 这些方法的另一个显着限制是,当您针对一个数据点测试模型时,它可能会导致测试模型有效性的更大变化。 因此,如果该数据点是异常值,则会产生更高的变异商。
Python代码:
>>> 将 numpy 导入为 np
>>> 从 sklearn.model_selection 导入 LeaveOneOut
>>> X = np.array([[1, 2], [3, 4]])
>>> y = np.array([1, 2])
>>> loo = LeaveOneOut()
>>> loo.get_n_splits(X)
2
>>> 打印(厕所)
LeaveOneOut()
>>> 对于 loo.split(X) 中的 train_index、test_index:
… 打印(“火车:”,train_index,“TEST:”,test_index)
… X_train, X_test = X[train_index], X[test_index]
… y_train, y_test = y[train_index], y[test_index]
… 打印(X_train,X_test,y_train,y_test)
火车:[1] 测试:[0]
[[3 4]] [[1 2]] [2] [1]
火车:[0] 测试:[1]
[[1 2]] [[3 4]] [1] [2]
5.分层
通常,对于训练/测试拆分和 K-fold,数据会被打乱以创建随机训练和验证拆分。 因此,它允许在不同的折叠中进行不同的目标分布。 同样,分层还有助于在拆分数据时在不同折叠上进行目标分布。
在这个过程中,数据在不同的折叠中重新排列,以确保每个折叠成为整体的代表。 因此,如果您正在处理一个二元分类问题,其中每个类包含 50% 的数据,您可以使用分层来排列数据,使每个类包含一半的实例。
分层过程最适合具有多类分类的小型和不平衡数据集。
Python代码:
从 sklearn.model_selection 导入 StratifiedKFold
skf = StratifiedKFold(n_splits=5, random_state=None)
# X是特征集,y是目标
对于 skf.split(X,y) 中的 train_index、test_index:
打印(“火车:”,train_index,“验证:”,val_index)
X_train, X_test = X[train_index], X[val_index]
y_train, y_test = y[train_index], y[val_index]
阅读: Python 中的数据框 – 教程
何时使用这五种交叉验证策略中的每一种?
正如我们之前提到的,每种交叉验证技术都有独特的用例,因此,当正确应用于正确的场景时,它们的性能最好。 例如,如果您有足够的数据,并且(模型的)不同拆分的分数和最佳参数可能相似,那么训练/测试拆分方法将非常有效。
但是,如果分数和最佳参数因不同的拆分而不同,则 K-fold 技术将是最好的。 对于数据太少的情况,LOOCV 方法效果最好,而对于小型且不平衡的数据集,分层是可行的方法。
我们希望这篇详细的文章能帮助您深入了解 Python 中的交叉验证。
如果您想了解数据科学,请查看 IIIT-B 和 upGrad 的数据科学执行 PG 计划,该计划是为在职专业人士创建的,提供 10 多个案例研究和项目、实用的实践研讨会、行业专家的指导、1与行业导师一对一,400 多个小时的学习和顶级公司的工作协助。
ML 中的“置换测试”是什么?
通过在数据集上生成测试统计量,然后对该数据的许多随机排列,使用排列测试来评估模型的统计显着性。 如果模型显着,则初始检验统计值应落入原假设分布的尾部之一。 要找到 p 值,您只需计算与初始测试统计量一样严重或更极端的测试统计量的数量,然后将该数字除以我们计算的测试统计量的总数。 鉴于原假设为真,P 值是获得至少与检验统计量一样严重的结果的机会。
机器学习中交叉验证的缺点是什么?
1. 交叉验证显着延长了训练周期。 以前,您只能在一个训练集上训练您的模型; 现在,您可以使用交叉验证在多个训练集上对其进行训练。
2.在大多数情况下,您正在研究的结构在预测建模中会随着时间的推移而发展。 因此,您可能会注意到训练集和验证集的变化。
3.交叉验证需要大量的计算能力。
如何检测 ML 模型中的过度拟合?
在评估数据之前,检测过拟合几乎是不可能的。 它可以帮助解决泛化数据集的困难,这是过拟合的一个内在特征。 因此,可以将数据划分为不同的子集,以使训练和测试更容易。 在两个数据集中看到的准确率比例可用于确定是否存在过度拟合。 如果模型在训练集上的表现优于在测试集上的表现,则可能是过度拟合。
另一个建议是从一个非常基本的 ML 模型开始作为基线。 稍后,当您测试复杂的算法时,您将有一个基准来判断增加的复杂性是否值得。
准确性和损失等验证措施也可用于检测过拟合。 当模型受到过度拟合的影响时,验证度量通常会增长,直到它们达到稳定水平或开始下降。