【耗时八个小时】机器学习过拟合和欠拟合!看这一篇文章就够了

..

纯.

.干

.

.

.

.

在机器学习中,有一项非常重要的概念,那就是:过拟合(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/pingmian/22578.shtml

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

相关文章

[modern c++] 使用shared_mutex , shared_lock完成读写锁,Need C++ 17

前言: C 17开始,引入了两个新的同步组件, shared_mutex 和 shared_lock ,这两个组件的一个典型使用案例就是实现读写锁。 原语: shared_mutex , 一个提供让多个线程都可以同时获取能力的mutex。 shared_…

一键开启:盲盒小程序里的梦幻奇遇

在繁忙的都市生活中,每个人心中都藏着一个关于奇遇的梦想。如今,我们为您精心打造了一款盲盒小程序——“梦幻奇遇”,只需一键开启,就能带您走进一个充满无限惊喜和梦幻色彩的奇幻世界。 一、神秘盲盒,惊喜连连 “梦幻…

gitlab之cicd的gitlab-runner集成-dockerfile构建环境

目录 概述离线资源docker-compose问题 docker-compose问题1问题2 gitlab-runner集成gitlab 概述 cicd引文目录是想通过dockerfile构建 maven、jdk、docker环境的 gitlab-runner 运行环境。但docker最后测试的时候有点问题,且最后使用 kubectl 时有麻烦,所…

python--面向对象-文件读写-异常

一、继承 定义一个类时,需要使用另外一个类的方法或属性,就可以通过继承实现 object是Python的顶级类,创建类是会自动继承,就拥有object中的方法 定义格式 # 类的定义 # 旧式类定义 一般在定义单个类时使用 class 类名:name N…

Spring Boot 使用自定义注解和自定义线程池实现异步日志记录

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

.NET集成DeveloperSharp操作SqlServer、MySql等数据库

🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面…

在Linux系统中程序是如何执行的?

在Linux系统中,程序的执行是一个复杂而精细的过程,涉及多个步骤。 1.进程创建 在Linux中,进程的创建,除了第一个进程(0号进程)是通过硬编码创建,其他所有进程通常都是通过fork()系统调用来实现…

力扣2134.最少交换次数得到连续的1(断环成链)

力扣2134.最少交换次数得到连续的1(断环成链) 最终一定是所有1的个数(长度) 的区间 所以求所有1的和 用和作为k作滑动窗口将环断成长度为nsum-1的链 class Solution {public:int minSwaps(vector<int>& nums) {int sum accumulate(nums.begin(),nums.end(),0);in…

如何保持气膜场馆内部空气新鲜—轻空间

气膜建筑作为现代建筑的一种新兴形式&#xff0c;以其独特的优势和设计受到了广泛欢迎。然而&#xff0c;保持气膜内部空气新鲜是一个必须解决的问题。我们通过配备先进的新风系统&#xff0c;提供了高效的解决方案。 新风系统的工作原理 气膜建筑内部空气的新鲜度主要依靠其配…

在C++中,NULL和nullptr有什么区别?

在C11之前&#xff0c;一般使用NULL代表空指针。 NULL的定义在C和C中不同&#xff0c;而且C和C针对0和指针之间的运算规则也存在差异&#xff1a; C03标准&#xff1a;空指针常量是整数类型的整型常量表达式右值&#xff0c;其值为零。空指针常量可以转换为指针类型&#xff…

【vscode-快捷键 一键JSON格式化】

网上有很多JSON格式化工具&#xff0c;也有很多好用的在线json格式化工具。但是其实Vscode里面的可以直接格式化JSON&#xff0c;这里分享一个我常用的小插件 Prettify JSON 未格式化的JSON数据 召唤出命令行&#xff0c;输入prettify JSON 即可! ✿✿ヽ(▽)ノ✿

算法题:Java求数组中最大的值

采用分而治之&#xff08;二分法&#xff09;的思想去求解 分而治之&#xff1a;分而治之的思想可以用于解决很多问题&#xff0c;大概的思路就是把一个比较大的复杂的问题切分成小的块&#xff0c;然后分头去解决他们&#xff0c;最后再把结果合并起来&#xff0c;就是“分而治…

C++中的string类详解

在C中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;用于存储和处理文本数据。C标准库提供了std::string类&#xff0c;它是一个模板类&#xff0c;专门用于处理字符串。std::string类提供了丰富的成员函数和操作符重载&#xff0c;使得字符串操作变得简单而高效。本…

【JAVA】把结果保留两位小数的方法

在Java中&#xff0c;保留两位小数可以使用几种不同的方法&#xff0c;下面将详细解释并给出每种方法的例子&#xff1a; 1.使用DecimalFormat类 DecimalFormat是java.text包中的一个类&#xff0c;专门用于格式化数字&#xff0c;包括保留小数点后指定的位数。下面是使用Dec…

git介绍、安装、配置

文章目录 1. GIT介绍2. 使用GIT的好处3. GIT 安装4. GIT 配置4.1 GIT 初始化设置、命令别名设置4.2 如果终端安装了oh-my-zsh&#xff0c;会带一堆git命令别名4.3 GIT配置文件介绍4.3.1 Linux、Mac OS系统4.3.2 windows系统 5. git设置远程仓库账号密码(拉取、上传代码不用输入…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。随着技术的发展&#xff0c;Node.js 不断推出新版本&#xff0c;引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南&#xff0c;帮…

Unity3D DOTS 10W GPU Intancing 动画与合批优化详解

前言 Unity3D DOTS&#xff08;Data-Oriented Technology Stack&#xff09;是Unity引擎的一个新的技本堆栈&#xff0c;旨在提高游戏的性能和效率。其中的GPU Instancing和合批技术是其重要的优化手段之一。本文将详细介绍Unity3D DOTS中的10W GPU Instancing技术以及动画与合…

高清多媒体接口(High Definition Multimedia Interface, HDMI)

目录 1. Overview1.1. TMDS(Time Minimized Differential Signal)1.2. Display Data Channel(DDC)1.3. CEC1.4. HEAC1.5. HPD2. Signaling and Encoding3. Video4. Control and Configuration5. Compatibility with DVI6. EDID and E-EDID7. HDCP<

C++高级 - 接口模板

目录 一. 接口 二. 模板 一. 接口 接口通常是通过抽象类或纯虚函数来实现的。 以下是一个使用抽象类来定义接口的示例代码&#xff1a; #include <iostream>class Interface { public:virtual void operation() 0; // 纯虚函数定义接口 };class ConcreteClass : pu…

linux flask | 接口保持在后台一直运行、python后端接口长期调用、python后台持续运行方法、python提供后端接口

文章目录 一、flask接口二、长期运行接口2.1、nohup与&后台运行 实际项目中我们需要用python提供一个后端接口&#xff0c;并在linux上持续运行这个程序&#xff0c;以供其他项目调用。下面就用个简单示例讲解下怎么写python后端接口&#xff0c;以及如何将程序长期运行在l…