【机器学习】正则化,欠拟合与过拟合(详细代码与图片演示!助你迅速拿下!!!)

news2024/9/19 10:35:26

目录

🍔欠拟合与过拟合

1.1 欠拟合与过拟合定义

1.2 通过代码认识过拟合和欠拟合

1.3 原因以及解决办法

🍔正则化

2.1 什么是正则化

2.2 正则化类别

🍔小结


学习目标

🍀 掌握过拟合、欠拟合的概念

🍀 掌握过拟合、欠拟合产生的原因

🍀 知道什么是正则化,以及正则化的分类

🍔欠拟合与过拟合

1.1 欠拟合与过拟合定义

🐻 过拟合:一个假设 在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据 (体现在准确率下降),此时认为这个假设出现了过拟合的现象。(模型过于复杂)

🐻 欠拟合:一个假设 在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据 ,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

过拟合和欠拟合的区别

欠拟合在训练集和测试集上的误差都较大

过拟合在训练集上误差较小,而测试集上误差较大

1.2 通过代码认识过拟合和欠拟合

🐼 绘制数据

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(666)
x = np.random.uniform(-3,3,size = 100)
X = x.reshape(-1,1)
​
y = 0.5* x**2 + x+2 +np.random.normal(0,1,size = 100)
​
from sklearn.linear_model import LinearRegression
estimator = LinearRegression()
estimator.fit(X,y)
y_predict = estimator.predict(X)
​
plt.scatter(x,y)
plt.plot(x,y_predict,color = 'r')
plt.show()

#计算均方误差
from sklearn.metrics import mean_squared_error
mean_squared_error(y,y_predict)
​
#3.0750025765636577

🐼 添加二次项,绘制图像

X2 = np.hstack([X,X**2])
estimator2 = LinearRegression()
estimator2.fit(X2,y)
y_predict2 = estimator2.predict(X2)

plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color = 'r')
plt.show()

#计算均方误差和准确率
​
from sklearn.metrics import mean_squared_error
mean_squared_error(y,y_predict2)
​
#1.0987392142417858

🐼 再次加入高次项,绘制图像,观察均方误差结果

X5 = np.hstack([X2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10])
​
estimator3 = LinearRegression()
estimator3.fit(X5,y)
y_predict5 = estimator3.predict(X5)
​
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict5[np.argsort(x)],color = 'r')
plt.show()
​
error = mean_squared_error(y, y_predict5)
error
​
#1.0508466763764157

通过上述观察发现,随着加入的高次项越来越多,拟合程度越来越高,均方误差也随着加入越来越小。说明已经不再欠拟合了。

那么问题来了:

🤖 如何判断出现过拟合呢?

将数据集进行划分:对比X、X2、X5的测试集的均方误差

X的测试集均方误差

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 5)
estimator = LinearRegression()
estimator.fit(X_train,y_train)
y_predict = estimator.predict(X_test)
​
mean_squared_error(y_test,y_predict)
#3.153139806483088

X2的测试集均方误差

X_train,X_test,y_train,y_test = train_test_split(X2,y,random_state = 5)
estimator = LinearRegression()
estimator.fit(X_train,y_train)
y_predict = estimator.predict(X_test)
mean_squared_error(y_test,y_predict)
#1.111873885731967

X5的测试集的均方误差

X_train,X_test,y_train,y_test = train_test_split(X5,y,random_state = 5)
estimator = LinearRegression()
estimator.fit(X_train,y_train)
y_predict = estimator.predict(X_test)
mean_squared_error(y_test,y_predict)
#1.4145580542309835

1.3 原因以及解决办法

欠拟合产生原因: 学习到数据的特征过少

💘 解决办法:

(1)添加其他特征项,有时出现欠拟合是因为特征项不够导致的,可以添加其他特征项来解决

(2)添加多项式特征,模型过于简单时的常用套路,例如将线性模型通过添加二次项或三次项使模型泛化能力更强

过拟合产生原因: 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾所有测试样本

💘 解决办法:

(1)重新清洗数据,导致过拟合的一个原因有可能是数据不纯,如果出现了过拟合就需要重新清洗数据。

(2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

(3)正则化

(4)减少特征维度

🍔正则化

2.1 什么是正则化

在解决回归过拟合中,我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的问题,除了一些算法本身作用之外(决策树、神经网络),我们更多的也是去自己做特征选择,包括之前说的删除、合并一些特征

🥪 如何解决?

在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化

注:调整时候,算法并不知道某个特征影响,而是去调整参数得出优化的结果

2.2 正则化类别

🐻 L1正则化

  • 假设𝐿(𝑊)是未加正则项的损失,𝜆是一个超参,控制正则化项的大小。

  • 则最终的损失函数:𝐿=𝐿(𝑊)+ \lambda*\sum_{i=1}^{n}\lvert w_i\rvert

作用:用来进行特征选择,主要原因在于L1正则化会使得较多的参数为0,从而产生稀疏解,可以将0对应的特征遗弃,进而用来选择特征。一定程度上L1正则也可以防止模型过拟合。

LASSO回归: from sklearn.linear_model import Lasso

🐻 L2正则化

  • 假设𝐿(𝑊)是未加正则项的损失,𝜆是一个超参,控制正则化项的大小。

  • 则最终的损失函数:𝐿=𝐿(𝑊)+ \lambda*\sum{i=1}^{n}w{i}^{2}

作用:主要用来防止模型过拟合,可以减小特征的权重

优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

Ridge回归: from sklearn.linear_model import Ridge

🐻 L2正则为什么可以减小特征权重

  • 对于之前梯度下降讲到的损失函数来说,在代价函数后面加上一个正则化项

  • 对其求偏导后得到

  • 然后得到梯度下降的表达式如下

🐻 L1正则为什么可以产生稀疏解(可以特征选择)

稀疏性:向量中很多维度值为0

  • 对其中的一个参数 w_i 计算梯度,其他参数同理,α是学习率,sign(wi)是符号函数。

L1的梯度

🍼 𝐿=𝐿(𝑊)+ \lambda*\sum_{i=1}^{n}\lvert w_i\rvert

 🍼 \frac{\partial L}{\partial w{i}} = \frac{\partial L(W)}{\partial w{i}}+\lambda sign(w_{i})

🍼 w_i = w_i - \alpha \frac{\partial L(W)}{\partial w_{i}} - \alpha 2\lambda w_i

正则化案例💯:

X10 = np.hstack([X2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10]) 
estimator3 = LinearRegression() 
estimator3.fit(X10,y) 
y_predict3 = estimator3.predict(X10) 
​
plt.scatter(x,y) 
plt.plot(np.sort(x),y_predict3[np.argsort(x)],color = 'r') 
plt.show()
​
estimator3.coef_
​
array([ 1.32292089e+00,  2.03952017e+00, -2.88731664e-01, -1.24760429e+00,
        8.06147066e-02,  3.72878513e-01, -7.75395040e-03, -4.64121137e-02,
        1.84873446e-04,  2.03845917e-03])

from sklearn.linear_model import Lasso  # L1正则
from sklearn.linear_model import Ridge  # 岭回归 L2正则
​from numpy import np

X10 = np.hstack([X2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10]) 
estimator_l1 = Lasso(alpha=0.005,normalize=True) # 调整alpha 正则化强度 查看正则化效果
estimator_l1.fit(X10,y) 
y_predict_l1 = estimator_l1.predict(X10) 
​
plt.scatter(x,y) 
plt.plot(np.sort(x),y_predict_l1[np.argsort(x)],color = 'r') 
plt.show()
​
estimator_l1.coef_  # Lasso 回归  L1正则 会将高次方项系数变为0
​
array([ 0.97284077,  0.4850203 ,  0.        ,  0.        , -0.        ,
        0.        , -0.        ,  0.        , -0.        ,  0.        ])

X10 = np.hstack([X2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10]) 
estimator_l2 = Ridge(alpha=0.005,normalize=True) # 调整alpha 正则化强度 查看正则化效果
estimator_l2.fit(X10,y) 
y_predict_l2 = estimator_l2.predict(X10) 
​
plt.scatter(x,y) 
plt.plot(np.sort(x),y_predict_l2[np.argsort(x)],color = 'r') 
plt.show()
​
estimator_l2.coef_   # l2 正则不会将系数变为0 但是对高次方项系数影响较大
​
array([ 9.91283840e-01,  5.24820573e-01,  1.57614237e-02,  2.34128982e-03,
        7.26947948e-04, -2.99893698e-04, -8.28333499e-05, -4.51949529e-05,
       -4.21312015e-05, -8.22992826e-07])

🍔小结

🍬 欠拟合

  • 在训练集上表现不好,在测试集上表现不好

  • 解决方法,继续学习:添加其他特征项,添加多项式特征

🍬 过拟合

  • 在训练集上表现好,在测试集上表现不好

  • 解决方法:重新清洗数据集、增大数据的训练量、正则化、 减少特征维度

🍬 正则化

  • 在损失函数中加入正则项,通过减小回归系数

  • L1正则化:可以将某些特征的回归系数变为0

  • L1正则化API:Lasso回归

# 代码演示
from sklearn.linear_model import Lasso
  • L2正则化:每次梯度下降迭代都减小特征前面的系数

  • L2正则化API:岭回归

# 代码演示
from sklearn.linear_model import Ridge

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

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

相关文章

黄山黄小徽光影乐园:思特科技打造沉浸式光影乐园解决方案,快乐指数拉满了!

01      「黄小徽儿童光影乐园」是由思特科技全力打造,依托行业领先的数字光影技术与交互科技,专为3-8岁儿童设计的全场景、全交互、全沉浸的沉浸式光影乐园解决方案。    沉浸式光影乐园解决方案-黄小徽儿童光影乐园      02      思特…

无人机之固定翼无人机的组成

固定翼无人机是根据空气动力学原理设计机翼的形状,靠动力装置产生推力或者拉力,使无人机获得一定速度后,会导致空气在飞机上下表面的压力不同,进而产生升力,其升力主要来源于固定的机翼。大多数都是由机翼、机身、尾翼…

ultralytics实例分割mask读取

在前面学习YOLOv8的实例分割过程中,需要使用实例分割的数据集,其标签的标注格式如下: 实例分割勾勒轮廓 其中,第一个数字代表的是类别编号,后面的数据代表的是标注的坐标(转换到0-1之间)每两个…

编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度

文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码: SessionFactoryImpl 的初始化里做了非常多的事情,初始化各种资源,并调用 SchemaManagementToolCoordinat…

c语言基础--------字符串指针

在 C 语言中,字符串指针是一个指向字符类型的指针,通常用于指向字符串的第一个字符。字符串在 C 语言中通常表示为字符数组,而字符串指针则是用来存储这种字符数组首地址的变量。 定义字符串指针 字符串指针的定义方式如下: ch…

Android更改包名和签名

一、更改包名 1、包名——鼠标右键——Refactor——Rename 修改自己想更改的包名和选择更改范围后点击Refactor就可以了 2.手动修改app的build.gradle文件中的applicationId(改成和我们之前修改的包名相同) 3.修改AndroidManifest.xml文件中的packag…

“AI+Security”系列第2期(三):面向LLM(大语言模型)的漏洞挖掘与对齐防御研究

近日,由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗!大模型自身安全的攻防博弈线上活动如期举行。 在此次活动中,前阿里云高级安全专家郑瀚带来了以《通往LLM安全对齐的道路…

网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)

大家好,我是程序员鱼皮,8 月 19 日下午,网易云音乐突发严重故障,并登顶微博热搜,跟黑神话悟空抢了热度。 根据用户的反馈,故障的具体表现为:用户无法登录、歌单加载失败、播放信息获取失败、无法…

SQL— DML语句学习【后端 10】

数据库操作-DML 详解 在数据库管理系统中,DML(Data Manipulation Language,数据操作语言)扮演着至关重要的角色,它负责对数据库中的数据进行增、删、改操作。掌握DML操作对于数据库的日常维护和管理至关重要。本文将详…

CSP 2023 普及组第一轮 - CSP/S 2023初试题 完善程序第二题解析

一、题目阅读 (编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字…

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…

【C++ 第十二章】二叉搜索树

1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 左边小:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值右边大:若它的右子树不为空,则右子树上…

并网式光伏气象站——科技百科

并网式光伏气象站的工作原理简洁而充满智慧,并网式光伏气象站巧妙地通过太阳能电池板将太阳能转化为电能,利用先进的气象监测设备,‌对风速、‌风向、‌温度、‌湿度、‌光照等关键气象要素进行实时监测和记录,不仅充分利用了太阳…

【初阶数据结构题目】32. 希尔排序

文章目录 希尔排序希尔排序的时间复杂度计算 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数(通常是gap n/31),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内&#x…

全国10米分辨率逐年植被覆盖度(FVC)数据集

本数据集包括2017至2023年间,全国植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。GeoTIFF文件均可用ArcGIS软件和GDAL读取和打开。 植被覆盖度是指植被(包括叶、茎、枝)在地面的垂直投影面积占统…

系统编程-进程初步2

进程初步2 目录 进程初步2 1、进程等待清理函数(wait) 2、等待指定的子进程(waitpid) 3、新的开辟进程的函数(vfork) 4、在程序中运行系统下的指令(system) 5、exec 函数族 …

初识指针4の学习笔记

目录 1>>前言 2>>字符指针变量 3>>数组指针变量 4>>函数指针变量 5>>函数指针数组 6>>回调函数是什么? 7>>结语 1>>前言 今天我会继续分享一些我做的笔记,以及我对指针的理解, 后续会…

查看会议所属CCF级别(A/B/C类会议)

步骤: 1、打开中国计算机学会官网:中国计算机学会 (ccf.org.cn)。 2、搜索框中输入会议名称,例如:SIGKDD。 3、点击打开如图所示来源是“学术评价”的网页。 4、进入如下页面。 可以看到,SIGKDD是CCF A类会议。 参考…

低代码: 关于Test Driven Development - 测试驱动开发组件与测试示例

TDD 的开发方式 Test Driven Development - 测试驱动开发这是一种非常有意思的开发方式,我们进入一个实际场景,拿需要自研的colorpicker表单组件来说表单中的很多属性,都需要进行一个颜色的选择,如背景颜色,字体颜色等等我们来看一下相关设计交互在这里我们分两个图,点击…

python的导入包飘红

本文是mac的解决方法 1、点击pycharm-preferences-paython interpreter 直接搜索你要导入的包名,选择版本号点击 install 2、第二种方法是命令 pip3 install pandas2.2.2