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

Lucas带你手撕机器学习——套索回归

好的,下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用,同时还会讨论其优缺点和一些常见问题。

套索回归(Lasso Regression)

1. 背景与动机

在机器学习和统计学中,模型的复杂性通常会影响其在新数据上的泛化能力。特别是当特征数量多于样本数量时,模型容易过拟合,导致性能下降。为了解决这个问题,引入了正则化技术,以限制模型的复杂性。套索回归就是一种结合了线性回归与L1正则化的回归方法,具有以下特点:

  • 特征选择:由于L1正则化的特性,套索回归能够将一些特征的系数压缩为零,从而实现特征选择。这使得模型更简单、更易解释。

  • 提高泛化能力:通过减少特征数量,套索回归有助于提高模型的泛化能力,尤其在高维数据中表现更好。

2. 理论基础
2.1. 损失函数

套索回归的目标是最小化以下损失函数:
在这里插入图片描述

其中:
在这里插入图片描述
是目标变量与预测值之间的均方误差。
在这里插入图片描述
是L1正则化项,即模型参数的绝对值之和,𝜆 是正则化强度的超参数。

L1正则化会增加较大的惩罚,使得某些特征的系数可能被完全压缩为零,从而实现特征选择。

2.2. 优化算法

由于套索回归的损失函数是非光滑的(L1范数不连续),可以使用次梯度法、坐标下降法或其他优化方法来求解最优参数。坐标下降法是套索回归中一种常用且高效的优化算法。

3. 优缺点
3.1. 优点
  • 特征选择:能够自动选择重要特征,减少不必要的噪声,提高模型的可解释性。
  • 简化模型:减少模型的复杂性,降低过拟合的风险。
  • 适应高维数据:在特征数量远大于样本数量时,仍能有效工作。
3.2. 缺点
  • 可能丢失重要信息:如果正则化参数选择不当,可能会丢失对结果有影响的特征。
  • 对特征标准化敏感:套索回归对特征的尺度非常敏感,通常需要对特征进行标准化处理。
  • 在特征间高度相关时的局限性:在特征高度相关的情况下,套索回归可能随机选择其中一个特征,而忽略其他重要特征。
4. 实践中的应用

套索回归广泛应用于以下场景:

  • 金融风险建模:在预测信用评分或贷款违约的模型中,能够选择对结果影响最大的特征。
  • 生物医学:在基因选择和疾病预测等应用中,通过特征选择来提高模型的可解释性。
  • 文本分类:在文本特征提取中,通过选择重要的单词或短语来构建简化模型。
5. 使用 scikit-learnPyTorch 实现套索回归
5.1. scikit-learn 实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression# 生成示例数据
X, y, coef = make_regression(n_samples=100, n_features=10, noise=0.1, coef=True, random_state=42)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建套索回归模型
lasso_model = Lasso(alpha=1.0)  # alpha是正则化强度# 训练模型
lasso_model.fit(X_train, y_train)# 进行预测
y_pred = lasso_model.predict(X_test)# 输出模型系数
print("模型系数:", lasso_model.coef_)
print("模型截距:", lasso_model.intercept_)# 可视化真实值与预测值
plt.scatter(y_test, y_pred)
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("真实值与预测值的比较")
plt.plot([y.min(), y.max()], [y.min(), y.max()], '--', color='red')  # 对角线
plt.show()
5.2. PyTorch 实现
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression# 生成示例数据
X, y, coef = make_regression(n_samples=100, n_features=10, noise=0.1, coef=True, random_state=42)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 转换为PyTorch张量
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)# 创建套索回归模型
class LassoRegression(nn.Module):def __init__(self, input_dim, lambda_reg):super(LassoRegression, self).__init__()self.linear = nn.Linear(input_dim, 1)self.lambda_reg = lambda_regdef forward(self, x):return self.linear(x)def loss_function(self, y_pred, y_true):mse_loss = nn.MSELoss()(y_pred, y_true)l1_reg = self.lambda_reg * torch.sum(torch.abs(self.linear.weight))return mse_loss + l1_reg# 超参数
input_dim = X_train.shape[1]
lambda_reg = 1.0
num_epochs = 1000
learning_rate = 0.01# 初始化模型和优化器
model = LassoRegression(input_dim, lambda_reg)
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()optimizer.zero_grad()y_pred = model(X_train_tensor)loss = model.loss_function(y_pred, y_train_tensor)loss.backward()optimizer.step()if epoch % 100 == 0:print(f'Epoch [{epoch}/{num_epochs}], Loss: {loss.item():.4f}')# 进行预测
model.eval()
with torch.no_grad():y_test_pred = model(X_test_tensor)# 可视化真实值与预测值
plt.scatter(y_test, y_test_pred.numpy())
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("真实值与预测值的比较")
plt.plot([y.min(), y.max()], [y.min(), y.max()], '--', color='red')  # 对角线
plt.show()# 输出模型系数和截距
print("模型权重:", model.linear.weight.data.numpy())
print("模型偏置:", model.linear.bias.data.numpy())

6. 常见问题

  1. 如何选择合适的正则化参数 (\lambda)?

    • 通常使用交叉验证来选择合适的正则化参数。可以尝试多个值并选择在验证集上表现最佳的参数。
  2. 是否需要对特征进行标准化?

    • 是的,特征标准化非常重要,因为套索回归对特征的尺度非常敏感。通常在训练之前对特征进行标准化处理(例如,标准化为均值为0,方差为1的分布)。
  3. 在特征之间高度相关时如何处理?

    • 套索回归可能会随机选择相关特征中的一个,而忽略其他特征。如果特征高度相关,可以考虑使用岭回归或其他方法来处理。

总结

套索回归是一种强大的线性回归工具,通过L1正则化实现特征选择,有助于提高模型的可解释性和泛化能力。在高维数据集上,套索回归表现良好,但需要仔细选择正则化参数并进行特征标准化。通过 scikit-learnPyTorch,我们可以灵活地实现套索回归,以适应不同的需求和应用场景。

如果您还有其他问题或需要更深入的讨论,请随时告诉我!

相关文章:

Lucas带你手撕机器学习——套索回归

好的,下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用,同时还会讨论其优缺点和一些常见问题。 套索回归(Lasso Regression) 1. 背景与动机 在机器学习和统计学中,模型的复杂性通常会影响其在…...

面试中的一个基本问题:如何在数据库中存储密码?

面试中的一个基本问题:如何在数据库中存储密码? 在安全面试中,“如何在数据库中存储密码?”是一个基础问题,但反映了应聘者对安全最佳实践的理解。以下是安全存储密码的最佳实践概述。 了解风险 存储密码必须安全&am…...

XML HTTP Request

XML HTTP Request 简介 XMLHttpRequest(XHR)是一个JavaScript对象,它最初由微软设计,并在IE5中引入,用于在后台与服务器交换数据。它允许网页在不重新加载整个页面的情况下更新部分内容,这使得网页能够实现动态更新,大大提高了用户体验。虽然名字中包含“XML”,但XML…...

TLS协议基本原理与Wireshark分析

01背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然而,随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中,车辆通过无线网络与其他车辆、基础设施以及云端服务进行…...

当遇到 502 错误(Bad Gateway)怎么办

很多安装雷池社区版的时候,配置完成,访问的时候可能会遇到当前问题,如何解决呢? 客户端,浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面,因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…...

学习记录:js算法(七十五): 加油站

文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xf…...

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…...

yarn的安装与使用以及与npm的区别(安装过程中可能会遇到的问题)

一、yarn的安装 使用npm就可以进行安装 但是需要注意的一点是yarn的使用和node版本是有关系的必须是16.0以上的版本。 输入以下代码就可以实现yarn的安装 npm install -g yarn 再通过版本号的检查来确定,yarn是否安装成功 yarn -v二、遇到的问题 1、问题描述…...

大数据行业预测

大数据行业预测 编译 李升伟 和所有预测一样,我们必须谨慎对待这些预测,因为其中一些预测可能成不了事实。当然,真正改变游戏规则的创新往往出乎意料,甚至让最警惕的预言家也措手不及。所以,如果在来年发生了一些惊天…...

可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式

可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式 前言 在我使用nextron(nextelectron)写了一个项目后打包发现nextron等一系列桌面端框架在生产环境是不支持next的ssr也就是api route功能的这就导致我非常难受&…...

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条,清洗后,90条正确数据在DWD层清洗表,10条错误数据在DWD层清洗数据错误表,所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是,Hive中原本的SQL语句,放在ClickHouse…...

CentOS6升级OpenSSH9.2和OpenSSL3

文章目录 1.说明2.下载地址3.升级OpenSSL4.安装telnet 服务4.1.安装 telnet 服务4.2 关闭防火墙4.2.使用 telnet 连接 5.升级OpenSSH5.1.安装相关命令依赖5.2.备份原 ssh 配置5.3.卸载原有的 OpenSSH5.4.安装 OpenSSH5.5.修改 ssh 配置文件5.6关闭 selinux5.7.重启 OpenSSH 1.说…...

2024 年 MathorCup 数学应用挑战赛——大数据竞赛-赛道 A:台风的分类与预测

2024年MathorCup大数据挑战赛-赛道A初赛--思路https://download.csdn.net/download/qq_52590045/89922904↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓…...

kotlin实现viewpager

说明:kotlin tablayout viewpager adapter实现滑动界面 效果图 step1: package com.example.flushfragmentdemoimport androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.…...

RabbitMQ最新版本4.0.2在Windows下的安装及使用

RabbitMQ 是一个开源的消息代理和队列服务器,提供可靠的消息传递和队列服务。它支持多种消息协议,包括 AMQP、STOMP、MQTT 等。本文将详细介绍如何在 Windows 系统上安装和使用最新版本的 RabbitMQ 4.0.2。 前言 RabbitMQ 是用 Erlang 语言开发的 AMQP&…...

东方博宜1180 - 数字出现次数

问题描述 有 50 个数( 0∼19),求这 50个数中相同数字出现的最多次数为几次? 输入 50 个数字。 输出 1 个数字(即相同数字出现的最多次数)。 样例 输入 1 10 2 0 15 8 12 7 0 3 15 0 15 18 16 7 17 16 9 …...

LeetCode: 3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。   以下是棋盘的参考图。   如果这两个方格颜色相同,返回 true,否则返回 false。   坐标总是表示有效的棋盘方格。坐标的格式总是先…...

datax编译并测试

mvn -U clean package assembly:assembly -Dmaven.test.skiptrue 参看:DataX导数的坑_datax插件初始化错误, 该问题通常是由于datax安装错误引起,请联系您的运维解决-CSDN博客 两边表结构先创建好: (base) [rootlnpg bin]# pwd /db/DataX-datax_v20230…...

2-133 基于matlab的粒子群算法PSO优化BP神经网络

基于matlab的粒子群算法PSO优化BP神经网络,BP神经网络算法采用梯度下降算法,以输出误差平方最小为目标,采用误差反向传播,训练网络节点权值和偏置值,得到训练模型。BP神经网络的结构(层数、每层节点个数)较复杂时&…...

复盘秋招22场面试(四)形势重新评估与后续措施

连续好多天睡不着觉,经常晚上起来好几次,到现在还是没offer。之前有个校友在抖音留言说我能收到这么多面试说明简历没问题,这么多一面挂,说明我技术面有问题。确实有一些是kpi面,但是我复盘之后我发现也没有那么多kpi面…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...