Sklearn 中的 K-Fold 交叉验证2024 年 08 月 29 日 | 阅读 9 分钟 从数据收集开始,创建用于训练和验证模型的训练数据集是提高模型性能最常见的机器学习方法。数据集的划分比例可以是 70:30 或 80:20。留出法是最常见的交叉验证方法。 这种方法的问题在于,我们不确定模型良好的验证准确率是否真的代表一个好的模型。如果用于验证的数据集部分恰好表现良好,该怎么办?如果我们使用不同的数据集部分作为验证集,我们的模型是否仍然能给出高准确率?K 折交叉验证可以解决其中一些疑问。 什么是交叉验证?当我们必须训练一个具有良好性能得分的机器学习模型时,将数据集划分为训练集和验证集是基本且重要的操作。我们必须在未见过的数据集(验证集)上测试我们的模型,以评估它是否过拟合。 如果模型在实际的实时数据上表现不佳,并且在验证集上也无法获得良好的准确率,那么它在实际应用中的性能就会很差。考虑到这一点,交叉验证可能是最重要的机器学习概念之一,它保证了我们模型的鲁棒性。 交叉验证本质上是一种过程,它将数据集的一部分用于模型的验证和测试,而其余的数据集则用于模型的训练。 使用交叉验证的好处
多种交叉验证类型
什么是 K 折交叉验证?K 折交叉验证方法广泛用于计算机器学习模型在验证数据集上的性能。 尽管 10 是 K 的一个常见选择,但我们如何确定这个折数适合给定的数据集和模型呢? 一种方法是研究不同 K 选择对模型性能估计的影响,并将其与理想测试条件进行比较。这有助于选择正确的折数。 一旦确定了 K 值,我们就可以用它来评估数据集上的各种模型。然后,我们可以将得分模式与同一模型在理想测试场景下的分析得分进行对比,看看它们是否高度相关。如果结果相关,就证实所选配置是理想测试场景的可靠近似。 本教程将教读者如何设置和评估 K 折交叉验证的配置。 K 折交叉验证方法的流程总的来说,遵循以下步骤:
值得注意的是,数据集中的每一项都被分配了一个唯一的组,并且在该过程的整个过程中都保持在该组中。这意味着每个数据样本都有 k 次机会成为训练集的一部分,并有 k 次机会成为留出集或验证集的一部分。 在拟合模型之前完成的所有数据准备都必须在 CV 分配的训练数据集的循环中完成,而不是在整个数据集上完成。这也适用于任何超参数调优。如果在循环之外进行这些过程,可能会导致数据泄露和模型能力评估的夸大。 K 折交叉验证测试示例代码 输出 Accuracy score of each fold: [0.9122807017543859, 0.9473684210526315, 0.9736842105263158, 0.9736842105263158, 0.9557522123893806] Mean accuracy score: 0.952553951249806 使用 cross_val_score() 进行交叉验证我们可以使用 cross_val_score 类方法来简化上述代码。 代码 输出 Accuracy score of each fold: [0.9122807017543859, 0.9473684210526315, 0.9736842105263158, 0.9736842105263158, 0.9557522123893806] Mean accuracy score: 0.952553951249806 K 折交叉验证方法有助于在较小的数据集上训练模型。如果我们的数据量很大,则可能不需要 K 折交叉验证。其原因是我们的验证数据集有足够多的记录,可以让我们验证机器学习模型的性能。在大型数据集上使用 K 折交叉验证测试会花费大量时间。 此外,使用更多的折数来验证我们的模型会消耗更多的计算能力。对于较大的 K 值,模型将花费更多时间进行训练。如果 K 为 5,则模型将使用五个不同的验证数据集折进行五次独立的训练。如果 K=10,模型则运行十次。 K 的敏感性分析K 折交叉验证测试最重要的调优参数是 K 值,它指定了将给定数据集划分为多少个折。 对于平均大小的数据集,通常选择 K=3、K=5 和 K=10。据观察,K=10 在所有值中被最广泛地用于评估我们训练的模型性能。选择这个特定值的原因是,研究表明 K=10 在计算成本低和模型性能评估偏差适中之间提供了合理的平衡。 在我们的数据集样本上测试模型时,我们如何确定 K 的值? 虽然 K=10 是一个选择,但我们如何确保它能充分代表我们的数据集? 一种应对此问题的方法是运行不同 K 数量的敏感性分析。换句话说,比较在相同数据集上训练但 K 值不同的同一模型的测试结果。 假定 K 值较小会导致模型性能预测出现较大噪声,而 K 值较大则会产生较少噪声的预测。 然而,与什么相比才算噪声? 当我们使用未见过的数据时,我们无法获得模型真正的性能。如果我们知道它,就可以将其应用于模型的评估。 但是,我们可以选择一个测试条件作为“理想”的或尽可能接近理想的估计,来预测模型的性能。 一种策略是使用所有可访问的数据训练模型,然后使用另一个大型样本留出数据集来估计其性能。留出数据上的性能将指示模型的“实际”性能。相比之下,训练数据集上的任何交叉验证得分将是对这个真实分数的估计。我们提到的方法很少可行,因为我们通常没有足够的数据来将主数据集的一部分留作测试集。 留一法交叉验证(LOOCV)过程是交叉验证的一种计算密集型修改,其中 K=N,N 是训练数据集中的样本总数。我们可以用它来模拟这种情况。换句话说,在每个用于验证的数据集样本中,只使用训练数据集中的一个样本。如果数据合适,它可以生成模型性能的良好估计,但由于计算成本高,很少用于大型数据集。 然后,使用与 LOOCV 相同的训练数据集,我们可以评估 LOOCV 过程的平均分类准确率与各种 K 值的平均分类准确率。得分之间的差异提供了对 K 值与理想模型性能测试条件有多接近的粗略近似。 让我们看看如何执行 K 折交叉验证过程的敏感性分析。
代码 输出 Ideal score: 0.83 Folds=2, accuracy=0.81 (0.81,0.81) Folds=3, accuracy=0.83 (0.79,0.85) Folds=4, accuracy=0.84 (0.8,0.86) Folds=5, accuracy=0.83 (0.78,0.88) Folds=6, accuracy=0.83 (0.77,0.88) Folds=7, accuracy=0.83 (0.76,0.89) Folds=8, accuracy=0.83 (0.77,0.88) Folds=9, accuracy=0.83 (0.75,0.9) Folds=10, accuracy=0.82 (0.74,0.9) Folds=11, accuracy=0.83 (0.77,0.9) Folds=12, accuracy=0.83 (0.7,0.9) Folds=13, accuracy=0.82 (0.77,0.91) Folds=14, accuracy=0.82 (0.66,0.93) Folds=15, accuracy=0.82 (0.76,0.92) Folds=16, accuracy=0.83 (0.67,0.92) Folds=17, accuracy=0.83 (0.73,0.93) Folds=18, accuracy=0.83 (0.68,0.93) Folds=19, accuracy=0.82 (0.68,0.92) Folds=20, accuracy=0.82 (0.66,0.96) |
如何将 Python 列表转换为字符串 在某些情况下,我们需要将从一种 Python 数据类型收集的数据元素转换为另一种。通过使用 Python 中可用的方法,我们可以将列表转换为 Python 中的字符串。在执行转换之前...
阅读 4 分钟
现代计算世界围绕着“数据”一词。然而,数据为何如此引人入胜?在现代世界中,人们开始意识到数据的重要性,以扩大其业务范围。企业主利用数据潜在地预测...
阅读 19 分钟
Flask Python 广泛使用的 Flask 微型 Web 框架以其简单易用而闻名。您可以使用 Flask 指定与我们应用程序中特定操作相对应的路由 (URL)。当用户访问时,Flask 将执行相关函数并将结果返回给用户...
阅读 4 分钟
简介 自签名证书对于本地开发很有用,但我不建议将它们用于生产应用程序。如果您希望托管公共网站,获取受信任的签名证书可能是更好的解决方案。使用自签名证书时,用户在首次访问时会收到通知,指出...
阅读 4 分钟
在本文中,我想讨论 PyCaret,一个新 Python 机器学习库。PyCaret 被誉为数据科学家的低代码资源,旨在缩短机器学习实验的“假设到见解的周期时间”。它使数据科学家能够完成实验...
阅读 6 分钟
贪吃蛇是一款街机迷宫游戏,由 Gremlin Industries 公司创建,并于 1976 年 10 月由 Sega 发行。它被认为是一款优秀的游戏,并已在多代公众中广受欢迎。贪吃蛇游戏...
阅读 10 分钟
抽认卡是最经过验证的学习辅助工具之一,帮助从语言学习者到医学生实现记忆目标。由于 Anki 或 Anki 等程序的丰富功能和灵活设置,数字抽认卡变得越来越有用...
阅读25分钟
对象识别是计算机视觉广阔领域中的一项技术。该技术能够识别图像和视频中存在的对象并对其进行跟踪。对象识别,也称为对象检测,具有多种应用,如人脸识别、车辆识别……
5 分钟阅读
? 二进制是基数 2 数字系统,这意味着它只使用两个数字 - 0 和 1。另一方面,十进制是基数 10 数字系统,这意味着它使用十个数字 - 0 到 9。要在 Python 中将二进制数转换为十进制,我们...
阅读 3 分钟
在本教程中,我们将学习 Python pendulum 库。我们将讨论其功能和用法。Python 提供了 datetime 模块,它是处理日期和时间最重要的库之一,它非常灵活,并附带许多有用的方法。然而,...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India