当前位置: 首页 > 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正则化)来防止过拟合,可以考虑减小正则化强度,以允许模型更好地拟合数据。

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

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

最后

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

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

相关文章:

  • 备战秋招c++ 【持续更新】
  • huggingface笔记 accelerate launch
  • 学习编程对英语要求高吗?
  • FreeBSD下使用原生虚拟机管理器bhyve
  • KT6368A蓝牙芯片AT命令会被透传出去,指令对为什么会被透传出去
  • PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法
  • Nginx添加访问密码
  • 记录关联(笛卡尔积)——kettle开发24
  • CSS 媒体查询 响应式开发
  • 长度最长的子数组
  • Java Web 应用开发基础 - JSP内置对象
  • Android ANR简介
  • 指纹识别经典图书、开源算法库、开源数据库
  • C语言之指针详解(5)(含有易错笔试题)
  • 达梦授权某个模式给其它用户只读权限
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • django开发-定时任务的使用
  • Docker容器管理
  • docker容器内的网络抓包
  • java第三方包学习之lombok
  • laravel with 查询列表限制条数
  • MySQL QA
  • mysql常用命令汇总
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SSH 免密登录
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 服务器从安装到部署全过程(二)
  • 关于Java中分层中遇到的一些问题
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 微信开源mars源码分析1—上层samples分析
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • elasticsearch-head插件安装
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​第20课 在Android Native开发中加入新的C++类
  • #stm32整理(一)flash读写
  • (39)STM32——FLASH闪存
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)SvelteKit教程:hello world
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net 调用海康SDK以及常见的坑解释
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET开发人员必知的八个网站
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET中GET与SET的用法
  • .net中的Queue和Stack