【机器学习】过拟合与欠拟合——如何优化模型性能

news2024/11/15 9:10:29

【机器学习】过拟合与欠拟合——如何优化模型性能

1. 引言

在机器学习中,模型的表现不仅依赖于算法的选择,还依赖于模型对数据的拟合情况。过拟合(Overfitting)和欠拟合(Underfitting)是模型训练过程中常见的问题。过拟合意味着模型过于复杂,以至于“记住”了训练数据中的噪声,而欠拟合则意味着模型过于简单,无法捕捉到数据的主要特征。本文将深入探讨过拟合与欠拟合的定义、表现、原因及常见的解决方案,帮助你优化模型性能。

在这里插入图片描述

2. 什么是过拟合?

2.1 定义

过拟合是指模型在训练集上表现得非常好,但在测试集或新数据上表现较差。这是因为模型在训练数据上过于复杂,捕捉了数据中的噪声和异常值,而这些并不代表数据的实际分布。

2.2 过拟合的表现:

  • 训练集上的误差极低:模型在训练集上表现完美。
  • 测试集上的误差较高:模型无法泛化到未见的数据。
  • 高方差:模型对训练数据敏感,对测试数据不够鲁棒。

2.3 过拟合的原因:

  • 模型过于复杂:参数过多,导致模型能够记住每一个训练数据点。
  • 训练数据量过少:数据不足以代表真实情况。
  • 特征过多且无正则化:大量不相关的特征增加了模型复杂度。

示例:决策树模型过拟合

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练复杂的决策树模型
model = DecisionTreeClassifier(max_depth=None)  # 不限制深度,可能导致过拟合
model.fit(X_train, y_train)

# 评估模型
train_accuracy = accuracy_score(y_train, model.predict(X_train))
test_accuracy = accuracy_score(y_test, model.predict(X_test))
print(f"训练集准确率: {train_accuracy}")
print(f"测试集准确率: {test_accuracy}")

3. 什么是欠拟合?

3.1 定义

欠拟合是指模型过于简单,无法捕捉到训练数据中的模式。这种情况下,模型的训练误差和测试误差都较高,说明模型既没有学好训练数据,也无法在测试集上表现良好。

3.2 欠拟合的表现:

  • 训练集和测试集误差都较高:模型对训练数据和测试数据都不能很好地拟合。
  • 高偏差:模型对数据的基本结构理解不到位,表现为过于简化。

3.3 欠拟合的原因:

  • 模型过于简单:模型结构无法捕捉数据中的复杂关系。
  • 训练时间不足:模型还没有充分学习到数据中的模式。
  • 特征不足:输入特征太少,导致模型无法充分学习。

示例:线性回归模型欠拟合

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

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

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练简单的线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 评估模型
train_error = mean_squared_error(y_train, model.predict(X_train))
test_error = mean_squared_error(y_test, model.predict(X_test))
print(f"训练集均方误差: {train_error}")
print(f"测试集均方误差: {test_error}")

在这里插入图片描述

4. 如何避免过拟合?

4.1 减少模型复杂度

通过限制模型的复杂度,可以减少模型过拟合的风险。例如,决策树的深度越大,模型越容易过拟合。

示例:限制决策树深度
model = DecisionTreeClassifier(max_depth=3)  # 限制树的最大深度
model.fit(X_train, y_train)

4.2 使用正则化

正则化是在损失函数中添加惩罚项,限制模型的复杂度,从而避免过拟合。常见的正则化方法有 L1 正则化(Lasso)和 L2 正则化(Ridge)。

示例:使用 Ridge 回归进行正则化
from sklearn.linear_model import Ridge

# 使用 Ridge 回归
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

4.3 数据扩充

如果训练数据不足,可以通过数据扩充来增加数据量,从而减少过拟合的风险。对于图像数据,数据扩充的方法包括翻转、旋转、缩放等。

4.4 使用交叉验证

交叉验证通过将数据集划分为多个子集来验证模型的性能,避免模型在特定数据上过拟合。

示例:K 折交叉验证
from sklearn.model_selection import cross_val_score

# 使用 5 折交叉验证
scores = cross_val_score(model, X, y, cv=5)
print(f"交叉验证得分: {scores}")

在这里插入图片描述

5. 如何避免欠拟合?

5.1 增加模型复杂度

通过增加模型的复杂度,可以帮助模型更好地拟合数据。例如,在神经网络中增加隐藏层或神经元的数量。

示例:增加决策树的深度
model = DecisionTreeClassifier(max_depth=10)  # 增加树的深度
model.fit(X_train, y_train)

5.2 训练更长时间

在深度学习中,欠拟合通常意味着模型还没有充分学习。可以通过增加训练的轮数来改善欠拟合。

5.3 增加特征

通过引入更多有意义的特征,可以帮助模型更好地学习数据中的模式。例如,特征工程中的特征生成步骤可以生成多项式或交互特征。

示例:生成多项式特征
from sklearn.preprocessing import PolynomialFeatures

# 生成二次多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X_train)

model.fit(X_poly, y_train)

5.4 使用非线性模型

如果数据存在复杂的非线性关系,线性模型容易欠拟合。可以选择非线性模型(如随机森林、支持向量机)来提升模型表现。

6. 过拟合与欠拟合的权衡

6.1 偏差-方差权衡

优化模型性能的过程中,我们通常要在**偏差(bias)方差(variance)**之间找到平衡。偏差过高意味着欠拟合,方差过高则意味着过拟合。通过选择合适的模型复杂度,可以在偏差和方差之间取得良好的权衡。

6.2 学习曲线

通过绘制学习曲线,可以帮助我们观察模型是否出现了过拟合或欠拟合。训练误差和验证误差趋于一致且较低时,说明模型表现良好。
在这里插入图片描述

7. 案例:避免房价预测中的过拟合与欠拟合

数据清洗与预处理

# 假设数据已经加载到 data 中
X = data.drop('price', axis=1)
y = data['price']

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

训练 Ridge 回归模型避免过拟合

from sklearn.linear_model import Ridge

# 使用正则化的 Ridge 回归
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

# 评估模型
train_error = mean_squared_error(y_train, model.predict(X_train))
test_error = mean_squared_error(y_test, model.predict(X_test))
print(f"训练集均方误差: {train_error}")
print(f"测试集均方误差: {test_error}")

8. 总结

过拟合和欠拟合是机器学习模型中的常见问题。过拟合通常由模型过于复杂或数据不足引起,而欠拟合则是由于模型过于简单或数据特征不足。通过使用正则化、交叉验证、增加数据量和调整模型复杂度等方法,可以有效地优化模型性能。在实际应用中,找到适当的模型复杂度并在偏差和方差之间平衡,是提升机器学习模型性能的关键。

9. 参考资料

  • 《Deep Learning》 by Ian Goodfellow
  • Coursera 深度学习课程
  • TensorFlow 官方文档

使用机器学习分析csdn热榜

image-20240925092639602

  • 也不知道为什么这个热榜对机器学习这么看重,只要你的文章标题是机器学习那就很容易上热榜,但如果不是,那即使你文章流量啊、点赞、评论数上热榜的要求就像翻了倍一样…
  • 机器学习和csdn热榜的爹一样
  • 就像官方在鼓励你写机器学习水文一样

image-20240925093019600

img

你好,我是Qiuner. 为帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner⭐ gitee https://gitee.com/Qiuner 🌹

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

代码都在github或gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。私信看不完,CSDN评论区可能会漏看 掘金账号 https://juejin.cn/user/1942157160101860 掘金账号

更多专栏:
  • 📊 一图读懂系列

  • 📝 一文读懂系列

  • ⚽ Uniapp

  • 🌟 持续更新

  • 🤩 Vue项目实战

  • 🚀 JavaWeb

  • 🎨 设计模式

  • 📡 计算机网络

  • 🎯 人生经验

  • 🔍 软件测试

掘金账号 CSDN账号

感谢订阅专栏 三连文章

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

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

相关文章

黑马智数Day4-1

新增月卡 配置路由完成跳转 {path: /cardAdd,component: () > import(/views/car/car-card/add-card) }<el-button type"primary" click"$router.push(/cardAdd)">添加月卡</el-button> 车辆信息表单验证 <el-form :model"carInf…

自定义安装WSL和WSL迁移到指定位置

安装 WSL 到指定磁盘 配置环境 打开控制面板&#xff0c;找到程序–>右击启用或关闭Windows功能 向下滑动&#xff0c;找到“适用于Linux的Windows子系统”和“虚拟机平台”两个选项&#xff0c;勾选上&#xff0c;然后重启电脑 安装Ubuntu20.04 1. 下载发行版 打开链接…

全能通人工智能的能力评估框架-Levels of AGI: Operationalizing Progress on the Path to AGI

译自’Levels of AGI: Operationalizing Progress on the Path to AGI’&#xff0c;有所删节.笔者能力有限&#xff0c;敬请勘误。 摘要 Google DeepMind提出一种针对通用人工智能 (Artificial General Intelligence, 简称AGI) 框架&#xff0c;该框架用于评估AGI的模型及早期…

CAPL—on signal到底该怎么玩?

总结&#xff1a;一个前提&#xff0c;两种形式&#xff0c;一个注意&#xff0c;外加一个很不常用的知识点 1&#xff1a;一个前提&#xff1a;必须是DBC或其他数据库文件中定义的信号&#xff0c;且这个数据库已经添加到工程中去了。 2&#xff1a;使用格式 on signal&…

如何修改音频的音量增益

一、前言 在开发音频相关的功能&#xff08;比如说语音通话、播放音乐&#xff09;时&#xff0c;经常会遇到音量太小的问题&#xff0c;这时候就需要我们对原始数据进行处理。本文将介绍如何通过修改原始音频数据来增加增益&#xff0c;本文包含如下内容&#xff1a; 1.音频数…

3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展

3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展 1 官网下载最新3D Slicer image computing platform | 3D Slicer 版本5.7 2 安装torch依赖包&#xff1a; 2.1 进入安装目录C:\Users\wangzhenlin\AppData\Local\slicer.org\Slicer 5.7.0-2024-09-21\bin&#xff0…

PostgreSQL技术内幕12:PostgreSQL事务原理解析-锁管理

0.简介 本文介绍PG中的锁技术&#xff0c;主要包括PG中两阶段锁的介绍和PG中各种不同级别的锁&#xff0c;死锁问题介绍&#xff0c;以及如何去查看锁。 1.PG中两阶段锁 1.1 需要锁机制的原因 PG中的隔离性是通过MVCC和两阶段锁实现的&#xff0c;有了MVCC为什么还要使用悲…

python全栈学习记录(十八)re、os和sys、subprocess

re、os和sys、subprocess 文章目录 re、os和sys、subprocess一、re1.正则字符2.正则表达式的使用3.group的使用4.贪婪匹配与惰性匹配5.其他注意事项 二、os和sys1.os2.sys 三、subprocess四、打印进度条 一、re python中的re模块用来使用正则表达式&#xff0c;正则就是用一系…

基于Springboot企业员工人事管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

研一上课计划2024/9/23有感

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需要认真上课的1.应用数理统计&#xff08;开卷考试&#xff09;2.最优化方法&#xff08;开卷考试&#xff09;3.跨文化交际&#xff08;主题演讲20课堂讨…

基于SpringBoot和Vue的餐饮管理系统

基于springbootvue实现的餐饮管理系统 &#xff08;源码L文ppt&#xff09;4-078 第4章 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入餐饮管理系统&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者和管理者,一…

手写SpringMVC(简易版)

在上一篇博客中说到这里我们要进行手写SpringMVC&#xff0c;因此最好是将上一篇博客中的SpringMVC源码分析那一块部分搞懂&#xff0c;或者观看动力节点老杜的SpringMVC源码分析再来看这里的书写框架。 首先我们要知道对于一个完整系统的参与者&#xff08;即一个完整的web项…

Spring Cloud :Hystrix实现优雅的服务容错

目录 Hystrix概述&#xff1a;第一个Hystrix程序步骤1&#xff1a;创建父工程hystrix-1步骤2&#xff1a;改造服务提供者步骤3&#xff1a;改造服务消费者为Hystrix客户端&#xff08;1&#xff09;添加Hystrix依赖&#xff08;2&#xff09;添加EnableHystrix注解&#xff08;…

共享单车轨迹数据分析:以厦门市共享单车数据为例(六)

副标题&#xff1a;.基于POI数据的站点功能混合度探究——以厦门市为例 为了保证数据时间尺度上的一致性&#xff0c;我们从互联网上下载了2020年的POI数据&#xff0c;POI数据来源于高德地图 API平台,包括名称、大小类、地理坐标等。并将高德地图 POI数据的火星坐标 系 GCJ-0…

轻松搭建企业报修平台,零代码解决方案

在当今竞争激烈的商业环境中&#xff0c;企业的高效运营离不开稳定的设备和设施。而当设备出现故障时&#xff0c;一个高效的维修报修平台就显得至关重要。那么&#xff0c;如何零代码搭建企业内部维修报修平台呢&#xff1f; 一、明确需求与目标 在搭建维修报修平台之前&…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统&#xff0c;它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度&#xff0c;你只需要提供你需要监控的数据&#xff0c;它就可以帮你生成各种可视化仪表。同时它…

day01——通过git进行管理项目

新建仓库 IDEA新建本地仓库&#xff0c;并上传本地代码将代码上传到远程仓库 不同版本的idea&#xff0c;方式不同&#xff0c;自行摸索

鸿蒙界面开发——组件(10):单选框Radio复选框checkbox 下拉框select 多条件筛选Filter

单选框Radio 单选框一直会有这个圆圈&#xff0c;在选中和未选中之间切换状态。 Radio通过调用接口来创建&#xff0c;接口调用形式如下&#xff1a; Radio(options: RadioOptions) Radio(options: {value: string, group: string ,indicatorType:RadioIndicatorType,(新增) …

基于SSM的家政服务网站【附源码】

基于SSM的家政服务网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2 系统结构 4.3. 数据库设计 4.3.1 数据库实体 4.3.2 数据库设计表 4.4 数据表 第5章 系统详细设计 5.1管理员功能模块 5.2用户功能模块 5.3前…

STM32F407单片机编程入门(二十四) USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.STM32F407VET6单片机USB模块框图四.STM32单片机USB从机模式五.STM32F407VET6 USB设备CDC类六.CubeMX配置一个USB虚拟串口收发例程七.CubeMX工程源代码下载八.小结 一.概要 STM32F407VET6 USB虚拟串口是一种采用STM32F407VE…