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

线性回归模型之套索回归

概述

本案例是基于之前的岭回归的案例的。之前案例的完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge, LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
from sklearn.model_selection import learning_curve, KFolddef plot_learning_curve(est, X, y):# 将数据拆分20次用来对模型进行评分training_set_size, train_scores, test_scores = learning_curve(est,X,y,train_sizes=np.linspace(.1, 1, 20),cv=KFold(20, shuffle=True, random_state=1))# 获取模型名称estimator_name = est.__class__.__name__# 绘制模型评分line = plt.plot(training_set_size, train_scores.mean(axis=1), "--", label="training " + estimator_name)plt.plot(training_set_size, test_scores.mean(axis=1), "-", label="test " + estimator_name, c=line[0].get_color())plt.xlabel("Training set size")plt.ylabel("Score")plt.ylim(0, 1.1)# 加载数据
data = load_diabetes()
X, y = data.data, data.target# 绘制图形
plot_learning_curve(Ridge(alpha=1), X, y)
plot_learning_curve(LinearRegression(), X, y)
plt.legend(loc=(0, 1.05), ncol=2, fontsize=11)
plt.show()

输出结果如下:
在这里插入图片描述

套索回归的基本用法

引入套索回归,还是基于糖尿病数据,进行模型的训练。

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
import numpy as np# 加载数据
data = load_diabetes()
X, y = data.data, data.target# 切割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)# 使用套索回归拟合数据
reg = Lasso().fit(X_train, y_train)# 查看结果
print(reg.score(X_train, y_train))
print(reg.score(X_test, y_test))
print(np.sum(reg.coef_ != 0))

输出结果如下:

0.3624222204154225
0.36561940472905163
3

调整套索回归的参数

上面的案例中,评分只有0.3,很低,我们可以试试调低alpha的值试试。

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
import numpy as np# 加载数据
data = load_diabetes()
X, y = data.data, data.target# 切割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)# 使用套索回归拟合数据
reg = Lasso(alpha=0.1, max_iter=100000).fit(X_train, y_train)# 查看结果
print(reg.score(X_train, y_train))
print(reg.score(X_test, y_test))
print(np.sum(reg.coef_ != 0))

输出如下:

0.5194790915052719
0.4799480078849704
7

可以发现,评分有所增长,10个特征中,这里用到了7个特征。

过拟合问题

如果我们把alpha的值设置得太低,就相当于把正则化的效果去除了,模型就会出现过拟合问题。

比如,我们将alpha设置为0.0001:

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
import numpy as np# 加载数据
data = load_diabetes()
X, y = data.data, data.target# 切割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)# 使用套索回归拟合数据
reg = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)# 查看结果
print(reg.score(X_train, y_train))
print(reg.score(X_test, y_test))
print(np.sum(reg.coef_ != 0))

输出如下:

0.5303797950529495
0.4594491492143349
10

从结果来看,我们用到了全部特征,而且模型在测试集上的分数要稍微低于alpha等于0.1的时候的得分,说明降低alpha的数值会让模型倾向于出现过拟合的现象。

套索回归和岭回归的对比

我们采用图像的形式,来对比不同alpha的值的时候,套索回归和岭回归的系数。

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
import numpy as np# 加载数据
data = load_diabetes()
X, y = data.data, data.target# 切割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)# 使用套索回归拟合数据并绘图
reg = Lasso(alpha=1, max_iter=100000).fit(X_train, y_train)
plt.plot(reg.coef_, "s", label="Lasso alphat=1")reg = Lasso(alpha=0.11, max_iter=100000).fit(X_train, y_train)
plt.plot(reg.coef_, "^", label="Lasso alphat=0.11")reg = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
plt.plot(reg.coef_, "v", label="Lasso alphat=0.0001")reg = Lasso(alpha=0.1, max_iter=100000).fit(X_train, y_train)
plt.plot(reg.coef_, "o", label="Lasso alphat=0.1")plt.legend(ncol=2,loc=(0,1.05))
plt.ylim(-25,25)
plt.xlabel("Coefficient index")
plt.show()

输出:
在这里插入图片描述

http://www.lryc.cn/news/353842.html

相关文章:

  • 解决文件夹打开出错问题:原因、数据恢复与预防措施
  • Spring:面向切面(AOP)
  • 本地镜像文件怎么导入docker desktop
  • 【机器学习-23】关联规则(Apriori)算法:介绍、应用与实现
  • Gradle筑基——Gradle Maven仓库管理
  • c++11:智能指针的种类以及使用场景
  • RabbitMQ-默认读、写方式介绍
  • 阿里云百炼大模型使用
  • 亲测有效,通过接口实现完美身份证号有效性验证+身份证与姓名匹配查询身份实名认证接口(实时)
  • 试题11 输出什么?
  • 对vue3/core源码ref.ts文件API的认识过程
  • AWS迁移与传输之AWS DMS
  • 【ML Olympiad】预测地震破坏——根据建筑物位置和施工情况预测地震对建筑物造成的破坏程度
  • kafka监控配置和告警配置
  • 关于智慧校园安全用电监测系统的设计
  • Flutter 中的 FormField 小部件:全面指南
  • 数据库DCL语句
  • mysql-日志管理-error.log
  • 弱密码系统登录之后强制修改密码
  • 解释Python中的多线程和多进程编程
  • 【LeetCode】【1】两数之和(1141字)
  • 【论文速读】|探索ChatGPT在软件安全应用中的局限性
  • 部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...
  • 小程序-修改用户头像
  • PCIe总线-事物层之TLP请求和完成报文格式介绍(六)
  • 从 0 开始实现一个网页聊天室 (小型项目)
  • Tomcat部署项目的方式
  • 推荐一个快速开发接私活神器
  • 输入输出(4)——C++的输入输出运算符
  • [图解]产品经理创新模式01物流变成信息流