机器学习实战之用 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)等…

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机丢失msvcp110.dll是什么意思?有哪些方法可以修复

今天,我将和大家一起探讨一个关于计算机的问题——“计算机丢失msvcp110.dll是什么意思?有哪些方法可以修复?”这个问题在我们的日常生活中非常常见,尤其是在使用Windows系统的过程中,可能会遇到这样的问题。那么&…

ctfshow web入门 php特性 web108-web112

1.web108 strrev() 反转字符串 <?php echo strrev("Hello world!"); // 输出 "!dlrow olleH" ?> ereg 存在空字符截断(只会匹配%00前面的字符)&#xff0c;这个函数匹配到为true&#xff0c;没有匹配到为false,877为0x36d的十进制数值 payload: …

后端开发有哪几种语言? - 易智编译EaseEditing

后端开发是构建应用程序的一部分&#xff0c;负责处理服务器端的逻辑、数据库交互和数据处理。有许多编程语言可用于后端开发&#xff0c;以下是一些常见的后端开发语言&#xff1a; Java&#xff1a; Java是一种广泛使用的面向对象编程语言&#xff0c;具有强大的跨平台能力。…

哪款运动耳机好用、舒服的运动耳机推荐

如今&#xff0c;运动耳机已成为备受热捧的运动潮流单品&#xff0c;消费者对耳机的需求非常多元化。一款出色的运动耳机不仅要满足基本的运动需求&#xff0c;还需要具备丰富的功能&#xff0c;这直接决定了耳机的附加价值。接下来&#xff0c;我将向大家推荐5款佩戴舒适、牢固…

【C++】map的奇葩用法:和函数结合

2023年8月26日&#xff0c;周六下午 今天才发现map居然还能这样用... #include <iostream> #include <map> #include <functional>void printOne() {std::cout << "已经打印出1" << std::endl; }void printTwo() {std::cout <<…

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出&#xff1a;这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx&#xff08;源仓库名&#xff09;来切换不同的源地址 nrm use taobao…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…

SpringBoot+WebSocket搭建多人在线聊天环境

一、WebSocket是什么&#xff1f; WebSocket是在单个TCP连接上进行全双工通信的协议&#xff0c;可以在服务器和客户端之间建立双向通信通道。 WebSocket 首先与服务器建立常规 HTTP 连接&#xff0c;然后通过发送Upgrade标头将其升级为双向 WebSocket 连接。 WebSocket使得…

一个简单的web应用程序的创建

一个简单的web应用程序的创建 1、数据库设计与创建1.1、数据库系统1.2、Navicat Premium1.3、Power Designer2、使用maven创建SpringBoot项目2.1、配置maven2.2、安装idea2.3、使用idea创建maven项目2.4、根据需要配置pom.xml文件、配置项目启动相关的文件2.5、写SpringBoot项目…

darknet yolo make报错,缺少instance-segmenter.o的规则

文章目录 darknet yolo make报错&#xff0c;缺少instance-segmenter.o的规则报错原因解决办法新问题解决办法 补充g编译选项Makefile编译规则 darknet yolo make报错&#xff0c;缺少instance-segmenter.o的规则 报错原因 Makefile没有识别到对于instance-segmenter.o的编译…

匈牙利算法 in 二分图匹配

https://www.luogu.com.cn/problem/P3386 重新看这个算法&#xff0c;才发现自己没有理解。 左边的点轮流匹配&#xff0c;看是否能匹配成功。对右边的点进行记录是否尝试过 然后有空就进&#xff0c;别人能退的就进 遍历左部点&#xff1a; 尝试匹配过程&#xff1a;

使用 S3 生命周期精确管理对象生命周期

在亚马逊工作这些年,我发现 S3 的生命周期配置是管理对象生命周期的重要但复杂的工具。在这篇文章中,我将利用实战经验,深入剖析生命周期,从核心概念到实际应用。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活…

Redis初始以及安装

"梦却了无影踪&#xff0c;梦仍不曾改动" 初始Redis (1) Redis是什么&#xff1f; 要认识、学习一个软件&#xff0c;最重要的途径无一是去该软件的官方文档里瞅瞅、转悠转悠。 从官方文档的介绍中得知&#xff0c;Redis是一种工作于内存&#xff0c;…

文件上传漏洞-upload靶场1-2关 通过笔记(如何区分前段验证和后端验证)

文件上传漏洞-upload靶场1-2关 通过笔记&#xff08;区分前段验证和后端验证&#xff09; 前言 upload是一个文件上传的专用靶场&#xff0c;搭设也非常简单&#xff0c;只需要把相关源码文件放到apache的网站目录下即可使用&#xff0c;或者去github下载一键绿化包进行安装链…

基于SSM+vue框架的校园代购服务订单管理系统源码和论文

基于SSMvue框架的校园代购服务订单管理系统源码和论文070 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 在新发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&am…

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…

网络编程套接字(2): 简单的UDP网络程序

文章目录 网络编程套接字(2): 简单的UDP网络程序3. 简单的UDP网络程序3.1 服务端创建(1) 创建套接字(2) 绑定端口号(3) sockaddr_in结构体(4) 数据的接收与发送接收发送 3.2 客户端创建3.3 代码编写(1) v1_简单发送消息(2) v2_小写转大写(3) v3_模拟命令行解释器(4) v4_多线程版…

[论文阅读笔记26]Tracking Everything Everywhere All at Once

论文地址: 论文 代码地址: 代码 这是一篇效果极好的像素级跟踪的文章, 发表在ICCV2023, 可以非常好的应对遮挡等情形, 其根本的方法在于将2D点投影到一个伪3D(quasi-3D)空间, 然后再映射回去, 就可以在其他帧中得到稳定跟踪. 这篇文章的方法不是很好理解, 代码也刚开源, 做一…

兵力集中更容易进攻获胜

我兵力集中&#xff0c;敌兵力分散&#xff0c;进攻可胜 【安志强趣讲《孙子兵法》第21讲】 【原文】 进而不可御者&#xff0c;冲其虚也&#xff1b;退而不可追者&#xff0c;速而不可及也。 【趣讲白话】 进攻时&#xff0c;敌人无法抵御&#xff0c;那是攻击了敌人空虚的地方…

小程序input的placeholder不垂直居中的问题解决

input的placeholder不垂直居中&#xff0c;input设置高度后&#xff0c;使用line-height只能使输入的文字垂直居中&#xff0c;但是placeholder不会居中&#xff0c;反而会偏上。 首先placeholder样式自定义 有两种方法&#xff0c;第一种行内样式&#xff1a; <input ty…