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

 在机器学习中,有一项非常重要的概念,那就是:过拟合(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正则化)来防止过拟合,可以考虑减小正则化强度,以允许模型更好地拟合数据。

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

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

最后

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

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

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

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

相关文章

Jetpack架构组件_2. 数据绑定库

1.理论基础 数据绑定库是一个支持库,可让您使用声明性格式(而不是以程序化方式)将布局中的界面组件绑定到应用中的数据源。 布局通常使用调用界面框架方法的代码在 activity 中定义。例如,以下代码会调用 findViewById() 来查找 T…

zabbix自定义监控项

文章目录 1、配置conf文件(zabbix_agent2)linuxwindows 2、配置监控项3、配置触发器4、查看监控数据 示例自定义程序 hash_tool:输出指定目录的哈希值 调用指令: hash_tool --path [指定目录] 1、配置conf文件(zabbix_agent2) linux vim /etc/zabbix/z…

Mac vscode 常用相关快捷键

Command 点击 多光标插入 Shift 点击 复制选中的代码块 Command X 剪切(未选中文本的情况下,剪切光标所在行) Command C 复制(未选中文本的情况下,复制光标所在行) Command V 粘贴 Command L 选中当前…

【chisel】chisel中for (i <- 0 until N-2) {} 的用法,表示什么?

在 Chisel 中&#xff0c;for (i <- 0 until N-2) {} 是一个 for 循环的语法&#xff0c;它表示从 0 开始到 N-2 的整数&#xff08;不包括 N-2&#xff09;&#xff0c;并对每个整数 i 执行大括号 {} 内的代码块。 这里的 until 是 Scala 语言的一个关键字&#xff0c;用于…

安卓获取内部存储信息

目录 前言获取存储容量 前言 原生系统设置里的存储容量到底是怎么计算的&#xff0c;跟踪源码&#xff0c;涉及到VolumeInfo、StorageManagerVolumeProvider、PrivateStorageInfo、StorageStatsManager......等等&#xff0c;java上层没有办法使用简单的api获取到吗&#xff1f…

穿越无人机中涉及到的算法主要包括以下几种:

当涉及穿越无人机中的算法时&#xff0c;我们可以从以下几个方面进行详细分析&#xff0c;并尽量参考文章中的相关数字和信息&#xff1a; 1.捷联式惯性导航系统&#xff1a; 定义&#xff1a; 利用加速度计和陀螺仪等惯性元件&#xff0c;直接测量飞行器的角运动信息和线运动…

深入解析Python中的两种导入方法:from...import与import

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、from...import与import的基本区别 1. 导入方式的不同 2. 命名空间的差异 三…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的&#xff0c;学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统…

软件项目管理 - 作业集合

软件项目管理 - 作业集合 作业一 1、项目与日常运作的主要区别有哪些&#xff1f; 项目&#xff1a;为提供一项独特产品、服务或成果所做的临时性努力 运作&#xff1a;连续不断周而复始的活动 项目是一次性的&#xff0c;日常运作是重复进行的&#xff1b; 项目是以目标为导…

CI/CD:持续集成/持续部署

1. 安装docker、docker-compose # 安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i sdownload.docker.commirrors.aliyun.com/docker-ce /…

neo4j docker安装使用,py2neo python包使用

参考&#xff1a;https://neo4j.com/docs/operations-manual/current/docker/introduction/ 运行&#xff1a; docker run --publish7474:7474 --publish7687:7687 neo4j查看&#xff1a; http://192***ip:7474 username/password 都是 neo4j/neo4j 简单案例 创建例子&am…

前端数据存储之cookie、LocalStorage与SessionStorage

JS详解Cookie、LocalStorage与SessionStorage 基本概念 Cookie Cookie是小甜饼的意思。顾名思义&#xff0c;cookie确实非常小&#xff0c;它的大小限制为4KB左右。他的主要用途又保存登录信息&#xff0c;比如你登录某个网站市场可以看到“记住密码”&#xff0c;这通常就是…

重生之 SpringBoot3 入门保姆级学习(04、 包扫描)

重生之 SpringBoot3 入门保姆级学习&#xff08;04、 包扫描&#xff09; 2.1 包扫描 2.1 包扫描 默认包扫描规则&#xff1a; SpringBootApplication 标注的就是主程序 SpringBoot 只会扫描主程序下面的包 自动的 component-scan 功能 在 SpringBootApplication 添加参数可以…

前端开发工程师——AngularJS

一.表达式和语句 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

【C语言】char,short char,long char分别是多少字节,多少位,多少bit

一&#xff0c;char&#xff0c;short char&#xff0c;long char分别是多少字节 在 C 语言中&#xff0c;char、short、int、long 这些数据类型的大小是平台相关的&#xff0c;它们的大小取决于编译器和操作系统的实现。然而&#xff0c;它们的大小通常遵循以下规则&#xff…

创新融合,5G+工业操作系统引领未来工厂

为加速企业完成生产制造自动化和经营管理自动化&#xff0c;从而走向未来工厂&#xff0c;蓝卓不断探索supOS工业操作系统与前沿技术的的创新融合&#xff0c;而5G技术为工业操作系统提供了更多元化的赋能手段和想象空间。目前&#xff0c;supOS围绕生产、安全、质检、监控等领…

语音转文字软件哪个好?掌握这3个方法,告别手写记录

开会多又杂&#xff0c;手写记录累死人&#xff1f; 每天的工作日程中&#xff0c;会议总是不可或缺的一部分。不论是团队讨论还是项目汇报&#xff0c;会议记录都是必不可少的。但手写记录会议内容不仅耗时耗力&#xff0c;还容易遗漏重要信息。 那么&#xff0c;有没有更高…

张驰咨询:六西格玛培训,IT界的“福尔摩斯”

六西格玛&#xff0c;这个曾以制造业为背景的管理理念&#xff0c;如今却在IT领域大放异彩。其背后的原因&#xff0c;不仅仅是因为六西格玛追求零缺陷、持续改进的核心价值观与IT行业对产品质量和用户体验的极致追求不谋而合&#xff0c;更是因为它提供了一种全新的思维方式和…

2024.05.28|生信早报【AI测试版】

日期&#xff1a;2024-05-28 拓尔思&#xff1a;拓知全球基因专利数据库助力合成生物研发&#xff0c;规避专利申请风险。和元生物&#xff1a;连续亏损&#xff0c;累计亏损1.7亿元&#xff0c;基因治疗CRO业务推出新服务。国际生物多样性日&#xff1a;杭州打造“北纬30度生…

【pyTorch安装版本真麻烦】

1、pytorch 2.0.1版本可以用cuda11.7 # CUDA 11.7 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia 2、pytorch 2.1 版本后最低cuda11.8 3、安装pytorch时候&#xff0c;注意torchaudio 版本 总之注意pyTorch安装版本…