【漫话机器学习系列】268. K 折交叉验证(K-Fold Cross-Validation)

news2025/5/21 5:17:50

图解 K 折交叉验证(K-Fold Cross-Validation)| 原理 + 数学公式 + 实践应用

原图作者:Chris Albon,手绘风格清晰易懂,本文基于其图解做详细扩展,适用于机器学习、深度学习初学者及进阶者参考学习。

 


一、什么是 K 折交叉验证?

K 折交叉验证(K-Fold Cross-Validation)是一种评估机器学习模型性能的重采样方法。它通过将原始训练数据划分为 K 个相等的子集(fold),反复训练和验证模型,从而更稳定、更可靠地评估模型在未知数据上的泛化能力。

为什么要使用交叉验证?

  • 减少模型评估的方差,提高模型评估的鲁棒性;

  • 更加充分地利用数据(相较于单一的训练/验证集划分);

  • 适用于模型选择、参数调优等任务中的性能对比。


二、K 折交叉验证的流程详解

以 K=5 为例:

  1. 将数据集划分为 5 个等份;

  2. 每次使用其中 1 份作为验证集,剩下 4 份作为训练集;

  3. 训练模型并计算验证误差(Loss);

  4. 重复上述过程 5 次(每份数据都做一次验证集);

  5. 对 5 次的验证误差取平均,作为最终评估指标。

图示公式说明:

图片中给出的是 K 折交叉验证的数学公式:

CV_{(k)} = \frac{1}{K} \sum_{i=1}^{K} \text{Loss}_i

解释如下:

  • K:表示将数据集划分为的折数,常用 10 折(10-Fold)

  • \text{Loss}_i:第 i 折验证集上的损失值(例如均方误差);

  • CV_{(k)}:K 折交叉验证的平均损失值。


三、如何选择 K 值?

  • 10 折交叉验证(K=10):实践中最常见,兼顾了训练充分与验证稳定;

  • 5 折交叉验证(K=5):当数据量不大时也较常用;

  • Leave-One-Out(K = N):每次只留一条数据作为验证,计算开销大,但评估极为稳定。

一般推荐使用 10-Fold,因为它在偏差与方差之间取得了较好的平衡。


四、Loss(损失函数)可以是什么?

在不同的任务场景下,损失函数(Loss)可以有多种选择,图片中也列举了常见的三种:

  • 均方误差(MSE):用于回归问题,惩罚偏差较大的预测值;

  • 对数损失函数(Log Loss):用于二分类或多分类,衡量概率预测的准确度;

  • 精度(Accuracy):用于分类问题,衡量预测正确的比例。

你可以根据实际任务选择合适的评估指标。


五、代码实现(以 scikit-learn 为例)

下面是一个使用 scikit-learn 实现 K 折交叉验证的简单示例:

from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
import numpy as np

# 加载数据集
X, y = load_iris(return_X_y=True)

# 定义模型
model = LogisticRegression(max_iter=200)

# 定义 KFold(10折)
kf = KFold(n_splits=10, shuffle=True, random_state=42)

# 执行交叉验证
scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')

# 输出结果
print("每折的准确率:", scores)
print("平均准确率:", np.mean(scores))

六、K 折交叉验证的优缺点

优点:

  • 能较全面地使用全部数据;

  • 结果更加稳定;

  • 减少对特定训练/验证集划分的依赖。

缺点:

  • 计算成本高(尤其是深度学习模型);

  • 当数据分布不均或有时间依赖(时序数据)时需小心使用。


七、总结

K 折交叉验证是机器学习中不可或缺的模型评估工具。理解其原理、数学表达与实践意义,有助于你更科学地开发、调优和比较模型表现。

小贴士

  • 想要快速上手:推荐使用 scikit-learn 中的 cross_val_score

  • 想控制更细粒度:可以自定义训练/验证流程配合 KFold

  • 如果使用时间序列:考虑 TimeSeriesSplit 等变种交叉验证方法。


💬 如果你觉得这篇图解和讲解对你有帮助,欢迎点赞 👍、收藏 ⭐、评论 📩 支持一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核

如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本,此时选择的内核是base虚拟环境的Python内核,如果我想切换成其他conda虚拟环境来运行这个文件该怎么办?下面我们试着还原一下问题,并且解决问题。 【注】 这个问题出…

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…

Nginx配置记录访问信息

文章目录 方法一:使用Nginx原生配置记录访问信息方法二:使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如:Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中,无论是功…

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网(State Grid Corporation of China,简称 SGCC)的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用,用户可以实时追踪家庭用电量情况&…

JAVA EE(进阶)_HTML

思如云烟,行若磐石。 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE(进阶)_进阶的开端-CSDN博客 1.HTML HTML(HyperText Mark…

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…

8-游戏详情制作(Navigation组件)

1.1 需求 使用Navigation实现游戏主详情视图,从瀑布流容器中的游戏项(游戏中心首页-游戏瀑布流列表)点击游戏后进入游戏详情页,从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入: 游戏详情&#…

Unity引擎源码-物理系统详解-其二

继续我们关于Unity的物理系统的源码阅读,不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下:NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…

1.3.3 数据共享、汇聚和使用中的安全目标

探索数据共享、汇聚与使用中的安全目标 在当今数字化时代,数据的价值愈发凸显,数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而,在这一过程中,数据安全至关重要,我们需要明确并保障保密性、完整性…

【Docker】Docker安装Redis

目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新,如需下载指定版本可带版本号 docker pull redis:xxx 响应内容: 1.1查看下载的镜像 下载完…

Oc语言学习 —— Foundation框架总结

1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象,例如:NSString *str "hello"; 因为我们的NSString是不可变的,所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口,通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构: Memory-efficient implementation: 实验: 1. 在大规模模型上效果显著: 2. 在不同类型任务上的效果: 为什么MLP对效果有提升的几点猜测: 1. 并非所有token对生成质量的影响相同 2. 关…

Spring的Validation,这是一套基于注解的权限校验框架

为了保证数据的正确性、完整性,作为一名后端开发工程师,不能仅仅依靠前端来校验数据,还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器,处理校验异常 RestControllerAdvice p…

MySQL - 如何突破单库性能瓶颈

数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的,服务器是数据库的宿主,其性能直接影响了数据库的性能,所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…

apisix透传客户端真实IP(real-ip插件)

文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses?安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理(如 Nginx、HAProxy、云厂商的 LB&#xff…

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别:READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别,这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

开启健康生活的多元养生之道

健康养生是一门值得终身学习的学问,在追求健康的道路上,除了常见方法,还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道,能让我们的生活更健康、更有品质。​ 室内环境的健康不容忽视。定期清洁空调滤网,避…

【Vite】前端开发服务器的配置

定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…