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

【理解机器学习中的过拟合与欠拟合】

在机器学习中,模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示,详细解析过拟合与欠拟合现象,并提出应对策略。主要内容如下:

什么是过拟合和欠拟合?
如何防止过拟合和欠拟合?
出现过拟合或欠拟合时怎么办?
使用代码和图像辅助理解。


一、什么是过拟合和欠拟合?

1.1过拟合(Overfitting)

定义:过拟合就是模型“学得太多了”,它不仅学会了数据中的规律,还把噪声和细节当成规律记住了。这就好比一个学生在考试前死记硬背了答案,但稍微换一道题就不会了。

过拟合的表现:

训练集表现非常好:训练数据上的准确率高,误差低。
测试集表现很差:新数据上的准确率低,误差大。
模型太复杂:比如使用了不必要的高阶多项式或过深的神经网络。

1.2 欠拟合(Underfitting)

欠拟合是什么?

欠拟合就是模型“学得太少了”。它只掌握了最基本的规律,无法捕获数据中的复杂模式。这就像一个学生只学到了皮毛,考试的时候连最简单的题都答不对。

欠拟合的表现:

训练集和测试集表现都很差:无论新数据还是老数据,模型都表现不好。
模型太简单:比如使用了线性模型拟合非线性数据,或者训练时间不足。

二、如何防止过拟合和欠拟合?

2.1 防止过拟合的方法

  1. 获取更多数据

更多的数据可以帮助模型更好地学习数据的真实分布,减少对训练数据细节的依赖。

  1. 正则化

正则化通过惩罚模型的复杂度,让模型不容易“过拟合”。

from sklearn.linear_model import Ridge  # L2正则化
model = Ridge(alpha=0.1)  # alpha控制正则化强度
  1. 降低模型复杂度

简化模型,比如减少神经网络层数或多项式的阶数。

  1. 早停法(Early Stopping)

在模型训练时,监控验证集的误差,如果误差开始上升,提前停止训练。

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
  1. 数据增强(Data Augmentation)

在图像分类任务中,通过旋转、裁剪、翻转等方法增加数据的多样性,提升模型的泛化能力。

2.2 防止欠拟合的方法

  1. 增加模型复杂度

增加模型的参数,比如更多的神经元或更深的网络层。

  1. 延长训练时间

欠拟合可能是因为训练时间不够长,模型没有学到足够的规律。

3。 优化特征工程

如果模型无法拟合数据,可能是因为输入的特征不够好。尝试创建更多、更有意义的特征。

  1. 降低正则化强度

正则化强度过大可能限制了模型的学习能力,适当减小正则化系数。

三、过拟合与欠拟合时怎么办?
当你发现模型出现问题时,可以通过以下策略调整:

现象解决方法
过拟合- 获取更多数据
- 使用正则化
- 降低模型复杂度
- 使用早停法
欠拟合- 增加模型复杂度
- 延长训练时间
- 改善特征质量
- 减小正则化强度

四、代码与图像演示:多项式拟合的例子

下面通过一个简单的例子,用多项式拟合来直观感受过拟合与欠拟合。

4.1 数据生成
我们生成一个非线性数据集,并可视化:

import numpy as np
import matplotlib.pyplot as plt
import matplotlibmatplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为 SimHei,显示中文
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 生成非线性数据
np.random.seed(42)  # 设置随机种子,保证结果可复现
X = np.random.rand(100, 1) * 6 - 3  # X范围[-3, 3]
y = 0.5 * X**3 - X**2 + 2 + np.random.randn(100, 1) * 2  # 非线性关系并添加噪声# 可视化数据
plt.scatter(X, y, color='blue', alpha=0.7, label='数据')  # 绘制散点图
plt.xlabel("X")  # 设置X轴标签
plt.ylabel("y")  # 设置Y轴标签
plt.title("生成的非线性数据")  # 设置图表标题
plt.legend()  # 显示图例
plt.show()  # 显示图表

在这里插入图片描述
结果图:
生成的数据呈现一个明显的非线性分布。

4.2 模型训练与可视化

我们训练三种模型:
线性回归(1阶):欠拟合。
4阶多项式回归:最佳拟合。
10阶多项式回归:过拟合。

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 多项式拟合
degrees = [1, 4, 20]
for degree in degrees:poly_features = PolynomialFeatures(degree=degree)  # 生成多项式特征X_poly_train = poly_features.fit_transform(X_train)X_poly_test = poly_features.transform(X_test)# 训练模型model = LinearRegression()model.fit(X_poly_train, y_train)# 预测y_train_pred = model.predict(X_poly_train)y_test_pred = model.predict(X_poly_test)# 计算误差train_error = mean_squared_error(y_train, y_train_pred)test_error = mean_squared_error(y_test, y_test_pred)# 绘制拟合曲线X_plot = np.linspace(-3, 3, 100).reshape(100, 1)X_poly_plot = poly_features.transform(X_plot)y_plot = model.predict(X_poly_plot)plt.scatter(X, y, color='blue', alpha=0.7, label='Data')plt.plot(X_plot, y_plot, color='red', label=f'Degree {degree}')plt.xlabel("X")plt.ylabel("y")plt.title(f"Degree {degree}\nTrain Error: {train_error:.2f} | Test Error: {test_error:.2f}")plt.legend()plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结果图:

Degree 1(欠拟合):模型太简单,无法捕获数据的非线性规律。
Degree 4(最佳拟合):模型复杂度适中,能很好地拟合数据。
Degree 20(过拟合):模型过于复杂,训练误差低,但测试误差大。

4.3 误差趋势分析

绘制训练误差和测试误差随模型复杂度变化的曲线:

train_errors = []
test_errors = []for degree in degrees:poly_features = PolynomialFeatures(degree=degree)X_poly_train = poly_features.fit_transform(X_train)X_poly_test = poly_features.transform(X_test)model = LinearRegression()model.fit(X_poly_train, y_train)y_train_pred = model.predict(X_poly_train)y_test_pred = model.predict(X_poly_test)train_errors.append(mean_squared_error(y_train, y_train_pred))test_errors.append(mean_squared_error(y_test, y_test_pred))# 绘制误差曲线
plt.plot(degrees, train_errors, marker='o', label='Train Error')
plt.plot(degrees, test_errors, marker='o', label='Test Error')
plt.xlabel("Polynomial Degree")
plt.ylabel("Mean Squared Error")
plt.title("训练误差和测试误差随多项式阶数变化")
plt.legend()
plt.show()

在这里插入图片描述

结果分析:

训练误差随着复杂度增加而降低。
测试误差先下降后上升,呈现“U型趋势”。

五、总结

5.1 过拟合与欠拟合的核心区别

过拟合:模型对训练数据“学得太死”,测试数据表现很差。
欠拟合:模型对数据“学得太少”,训练和测试表现都不好。

5.2 防止方法

防止过拟合:使用正则化、数据增强、早停等方法。
防止欠拟合:增加模型复杂度、延长训练时间、优化特征。


希望这篇文章让你对过拟合与欠拟合有了更深入的理解!如果还有疑问,欢迎交流!

相关文章:

【理解机器学习中的过拟合与欠拟合】

在机器学习中,模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示,详细解析过拟合与欠拟合现象,并提出应对策略。主要内容如下: 什么是过拟合和欠拟合? 如何防止过拟合和欠拟…...

fastjson诡异报错

1、环境以及报错描述 1.1 环境 操作系统为中标麒麟、cpu 为国产鲲鹏服务器。 jdk为openjdk version 1.8.0._242 1.2 错误 com.alibaba.fastjson2.JSONException: syntax error : f at com.alibaba.fastjson2.JSONReaderUTF16.readBoolValue(JSONReaderUTF16.java:6424) at c…...

面经zhenyq

如何去实现分层的动画效果? 在Unity中实现分层的动画效果,可以通过Animator的 Layer 功能实现。以下是详细步骤: 1. 什么是分层动画? 分层动画允许在同一个角色的不同部分同时播放独立的动画。例如: 上半身可以播放…...

GoFrame框架介绍

GoFrame是一款功能强大、设计精良且易用的Go语言开发框架,以下为你详细介绍它的相关特点和内容: ### 框架概述 GoFrame是为了提升Go语言开发者的编码效率以及项目的整体可维护性、可扩展性等而打造的开发框架,它涵盖了从基础的网络通信、数据…...

MapReduce工作流程+Shuffle机制

一、Mapreduce工作流程 (1)数据切片Split。数据切片数决定maptask并行度,默认情况下,一个切片大小块大小。切片不是针对整体数据集,而是针对每一个文件单独切片,所以会有小文件问题(CombineTex…...

JAVA8 Stream API 使用详解

Java 8 引入了 Stream API,它提供了对集合对象进行一系列操作的新方式,包括筛选、转换、聚合等。Stream API 的设计目标是提供一种高效且易于使用的处理集合数据的方式,同时支持并行处理。 以下是 Java 8 Stream API 的一些核心概念和使用详解…...

Redis 集群架构:高可用与扩展性

一、引言 在当今数字化时代,数据量呈爆炸式增长,对数据存储和处理的要求也越来越高。Redis作为一款高性能的键值对存储数据库,其集群架构在应对高并发、大数据量场景时展现出了独特的优势,成为众多企业构建高效、稳定系统的关键技…...

Redis数据对象

基本结构图 key和value指向的是redisObject对象 type:标识该对象用的是什么类型(String、List Redis数据结构 SDS SDS有4个属性: len:记录了字符串长度,因此获取字符串长度的时候时间复杂度O(1&#xff…...

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台,集成了版本控制、代码审查、问题跟踪、持续集成与持续交付(CI/CD)等多种功能,旨在为团队提供一站式的项目管理解决方案。借助 GitLab,开发…...

python版本的Selenium的下载及chrome环境搭建和简单使用

针对Python版本的Selenium下载及Chrome环境搭建和使用,以下将详细阐述具体步骤: 一、Python版本的Selenium下载 安装Python环境: 确保系统上已经安装了Python 3.8及以上版本。可以从[Python官方网站]下载并安装最新版本的Python,…...

重温设计模式--4、组合模式

文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...

5、mysql的读写分离

主从复制 主从复制的含义 主从复制:在一个mysql的集群当中,至少3台,即主1台,从2台。 当有数据写入时,主负责写入本库,然后把数据同步到从服务器。 一定是在主服务器写入数据,从服务器的写入…...

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备,需求是读取m1卡,厂家给了个安卓原生demo,接入arr插件如下,接入后发现还是少了一部分代码,设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录,最后面是解决办法&#xf…...

如何在 Ubuntu 22.04 上安装 Elasticsearch

简介 在本教程中,你将学习如何在 Ubuntu 22.04 服务器上安装 Elasticsearch。此外,你还将学习如何使用 Elasticsearch REST API 索引和操作数据。 Elasticsearch 是一个基于 Apache Lucene Library 的免费分布式搜索和分析引擎。它是一个快速且可扩展的…...

单片机长耗时前后台任务优化

代码: void Task_10ms(void) {... }//改 void Task_2ms(void) {static uint8_t s_state 0switch(s_state){case 0:....s_state 1;break;case 1:....s_state 2;break;case 3:....s_state 1;break;default: //此段可以去除s_state 0;break; } } 参考链接 MCU长…...

Linux大数据方向shell

一、概述 shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核,还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。 二、shell入门 1.输出hello world touch helloworld.sh&…...

爬虫 APP 逆向 ---> shopee(虾皮) 电商

shopee 泰国站点:https://shopee.co.th/ shopee 网页访问时,直接弹出使用 app 登录查看,那就登录 shopee 泰国站点 app。 手机抓包:分类接口 接口:https://mall.shopee.co.th/api/v4/pages/get_category_tree 请求参…...

axios 常见的content-type、responseType有哪些?

一、Content Type Content Type ,也被称为MIME类型(Multipurpose Internet Mail Extensions),是一种用于标识数据格式的机制。在HTTP协议中,Content Type’通常通过请求或响应头部的’Content-Type’字段来指定。这个…...

从零开始C++游戏开发之第七篇:游戏状态机与回合管理

在游戏开发的道路上,状态管理是一个无法绕开的重要课题。尤其是在棋牌类游戏中,游戏的进行需要有条不紊地按照回合推进,同时管理多个游戏状态,如“等待玩家加入”、“游戏进行中”、“结算阶段”等。如何优雅且高效地实现这些逻辑…...

【全开源】Java多语言tiktok跨境商城TikTok内嵌商城送搭建教程

开发工具:IntelliJ IDEA 部署环境: Tomcat8.x Mysql5.6 JDK1.8 Maven3.x Redis ZooKeeper3.4。 本系统开发使用JAVA技术栈开发 使用uniapp技术栈 支持多端 H5AndroidIOS PC端使用:vueelementui 用户端使用:uniapp 管理端使用&#xff1a…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

6.9本日总结

一、英语 复习默写list11list18&#xff0c;订正07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语&#xff1a;复习l默写sit12list17&#…...