机器学习模型可信度与交叉验证:通俗讲解

先从一个故事说起:农场里的火鸡科学家,观察了一年发现“每天上午11点必有食物”,结果感恩节当天,它没等到食物,反而成了人类的食物。这个故事告诉我们:只靠过去的经验下结论,很可能出错——机器学习模型也一样,不能只看它在“已知数据”上表现好,还要确保它在“新数据”上也靠谱。

一、模型为啥要讲“可信度”?怎么用数据验证?

1. 别被“表面成绩”骗了:模型的“真实能力”很重要

我们之前学过“模型评估指标”(比如SSE),能判断模型拟合得好不好。但问题是:指标好的模型,不一定真能用

举个例子:你用过去3年的某支股票数据训练了一个预测模型,在这3年数据上预测准确率90%,但用它预测下周股价,准确率可能只有50%。这是因为模型只“死记硬背”了过去的数据(就像火鸡记住了“11点有食物”),却没学会应对新情况——这就是模型“可信度”的核心:能不能在没见过的新数据上做好预测

要理解这个问题,先搞懂两个核心矛盾和两种解决思路:

  • 核心矛盾:模型只能用“已知数据”训练,但我们需要它对“未知数据”有效。
  • 两种解决思路
    1. 传统统计分析:假设“已知数据”和“未知数据”都来自同一个“总体”(比如都来自“某地区的用户消费数据”),先通过数学推导证明“总体有什么规律”,再基于规律建模型。因为模型符合“总体规律”,所以默认它对新数据也有效。
    2. 机器学习:不搞复杂推导,直接用“模拟测试”判断——把手里的数据分成两部分:
      • 一部分叫训练集(比如70%-80%的数据):用来训练模型,就像学生做练习题。
      • 另一部分叫测试集(比如20%-30%的数据):用来“考试”,模拟“未知数据”,看模型考得怎么样。

如果模型在测试集上表现好,我们就认为它对未来的新数据也靠谱;反之,就算在训练集上表现再好,也可能是“死记硬背”,没用。

这里还要记住两个词:

  • 训练误差:模型在训练集上的“错题率”(比如SSE值)。
  • 泛化能力:模型对“未知数据”的预测能力(没法直接测,只能通过测试集的表现间接判断)。

2. 怎么切分数据?像切蛋糕一样简单

要做“训练集-测试集”的模拟,首先得把数据“打乱切分”——就像切蛋糕前先搅匀配料,避免某块全是奶油、某块全是面包。

(1)关键工具:两个NumPy函数
  • np.random.shuffle:给数据“洗牌”,按行打乱顺序(比如把100条用户数据打乱,避免按时间顺序切分导致“训练集全是老用户,测试集全是新用户”)。
    注意:打乱特征和标签时,要保证“一一对应”(比如用户A的特征和他的消费标签不能分开),所以要给两者设相同的“随机种子”(比如都设为24),确保打乱方式一样。
  • np.vsplit:按行切分数据,比如把打乱后的100条数据,从第70条后面切开,前70条当训练集,后30条当测试集。
(2)现成的切分函数

基于上面两个工具,我们可以写一个“数据切分函数”,输入特征、标签,就能自动输出训练集和测试集:

def array_split(features, labels, rate=0.7, random_state=24):# 1. 用相同种子打乱特征和标签,保证对应关系np.random.seed(random_state)np.random.shuffle(features)np.random.seed(random_state)np.random.shuffle(labels)# 2. 计算切分点(比如100条数据,70%就是70条)split_idx = int(len(labels) * rate)# 3. 切分数据Xtrain, Xtest = np.vsplit(features, [split_idx, ])  # 特征切分ytrain, ytest = np.vsplit(labels, [split_idx, ])    # 标签切分return Xtrain, Xtest, ytrain, ytest
(3)切分比例怎么定?凭经验,但有道理

一般按“7:3”或“8:2”切分:

  • 训练集太少:模型学不到足够规律(比如只做10道题就去考试,肯定考不好)。
  • 测试集太少:“考试样本”不够,没法判断模型真本事(比如只考2道题,就算全对也可能是蒙的)。

机器学习里很多这种“经验值”,虽然不像数学公式那么严谨,但实战中很好用。

3. 实战:用线性回归验证可信度

我们用“训练集训练模型,测试集验证效果”,走一遍完整流程:

(1)准备数据

先造一组简单的回归数据(特征和标签有线性关系,加一点小误差),再切分成训练集和测试集:

np.random.seed(24)  # 固定随机种子,结果可重复
features, labels = arrayGenReg(delta=0.01)  # 造数据(delta是误差)
Xtrain, Xtest, ytrain, ytest = array_split(features, labels)  # 切分
(2)训练模型:求线性回归的参数w

线性回归的核心是求“最优参数w”,公式是:w^=(XTX)−1XTy\hat{w} = (X^TX)^{-1}X^Tyw^=(XTX)1XTy(不用死记,NumPy能算):

w = np.linalg.inv(Xtrain.T.dot(Xtrain)).dot(Xtrain.T).dot(ytrain)

这里的w就是模型“学到的规律”——比如“房价=0.8×面积 + 0.2×楼层”里的0.8和0.2。

(3)测试模型:看在测试集上表现

用之前学的SSELoss函数,算模型在测试集上的误差:

SSELoss(Xtest, w, ytest)  # 输出误差值,越小说明模型在测试集上表现越好

如果误差小,说明模型不仅在训练集上拟合得好,对测试集(模拟新数据)也有效,可信度高。

4. 一个绕人的问题:测试集的“不可知悖论”

你可能会问:如果测试集表现不好,能不能改模型(比如换个算法、调个参数)再测?
答案是:严格来说不能

因为测试集是用来“最终考试”的——就像高考,考砸了不能说“我再复习一周重考”。如果根据测试集结果改模型,相当于“提前知道了高考题,再针对性复习”,测试集就失去了“判断真实能力”的意义。

那想调整模型怎么办?再加一种数据:验证集
可以把数据分成三部分:

  • 训练集:用来学知识(做练习题)。
  • 验证集:用来模拟考试,调整复习策略(比如发现数学差,就多练数学)。
  • 测试集:最终高考,一旦考完,不能再改策略。

比如数据按“6:2:2”切分:60%训练、20%验证、20%测试。平时用验证集调模型,最后用测试集看最终效果——这样测试集的“公正性”就保住了。

(实际中,很多人会把“验证集”和“测试集”混用,比如用“7:3”切分,30%既当验证集又当测试集,适合不需要特别严谨的场景。)

二、交叉验证:让结果更靠谱的“多次考试”

就算分了训练集和测试集,还有一个问题:一次切分的结果可能有运气成分
比如你切分数据时,刚好把“简单题”都分到训练集、“难题”都分到测试集,模型测试成绩就会差;反过来,成绩就会好。

怎么解决?用“交叉验证”——相当于让模型多考几次,取平均分,减少运气影响。

1. 核心思想:K折交叉验证(最常用)

把“训练集+验证集”(暂时不用测试集)分成K等份(比如K=10,叫10折验证),然后循环做K次训练和验证:

  • 第1次:用第1份当验证集,剩下9份当训练集,算一次误差。
  • 第2次:用第2份当验证集,剩下9份当训练集,算一次误差。
  • 第10次:用第10份当验证集,剩下9份当训练集,算一次误差。

最后把10次误差求平均,这个平均值就是模型的“真实成绩”——比一次切分的结果更可信。

举个例子:10折验证的过程就像10个学生轮流当“考官”,每个人出一套题(自己的那1份数据),其他人(剩下9份)做题,最后取所有人的平均分,避免某个人的题太简单或太难。

2. 注意:交叉验证和测试集不冲突

严谨的流程是:

  1. 先把所有数据分成“训练验证集”(比如80%)和“测试集”(20%),测试集先藏起来,不用。
  2. 在“训练验证集”上做K折交叉验证,调整模型(比如选最优的参数)。
  3. 最后用调好的模型,在“测试集”上做一次最终测试,得到最终结果。

这样既用交叉验证保证了模型的稳定性,又用测试集保证了结果的公正性。

总结:关键记住3点

  1. 模型可信度=泛化能力:别只看训练集成绩,一定要用测试集模拟新数据。
  2. 数据切分要合理:训练集70%-80%,测试集20%-30%,打乱顺序避免偏见;需要调模型时加验证集。
  3. 交叉验证减误差:一次切分有运气成分,用K折交叉验证(比如10折)取平均分,结果更靠谱。

掌握这些,就能避免做“农场里的火鸡科学家”,让模型在真实场景中真的好用。

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

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

相关文章

HTML5和CSS3新增的一些属性

1、HTML5新增特性这些新特性都有兼容性问题&#xff0c;基本是IE9以上版本浏览器才支持1&#xff09;新增语义化标签2&#xff09;新增多媒体标签音频&#xff1a;<audio>视频&#xff1a;<video>&#xff08;1&#xff09;视频<video>---尽量使用mp4格式<…

Redis的RedLock

RedLock算法深度解析RedLock是Redis作者针对分布式环境设计的多节点锁算法&#xff0c;核心目标是解决单点Redis在分布式锁场景中的可靠性缺陷。传统方案的局限性单节点Redis锁的问题单点故障&#xff1a;单个Redis实例宕机导致所有锁服务不可用可靠性不足&#xff1a;无法保证…

SpringMVC @RequestMapping的使用演示和细节 详解

目录 一、RequestMapping是什么&#xff1f; 二、RequestMapping 的使用演示 1.RequestMapping在方法上的使用&#xff1a; 2.RequestMapping同时在类和方法上使用&#xff1a; 3.RequestMapping指定请求参数&#xff1a; 4.RequestMapping使用Ant风格URL&#xff1a; 5.Requ…

flutter项目 -- 换logo、名称 、签名、打包

1、换logo, 透明底&#xff0c;下面5个尺寸&#xff0c;需要UI设计2、换名没配置型的改名方式如下 打开app/src/main/AndroidManifest.xml3、签名 运行 flutter doctor -vD:\project\Apk\keystore 自己建立的keystore文件夹&#xff0c; 注意命令后是 megoai-release-key(自…

【贪心算法】day9

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

linux C 语言开发 (八) 进程基础

文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; linux C 语言开发 (一) Window下用gcc编译和gdb调试 linux C 语言开发 (二) VsCode远程开发 linux linux C 语言开发 (…

从零学算法1094

1094.拼车 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…

B2B企业营销型AI Agent服务商推荐:谁更专业?如何选型?

一、引言&#xff1a;为什么B2B企业需要营销型AI Agent&#xff1f;在当前竞争激烈的B2B市场中&#xff0c;企业普遍面临几大挑战&#xff1a;线索获取难&#xff1a;获客成本持续上升&#xff0c;高质量线索难以筛选。销售周期长&#xff1a;从初步接触到签单&#xff0c;往往…

算法-双指针5.6

目录 &#x1f33f;力扣611-有效三角形得个数 &#x1f9ca;题目链接&#xff1a;https://leetcode.cn/problems/valid-triangle-number/description/ &#x1f9ca;题目描述&#xff1a;​编辑 &#x1f9ca;解题思路&#xff1a; &#x1f9ca;解题代码&#xff1a; &a…

超参数自动化调优指南:Optuna vs. Ray Tune 对比评测

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;从"手动炼丹"到"自动化…

软考-局域网基础考点总结

这篇文章用于整理软考网络相关的知识点&#xff0c;囊括了详细的局域网基础的考点&#xff0c;能够让你认真备考&#xff0c;基础知识一网打尽&#xff0c;让后续的学习更加通畅~ 第一部分&#xff1a;OSI七层参考模型 OSI(Open System Interconnection)模型是一个理论框架&am…

Node.js核心模块介绍

1. fs 模块fs&#xff08;File System&#xff09;模块允许对文件系统进行操作&#xff0c;提供了文件读写、文件夹操作等功能。fs 支持同步和异步两种 API。1.1. 常用方法读取文件&#xff1a;异步: fs.readFile()同步: fs.readFileSync()写入文件&#xff1a;异步: fs.writeF…

缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(二)

第二部分&#xff1a;缓存击穿——热点key过期引发的“DB瞬间高压” 缓存击穿的本质是“某个热点key&#xff08;高并发访问&#xff09;突然过期”&#xff0c;导致大量请求在同一时间穿透缓存&#xff0c;集中冲击DB&#xff0c;形成“瞬间高压”。 案例3&#xff1a;电商秒杀…

Linux相关概念和易错知识点(45)(网络层、网段划分)

目录1.网络层&#xff08;1&#xff09;IP协议头格式&#xff08;2&#xff09;工作流程2.网段划分&#xff08;1&#xff09;五类地址&#xff08;2&#xff09;回环地址&#xff08;3&#xff09;网段的特殊地址&#xff08;4&#xff09;网络建设我们前面暂时跳过了网络层&a…

transition(过渡)和animation(动画)——CSS

1.transition过渡可以为一个元素在不同状态之间进行切换时添加过渡效果&#xff0c;实现不同状态间的变化效果。通过触发事件(鼠标悬停、点击等)&#xff0c;在两个状态间切换。1.1 使用语法&#xff1a;transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud项目国产化改造MySQL迁移达梦数据库,SQL变更

达梦数据库下载地址&#xff1a;https://eco.dameng.com/download 达梦数据库安装文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 数据迁移SQLark工具使用 首先&#xff0c;本次MySQL迁移使用了SQLark工具 1.下载安装SQLark https…

Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片

参照了这篇博文&#xff1a;https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源码进行了修改&#xff0c;可以实现服务加载&#xff1a; Event.js import { Check,defined} from &qu…

迭代器和生成器的区别与联系

目录 1.可迭代对象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函数 vs 生成器表达式 4.三者之间的联系与区别 5.关系图&#xff08;帮助你一眼看懂&#xff09; 6.核心结论&#xff08;记住这三句话&#xff09; 1.可迭代对象 (Iterable) 定义&…

Dropout:深度学习中的随机丢弃正则化技术

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度学习中最广泛使用的正则化…

vue2迁移到vite[保姆级教程]

vue2迁移到vite[保姆级教程]使用vue CLI创建项目进行vite迁移详细步骤1. 安装 Vite 和 Vue 2 支持插件2. 创建 vite.config.js3. 修改 package.json 脚本4. 创建 index.html5. 确保 main.js 正确引入6. 处理静态资源7. 构建优化&#xff08;可选&#xff09;8. 启动项目常见问题…