首页 > 其他分享 >分层K折交叉验证

分层K折交叉验证

时间:2024-06-18 21:30:12浏览次数:11  
标签:交叉 模型 验证 分层 子集 数据 评估

文章目录


K折交叉验证(K-fold Cross Validation)是一种 评估机器学习模型性能的常用技术和方法,其目的是通过将数据集分成K个子集(或“折”),来 估计模型在独立数据上的预测能力,以此来 减少因模型 过拟合训练数据而导致的评估偏差。下面是K折交叉验证的基本步骤和原理:

基本原理

  1. 数据分割:首先,将原始数据集随机均匀地分割成K个不重叠的子集(或“fold”)。每个子集应尽可能保持数据分布的一致性,特别是当类别标签存在时,要保证各个类别在不同子集中比例相近,这可以通过分层抽样实现。

  2. 循环训练与验证:接下来,进行K轮迭代。在每一轮中:

    • 选择其中一个子集作为验证集(validation set)。
    • 剩余的K-1个子集合并作为训练集(training set)。
    • 使用训练集训练模型。
    • 利用验证集评估模型性能,通常通过计算某种性能度量,比如准确率、精确度、召回率、F1分数、AUC-ROC曲线下的面积等。
  3. 结果汇总:完成K轮迭代后,将每轮验证集上的评估结果(如预测误差)平均起来,得到一个单一的评估指标,作为模型性能的综合估计。这一步骤考虑到了模型在不同数据子集上的表现,提高了评估的稳定性和可靠性。

作用与优势

  • 减少偏差与方差:通过在不同的数据子集上评估模型,K折交叉验证有助于减小由于数据划分随机性导致的评估偏差,同时提供了模型性能的一致性估计。
  • 模型选择与调参:可以用来比较不同模型之间的性能,帮助选择最佳模型;也适用于超参数调优,找到使模型性能最优的参数组合。
  • 避免过拟合:能够更好地评估模型在未见过的数据上的泛化能力,降低过拟合风险。
  • 资源高效:相较于单独保留一个大型测试集,K折交叉验证更加高效地利用了数据资源,尤其是在数据量相对有限时。

注意事项

  • K值选择:K值的选择会影响验证结果的稳定性与准确性。较大的K值(如K=10)可以提供更稳定的模型性能估计,但训练时间也会相应增加。较小的K值(如K=2,称为两重交叉验证或简单交叉验证)可能导致较大的方差。实践中,K=5或K=10是常见的选择。
  • 计算成本:K折交叉验证相比单次训练和测试需要更多的计算资源,特别是在数据集庞大或模型复杂时。
  • 分层处理分类数据:在分类任务中,为了保持训练集和验证集中类别比例一致,可采用分层K折交叉验证。

当然,让我们通过一个具体的例子来理解K折交叉验证的过程。假设我们有一个包含100条记录的数据集,我们要使用K折交叉验证(这里取K=5)来评估一个线性回归模型的性能。

步骤分解

  1. 数据准备:首先,将数据集按行编号为1到100。

  2. 数据分割:将这100条记录均匀分成5个子集(每个子集20条记录)。

  3. 开始验证

    • 第一轮选取子集1作为验证集,子集2到5作为训练集。使用这80条记录训练模型,然后用子集1(20条记录)评估模型性能,记录下该轮的评估指标(比如均方误差MSE)。
    • 第二轮选取子集2作为验证集,子集1、3、4、5作为训练集。同样,训练模型并评估性能。
    • 重复以上步骤,直到每个子集都被用作验证集一次。
      在这里插入图片描述
  4. 结果整合:在五轮结束后,我们将得到五次评估的结果。为了得到一个综合的性能指标,我们通常会计算这些结果的平均值(如果评估的是误差,则取平均误差;如果是准确率,则取平均准确率)。

示例代码(Python + Scikit-learn)

from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error

# 生成示例数据集
X, y = make_regression(n_samples=100, n_features=10, noise=0.1)

# 初始化线性回归模型
model = LinearRegression()

# 初始化5折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)

mse_scores = []

# 进行K折交叉验证
for train_index, test_index in kf.split(X):
    # 分割数据
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # 训练模型
    model.fit(X_train, y_train)
    
    # 预测并计算均方误差
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    mse_scores.append(mse)

# 输出平均均方误差
print("Average Mean Squared Error:", sum(mse_scores)/len(mse_scores))

这段代码首先生成了一个具有100个样本的回归问题数据集,然后定义了一个线性回归模型,并使用5折交叉验证来评估模型的性能,输出所有轮次的平均均方误差。这样,我们就可以基于这个综合指标来判断模型在未知数据上的预测能力。

标签:交叉,模型,验证,分层,子集,数据,评估
From: https://blog.csdn.net/weixin_50569789/article/details/139783721

相关文章

  • 网易易盾中文点选验证码识别方法
    中文验证码一直是识别的难题,首先他分类的种类很多,常见中文都有3500个,而且一般中文验证码都会有变形,导致每一个文字都需要大量训练样本。假设每一个汉字样本需要100个,100×3500=35万个样本,所以标记的样本数量巨大,训练周期长,成本高。而且通常需要点选的文字数量很多,需要同时全......
  • TCP_CONNECTION_ESTAB_02:验证DUT打开多个被动套接字并将它们连接到远程套接字
    测试目的:本测试用例的目的是验证DUT(被测试设备)是否能够同时打开多个TCP被动套接字,并能够对通过这些套接字接收到的TCP连接请求进行响应。当DUT接收到多个带有SYN标志位设置为1的TCP段时,DUT应该能够为每个请求打开一个TCP被动套接字,并向每个请求源发送一个同时包含SYN和ACK......
  • 深入解析:如何通过Python脚本将YOLO标注格式转换为COCO格式并进行验证
    深入解析:如何通过Python脚本将YOLO标注格式转换为COCO格式并进行验证随着深度学习和计算机视觉技术的飞速发展,物体检测成为了一个热门的研究领域。在物体检测任务中,YOLO(YouOnlyLookOnce)和COCO(CommonObjectsinContext)是两个非常重要的标注格式。YOLO因其高效的实时物......
  • 深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证
    深入解析:如何通过Python脚本将LabelMe标注格式转换为YOLO格式并进行验证在计算机视觉领域,标注格式的转换是一个经常会遇到的问题。不同的标注格式有不同的应用场景和优势,能够灵活地进行转换是非常重要的技能。在这篇文章中,我们将详细介绍如何通过Python脚本将LabelMe标注格......
  • 小白next项目初步上手搭建一个随机社会信用代码生成及验证功能网站
    先看看效果网址是:https://xinyongdaima.aitoolpro.work/#主要实现功能实现随机社会信用代码生成及验证;无数据存储功能;技术栈next.jstailwind工具sublimeChatGPT4o步骤准备工作:需要电脑安装node生成项目打开终端并运行以下命令:npxcreate-next-app@late......
  • pytorch使用交叉熵训练模型学习笔记
    python代码:importtorchimporttorch.nnasnnimporttorch.optimasoptim#定义一个简单的神经网络模型classSimpleModel(nn.Module):def__init__(self):super(SimpleModel,self).__init__()self.fc=nn.Linear(3,2)#输入3维,输出2类......
  • 阅读者如何验证收到的PDF文档的真实性和完整性,判断是否为原作者所发布或是否已被在改
    阅读者如何验证收到的PDF文档的真实性和完整性,判断是否为原作者所发布或是否已被在改动?只有用数字证书签名,这是一种确保文档完整性和验证作者身份的有效方式。如果原作者在发布PDF前对其进行了数字签名,任何后续的修改都会导致签名失效,阅读者在打开文件时会收到警告,提示文件已被......
  • 交叉编译python第三方库
    这里我们以编译androidpython程序为例工具crossenv名词对于交叉编译的各个部分,没有标准的词汇表,不同的资源经常会使用相互矛盾的术语。为了避免混淆,我们只使用GNU术语,这是Python本身使用的。host就是你编译出来的包要运行的平台,比如这里是Androidbuild进......
  • 球面双站交叉定位计算方法
    写在前面之前自己写的word丢了,为避免丢失,在网上发一下,主要是备忘,有些表达不严谨请,见谅。方法和模型图片来自引文:张静.杜剑平.蒋俊,基于球体模型的短波固定多站交叉定位选站方法[j].信息工程大学学报,2020,(1),9-1426再吐槽知网:下个论文收费3.5,表示理解;充值最小30,每次下载都要收......
  • Excel单元格的“点选输入”:数据验证应用
    在Excel中,用“数据验证”功能可以设置下拉列表,二级下拉列表需要设置公式。(笔记模板由python脚本于2024年06月16日18:36:37创建,本篇笔记适合经常使用Excel处理数据的coder翻阅)【学习的细节是欢悦的历程】Python官网:https://www.python.org/Free:大咖免费“圣......