当前位置: 首页 > news >正文

机器学习过拟合和欠拟合!看这一篇文章就够了 建议收藏!(上篇)

 在机器学习中,有一项非常重要的概念,那就是:过拟合(Overfitting)和欠拟合(Underfitting)。

它们涉及到机器学习中常见的两种模型性能问题,分别表示模型在训练数据上表现得过于复杂或过于简单。

下面咱们先来简单聊聊关于过拟合和欠拟合的特征和防止性能问题的方法。

大家伙如果觉得还不错!可以点赞、转发安排起来,让更多的朋友看到。

ok,咱们一起来看看~

过拟合(Overfitting)

1、基本概念:过拟合指的是模型在训练数据上表现很好,但在未见过的测试数据上表现较差的情况。过拟合发生的原因是模型过于复杂,能够记住训练数据的细节和噪声,而不是学习数据的通用模式。

2、特征

  • 模型在训练数据上的准确度高。

  • 模型在测试数据上的准确度较低。

  • 模型的参数数量过多,容易记忆训练数据。

3、防止过拟合的方法

  • 数据集扩增:增加更多的训练数据,可以减少过拟合的风险。

  • 正则化:通过添加正则化项,如L1正则化(Lasso)或L2正则化(Ridge),来惩罚模型参数的大小,使模型更简单。

  • 特征选择:选择最重要的特征,降低模型的复杂度。

  • 交叉验证:使用交叉验证来估计模型的性能,选择最佳的模型参数。

  • 早停止:在训练过程中监控验证集的性能,当性能开始下降时停止训练,以防止过拟合。

欠拟合(Underfitting)

1、基本概念:欠拟合表示模型太过简单,无法捕获数据中的关键特征和模式。模型在训练数据和测试数据上的性能都较差。

2、特征

  • 模型在训练数据上的准确度较低。

  • 模型在测试数据上的准确度也较低。

  • 模型可能太简单,参数数量不足。

3、防止欠拟合的方法

  • 增加模型复杂度:使用更复杂的模型,例如增加神经网络的层数或增加决策树的深度。

  • 增加特征:添加更多的特征或进行特征工程,以捕获更多数据的信息。

  • 减小正则化强度:如果使用了正则化,可以降低正则化的强度,使模型更灵活。

  • 调整超参数:调整模型的超参数,如学习率、批量大小等,以改善模型的性能。

  • 使用更多数据:如果可能的话,增加训练数据可以提高模型的性能。

总的来说,过拟合和欠拟合都是需要非常注意的问题。

选择合适的模型复杂度、正则化方法和特征工程技巧可以帮助在训练机器学习模型时避免这些问题,获得更好的泛化性能。

过拟合-小小案例

过拟合是指模型在训练数据上表现得很好,但在未见过的数据上表现不佳,因为它过于复杂,过度拟合了训练数据中的噪声。

下面用一个简单的多项式回归示例来演示过拟合,并提供解决方法。

首先,让我们生成一个模拟的数据集,然后尝试使用高阶多项式回归模型拟合它:

import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.randn(80) * 0.1# 使用高阶多项式回归模型拟合数据
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_errordegrees = [1, 15]  # 两个不同的多项式次数plt.figure(figsize=(12, 6))
for i, degree in enumerate(degrees):ax = plt.subplot(1, 2, i + 1)model = make_pipeline(PolynomialFeatures(degree), LinearRegression())model.fit(X, y)# 绘制拟合曲线X_test = np.linspace(0, 5, 100)[:, np.newaxis]y_pred = model.predict(X_test)plt.scatter(X, y, color='blue')plt.plot(X_test, y_pred, color='red', linewidth=2)plt.title(f'Degree {degree} Polynomial Regression')# 计算均方误差mse = mean_squared_error(y, model.predict(X))plt.text(4, 0.4, f"MSE: {mse:.2f}", fontsize=12)plt.show()

上面示例中,首先使用了一个简单的线性模型(多项式次数为1),然后使用了一个高阶多项式模型(多项式次数为15)。可以看到,高阶多项式模型在训练数据上表现得非常好,但在数据边界之外的区域出现了极端的波动,这是典型的过拟合现象。

为了解决过拟合问题,可以采取以下几种方法:

  1. 减小模型复杂度:降低多项式的次数或使用更简单的模型,以减少模型的复杂性。

  2. 增加训练数据:收集更多的训练数据,以提供模型更多的信息,减少过拟合的风险。

  3. 正则化:使用正则化技术,如L1正则化(Lasso)或L2正则化(Ridge),来限制模型参数的大小,防止过拟合。

  4. 交叉验证:使用交叉验证来评估模型的性能,以便及早检测并解决过拟合问题。

过拟合问题通常需要综合考虑模型复杂度、数据量和正则化等因素来解决。选择合适的模型和超参数是解决过拟合的关键。

欠拟合-小小案例

欠拟合是指模型在训练数据上表现不佳,不能够捕获数据的复杂性和模式。这通常是由于模型过于简单或者特征不足的原因导致的。

首先,生成一个模拟的数据集,然后尝试使用线性回归模型拟合它,但使用一个过于简单的模型:

import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.randn(80) * 0.1# 使用线性回归模型拟合数据
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_errormodel = LinearRegression()
model.fit(X, y)# 绘制拟合曲线
plt.scatter(X, y, color='blue')
plt.plot(X, model.predict(X), color='red', linewidth=2)
plt.title('Linear Regression - Underfitting')
plt.show()# 计算均方误差
mse = mean_squared_error(y, model.predict(X))
print(f"Mean Squared Error: {mse}")

在上面的示例中,我们使用了一个线性回归模型来拟合一个非线性的数据集(sin函数)。由于线性模型太简单,不能捕获数据的复杂性,导致了欠拟合。

为了解决欠拟合问题,可以采取以下几种方法:

1、增加模型复杂度:可以尝试使用更复杂的模型,例如多项式回归,以更好地拟合数据的形状。

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline# 使用多项式回归
degree = 5
polyreg = make_pipeline(PolynomialFeatures(degree), LinearRegression())
polyreg.fit(X, y)# 绘制多项式回归拟合曲线
plt.scatter(X, y, color='blue')
plt.plot(X, polyreg.predict(X), color='red', linewidth=2)
plt.title(f'Polynomial Regression (Degree {degree})')
plt.show()# 计算均方误差
mse_poly = mean_squared_error(y, polyreg.predict(X))
print(f"Mean Squared Error (Polynomial Regression): {mse_poly}")

2、增加特征:如果特征不足以描述数据的复杂性,可以尝试添加更多特征,以便模型能够更好地拟合数据。

3、减小正则化:如果您在使用正则化(如L1或L2正则化)来防止过拟合,可以考虑减小正则化强度,以允许模型更好地拟合数据。

欠拟合问题的解决方法通常涉及增加模型复杂度或改进特征工程,以使模型更能够捕获数据的潜在模式。

不过,需要注意,增加模型复杂度也可能导致过拟合,因此需要谨慎选择模型和调整超参数。

最后

今天介绍了过拟合和欠拟合,以及代码案例,并且给出的解决方案。

喜欢的朋友可以收藏、点赞、转发起来!

相关文章:

机器学习过拟合和欠拟合!看这一篇文章就够了 建议收藏!(上篇)

在机器学习中,有一项非常重要的概念,那就是:过拟合(Overfitting)和欠拟合(Underfitting)。 它们涉及到机器学习中常见的两种模型性能问题,分别表示模型在训练数据上表现得过于复杂或…...

关于阳光雨露外派联想的面试感想

最近在找工作,接到了一个阳光雨露外派联想的面试邀请。说实在的一开始就有不对劲的感觉。想必这就是大厂的自信吧,上就问能不能现场面试,然后直接发面试邀请。这时候我倒是没觉得有啥问题。 然后今天就去面试去了,住的比较偏&…...

深度神经网络介绍与实战

一、介绍 深度神经网络(Deep Neural Networks,DNNs)是一种强大的机器学习算法,被广泛应用于计算机视觉、自然语言处理、语音识别等领域。它是人工神经网络的一种扩展,包含多个隐藏层,每一层都由多个神经元组成。 与传统的机器学习算法相比,深度神经网络具有以下特点:…...

图解 Transformer

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…...

SpringCloud配置文件bootstrap不生效问题解决

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…...

Java面试八股之自旋是什么意思

Java中的自旋是什么意思 自旋是多线程编程中的一种同步机制&#xff0c;尤其在Java中与锁的实现密切相关。当一个线程尝试获取某个锁&#xff08;如内置锁或显式锁&#xff09;时&#xff0c;如果锁已被其他线程持有&#xff0c;通常的做法是将该线程置于阻塞状态&#xff0c;…...

做好随时离开的准备:前一天还在为618加班到凌晨,第二天就被裁了

今日感悟 最近&#xff0c;一则令人唏嘘的新闻在网络上引起了广泛关注&#xff1a;一名员工前一天还在为618大促活动加班到凌晨&#xff0c;身心疲惫&#xff0c;然而第二天却收到了裁员通知&#xff0c;顿时陷入了失业的困境。 这则新闻不仅揭示了职场竞争的残酷现实&#xff…...

利用ESP32(Arduino IDE)向匿名上位机发送欧拉角

文章目录 一. 匿名上位机介绍二. 匿名协议说明1. 匿名协议官方说明文档2. 协议说明 三. 向匿名上位机发送数据(基于Arduino IDE的esp32)四. 运行效果 一. 匿名上位机介绍 匿名上位机官方介绍视频 匿名上位机官方下载 二. 匿名协议说明 1. 匿名协议官方说明文档 官方对于协…...

Java开发工具类(JDK、Hutool、Guava)

目录 Java开发常用的工具类1、JDK自带程序读取控制台输入内容&#xff08;调试程序或者学习的时候比较有用&#xff09;Arrays工具类 数组转集合Collections 集合工具类 排序Collections 集合工具类 查找Lambda表达式 操作集合 收集、转map、分组 2、Apache 的 commons-lang3 和…...

TCP协议的相关特性

目录 正文&#xff1a; 1.可靠性 2.连接管理 3.滑动窗口 4.流量控制 5.拥塞控制 6.延迟应答 7.捎带应答 总结&#xff1a; 正文&#xff1a; 1.可靠性 TCP协议是一个有连接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工的协议。其中可靠传输的实现…...

Lombok,一款超级强大的Java工具库

在软件开发过程中&#xff0c;繁琐的模板代码经常让开发者感到烦恼。 Lombok 是一款 Java 库&#xff0c;能够帮助开发者减少这些冗余代码&#xff0c;提高开发效率。本文将介绍 Lombok 的基本概念、安装和配置方法&#xff0c;以及如何在实际项目中使用它。 Lombok 是什么 L…...

FreeBSD下使用原生虚拟机管理器bhyve

hbyve简介 自 FreeBSD 10.0-RELEASE 起&#xff0c;BSD 许可的 bhyve 虚拟机管理器已成为底层系统不可或缺的一部分。bhyve 强大而灵活&#xff0c;支持多种客户机操作系统&#xff0c;涵盖 FreeBSD、OpenBSD 以及多个 Linux 发行版。在默认配置下&#xff0c;bhyve 提供对串行…...

CTFshow之文件上传web入门151关-161关解密。包教包会!!!!

这段时间一直在搞文件上传相关的知识&#xff0c;正好把ctf的题目写了写&#xff0c;也算是给自字做个总结&#xff01; 不过ctf有一个缺点就是所有的测试全部是黑盒测试&#xff0c;无法从代码层面和大家解释&#xff0c;我找个时间把upload-labs靶场做一做给大家讲讲白盒的代…...

【学习记录】服务器转发使用tensorboard

场景 代码在服务器上运行&#xff0c;想使用tensorboard查看训练的过程。 但是服务器上不能直接访问地址&#xff0c;所以要转发端口到本地&#xff0c;从而在本地网页中能够打开tensorboard。 参考&#xff1a;https://zhuanlan.zhihu.com/p/680596384 这时我们需要建立本地…...

类型转换之显式转换

显式转换——>手动处理&#xff0c;强制转换 括号强转 作用&#xff1a;一般情况下&#xff0c;将高精度的类型转换为低精度。 语法&#xff1a;变量类型 变量名 &#xff08;变量类型&#xff09;变量; 注意&#xff1a;精度问题&#xff0c;范围问题。 括号强转&#x…...

Mybatis多表查询,报错:Column ‘id‘ in field list is ambiguous

错误原因&#xff1a; Mybatis 多表查询时&#xff0c;多个表有相同名字的字段&#xff0c;比如 id&#xff0c;名字重复&#xff0c;没有指定对应的表名。 有两个地方需要注意&#xff1a;(1)将其中一个重复字段的 Mybatis的 column 修改为其他的名字。(2)字段加上对应的表名…...

PyCharm面板ctrl+鼠标滚轮放大缩小代码

1.【File】➡【Settings】 2.点击【Keymap】&#xff0c;在右边搜索框中搜incre&#xff0c;双击出现的【Increase Font Size】 3.在弹出的提示框中选择【Add Mouse Shortcut】 4.弹出下面的提示框后&#xff0c;键盘按住【ctrl】&#xff0c;并且上滑鼠标滚轮。然后点击【O…...

【Qt】数据库(一)SQLITE创建、增删查改

填坑1&#xff1a;如何连续插入 汇总SQlite语句 创建表格&#xff1a;create table <table_name> (f1 type1, f2 type2,…); 增&#xff1a;insert into <table_name> values (value1, value2,…); 改&#xff1a;update <table_name> set <f1value1>,…...

【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)

在本篇文章中&#xff0c;我们将详细解读力扣第165题“比较版本号”。通过学习本篇文章&#xff0c;读者将掌握如何使用多种方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解&#xff0c;以便于理解。 问题描述 …...

用PhpStudy在本地电脑搭建WordPress网站教程(2024版)

对新手来说&#xff0c;明白了建站3要素后&#xff0c;如果直接购买域名、空间去建站&#xff0c;因为不熟练&#xff0c;反复测试主题、框架、插件等费时费力&#xff0c;等网站建成可能要两三个月&#xff0c;白白损失这段时间的建站费用。那么新手怎么建测试网站来练手呢&am…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...