机器学习实战之用 Scikit-Learn 正则化方法解决过拟合详解

f8e94cbab3c740c294d52f7baa6919f7.jpg


 

你是不是在模型训练中遇到过这样的问题:在训练集上表现得极好,但在测试集上效果不佳?这就是过拟合的问题。

过拟合是模型在训练过程中学到了数据的“噪声”而非规律,导致在未知数据上表现不佳。那么怎么解决这个问题呢?今天我们就来聊聊 Scikit-Learn 的正则化方法吧!

小提示: 如果你还没有接触过 Scikit-Learn,可以先了解一下这个强大的 Python 机器学习库。本文会带你领略它的神奇之处!


一、正则化:是什么?为什么?

1.1 正则化的定义

正则化(Regularization)是一种降低模型复杂度的方法,通过给损失函数(Loss Function)加上一个惩罚项(Penalty Term),使得模型在拟合数据的同时避免过度复杂。

1.2 为什么需要正则化?

想象一下,你正在参加一个猜谜游戏。你猜了一个谜题,获得了一点提示。然后你开始构思一个解决方案,但太过复杂,包含了许多不必要的细节。这时,你可能需要简化你的思路,才能找到真正的答案。就像这个游戏一样,当我们的模型过于复杂时,可能会导致过拟合。而正则化就是我们的“简化”大师!

二、Scikit-Learn 的正则化方法

Scikit-Learn 提供了多种正则化方法,如 L1 正则化、L2 正则化和 Elastic Net。在这里,我们会分别介绍这三种方法,并给出实际应用示例。

2.1 L1 正则化

L1 正则化通过在损失函数中添加 L1 范数来实现,公式如下:

Loss_with_L1 = Loss + λ * L1_Norm(Weights)

其中,L1_Norm 是权重的 L1 范数(权重的绝对值之和),λ 是正则化强度(一个超参数)。

L1 正则化的特点是能将一些权重参数压缩至0,从而实现特征选择(Feature Selection)。

示例:使用 Scikit-Learn 的 Lasso 回归实现 L1 正则化。

from sklearn.linear_model import Lasso

# 创建 Lasso 对象,设置正则化强度
lasso = Lasso(alpha=0.1)

# 训练模型
lasso.fit(X_train, y_train)

# 预测
y_pred = lasso.predict(X_test)

2.2 L2 正则化

L2 正则化通过在损失函数中添加 L2 范数来实现,公式如下:

Loss_with_L2 = Loss + λ * L2_Norm(Weights)

其中,L2_Norm 是权重的 L2 范数(权重的平方和的平方根),λ 是正则化强度(一个超参数)。

L2 正则化的特点是能够减小权重的值,但不会将其压缩至0。

示例:使用 Scikit-Learn 的 Ridge 回归实现 L2 正则化。

from sklearn.linear_model import Ridge

# 创建 Ridge对象,设置正则化强度
ridge = Ridge(alpha=0.1)

# 训练模型
ridge.fit(X_train, y_train)

# 预测
y_pred = ridge.predict(X_test)

2.3 Elastic Net

Elastic Net 是 L1 正则化和 L2 正则化的组合,可以通过调整两者的权重来平衡特征选择与权重减小。公式如下:

Loss_with_ElasticNet = Loss + λ1 * L1_Norm(Weights) + λ2 * L2_Norm(Weights)

其中,λ1 和 λ2 分别是 L1 正则化和 L2 正则化的强度。

示例:使用 Scikit-Learn 的 ElasticNet 回归实现 Elastic Net。

from sklearn.linear_model import ElasticNet

# 创建 ElasticNet 对象,设置正则化强度
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)

# 训练模型
elastic_net.fit(X_train, y_train)

# 预测
y_pred = elastic_net.predict(X_test)

三、实战:用 Scikit-Learn 正则化方法解决过拟合

接下来,让我们通过一个实际例子来看看如何使用 Scikit-Learn 的正则化方法解决过拟合问题。

假设我们要预测一辆汽车的价格,给定了一些特征,如车龄、行驶里程、燃油类型等。我们将使用一个包含这些特征的数据集来训练一个回归模型。

3.1 数据准备

首先,我们需要加载数据并分割成训练集和测试集。

import pandas as pd
from sklearn.model_selection import train_test_split

# 加载数据
data = pd.read_csv("car_data.csv")

# 分割特征和目标变量
X = data.drop("price", axis=1)
y = data["price"]

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

3.2 使用正则化方法训练模型

接下来,我们将分别使用 Lasso、Ridge 和 ElasticNet 三种正则化方法训练模型,并比较它们的性能。

from sklearn.metrics import mean_squared_error

# Lasso
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
y_pred_lasso = lasso.predict(X_test)
mse_lasso = mean_squared_error(y_test, y_pred_lasso)

# Ridge
ridge = Ridge(alpha=0.1)
ridge.fit(X_train, y_train)
y_pred_ridge = ridge.predict(X_test)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)

# ElasticNet
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X_train, y_train)
y_pred_elastic_net = elastic_net.predict(X_test)
mse_elastic_net = mean_squared_error(y_test, y_pred_elastic_net)

print("MSE of Lasso: ", mse_lasso)
print("MSE of Ridge: ", mse_ridge)
print("MSE of ElasticNet: ", mse_elastic_net)

3.3 结果分析

通过对比三种正则化方法的均方误差(MSE),我们可以了解到哪种方法在解决过拟合问题上表现得更好。例如,如果 ElasticNet 的 MSE 最低,说明它在平衡特征选择和权重减小方面做得更好。

四、技术总结

通过本文,我们了解了正则化的概念、原因以及 Scikit-Learn 提供的三种正则化方法。实际案例也展示了如何使用这些方法来解决过拟合问题。

但正则化并非万能,有时还需要结合其他方法,如交叉验证(Cross-Validation)或早停(Early Stopping)等…

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java八股文面试[多线程]——阻塞队列

阻塞队列大纲: 什么是阻塞队列 阻塞队列:从名字可以看出,他也是队列的一种,那么他肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,他支持两个附加操作,即阻塞添加和阻塞删…

excel 无法删除有合并单元格的列内容时的替代方法

背景: hp 笔记本电脑;win10 64位;excel 版本 16.0; office 2016自带excel 问题: 把pdf转excel后,由于原 pdf 图表本身的原因,转换后有不规则合并单元格的现象。 而在选择某列进行“删除” &a…

Open3D(C++) 点云格网分块

目录 一、算法概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法概述 点云格网分块是点云二维格网化的一个具体应用案例,与Open3D (C++) 使用点云创建数字高程模型DEM类似,对每个格…

Linux编程--进程--fork使用,创建父子进程

1.使用fork函数创建一个进程 #include <unistd.h>pid_t fork(void); 返回值为0&#xff0c;代表当前进程是子进程 返回值为非负数&#xff0c;代表当前进程为父进程 调用失败&#xff0c;返回-1 代码&#xff1a; #include <stdio.h> #include <sys/types.h&g…

PHP旅游管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 旅游管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP 旅游管理系统 源码下载地址&#xff1a; https://download.csdn.net/download/qq_41…

鸿蒙系列-如何使用好 ArkUI 的 @Reusable?

如何使用好 ArkUI 的 Reusable&#xff1f; OpenHarmony 组件复用机制 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为 系统组件&#xff0c;由开发者定义的称为 自定义组件。 在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合…

python实现语音识别

1. 首先安装依赖库 pip install playsound # 该库用于播放音频文件 pip install speech_recognition # 该库用于语音识别 pip install PocketSphinx # 语音识别模块中只有sphinx支持离线的&#xff0c;使用该模块需单独安装 pip install pyttsx3 # 该库用于将文本转换为语音播…

自动化运维工具-----Ansible入门详解

目录 一.Ansible简介 什么是Ansible&#xff1f; Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构&#xff08;yum安装为例&#xff09; ansibl…

设计模式-5--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

Netty-ChannelPipeline

EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 ChannelHandler 完成的&#xff0c;ChannelPipeline 和 ChannelHandler应用开发的过程…

[dasctf]misc05

盲水印 png里藏jpg&#xff0c;bwm.py可以提取含flag的图片

git学习笔记 | 版本管理 - 分支管理

文章目录 git学习笔记Git是什么仓库常见的命令commit 备注规范在文件下设置git忽略文件 .gitignore 版本管理git log | git reflog 查看提交日志/历史版本版本穿梭 git resetgit reset HEAD <file> git checkout -- fileName 丢弃工作区的修改git revertGit恢复之前版本的…

论文阅读_扩散模型_SDXL

英文名称: SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 中文名称: SDXL&#xff1a;改进潜在扩散模型的高分辨率图像合成 论文地址: http://arxiv.org/abs/2307.01952 代码: https://github.com/Stability-AI/generative-models 时间: 2023-…

3D视觉测量:形位公差 面对面平行度(附源码)

文章目录 0. 测试效果1. 基本内容1.1 面对面平行度概述2. 代码实现文章目录:3D视觉测量目录微信:dhlddxB站: Non-Stop_0. 测试效果 1. 基本内容 “平行度” 是用来描述两个或多个对象或方向之间的平行关系的度量。在几何和工程学中,平行度通常用于衡量物体、表面、线条或方向…

mac帧 arp

1.分片 2.MSS max segment size 3.跨网络的本质 就是经历很多的子网或者局域网 4.将数据从A主机跨网络送到B主机的能力 IP和mac IP解决的是路径选择的问题 5.数据链路层 用于两个设备&#xff08;同一种数据链路节点&#xff09;之间进行传递 6.以太网ether 7.局域网通…

圆圈加数字的css

方式一 .circle { width: 50px; height: 50px; border-radius: 50%; background-color: #f00; color: #fff; text-align: center; line-height: 50px; } .circle::before { content: attr(data-number); display: block; } <div class"circle" data-number"…

ChatGPT总结(持续更新)

目录 体验渠道 weTab CSDN-AI助手 其他插件 ChatGPT简介 ChatGPT主要用途 ChatGPT发展历程 GPT-4架构的特点和优势 ChatGPT的工作原理 神经网络和自然语言处理技术 Transformer模型 模型训练优化技巧 ChatGPT对程序员的帮助 与ChatGPT交互和提问技巧 ChatGPT未来…

50ETF期权开户平台(0门槛期权开户指南)

50ETF期权开户平台比较好的有&#xff1a;期权馆&#xff0c;期权科普馆&#xff0c;小熊期权&#xff0c;期权酱&#xff0c;财顺财经&#xff0c;财顺期权等&#xff0c;都是国内前十的期权分仓平台&#xff0c;下文为大家结算50ETF期权开户平台&#xff08;0门槛期权开户指南…

SoC 总线结构学习记录之系统存储总线(System Memory Bus)与私有设备总线

蜂鸟 E203 SOC总线结构&#xff1a;  蜂鸟 E203 内核 BIU 的系统存储接口 ICB 连接系统存储总线&#xff0c;通过其访问 SoC 中的若干存储组件&#xff0c;譬如 ROM&#xff0c;Flash 的只读区间等。  蜂鸟 E203 内核 BIU 的私有设备接口 ICB 连接私有设备总线&#xff0c…

mac电脑屏幕录制Berrycast Mac屏幕录制软件

Berrycast是一款为Mac设计的优秀屏幕录制软件&#xff0c;它让屏幕录制变得简单而高效。以下是Berrycast的一些主要特点&#xff1a; 简单的用户界面&#xff1a;Berrycast拥有直观和简洁的用户界面&#xff0c;使得用户可以轻松上手。高质量的视频输出&#xff1a;Berrycast能…