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

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

学习目标

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

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

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

🍔欠拟合与过拟合

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


相关文章
|
6天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
17 2
|
9天前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
1月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
52 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
7天前
|
机器学习/深度学习
深入理解机器学习中的过拟合与正则化
深入理解机器学习中的过拟合与正则化
|
1月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
266 3
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
63 2
|
1月前
|
机器学习/深度学习 算法 数据挖掘
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
|
1月前
|
JSON 测试技术 API
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能:机器学习的基本原理与Python代码实践
【9月更文挑战第6天】本文深入探讨了人工智能领域中的机器学习技术,旨在通过简明的语言和实际的编码示例,为初学者提供一条清晰的学习路径。文章不仅阐述了机器学习的基本概念、主要算法及其应用场景,还通过Python语言展示了如何实现一个简单的线性回归模型。此外,本文还讨论了机器学习面临的挑战和未来发展趋势,以期激发读者对这一前沿技术的兴趣和思考。
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
62 0