机器学习之线性回归——OLS,岭回归,Lasso回归

2023-11-19

线性回归

什么是线性回归呢?其实线性回归是统计学中的,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种 回归分析 。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。 这些模型就被叫做线性模型。线性模型将机器学习中有监督学习模型定义为类似如下公式的多项式函数:

y = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 3 + . . . + w n x n y = w_0 + w_1x_1 + w_2x_2+ w_3x_3+...+w_nx_n y=w0+w1x1+w2x2+w3x3+...+wnxn

线性模型学习的目的就是确定 w 0 , w 1 , w 2 , . . . , w n w_0,w_1,w_2,...,w_n w0,w1,w2,...,wn的值,使得y可以根据特征值直接通过该函数计算得到。其中模型中的参数W0也称为截距(intercept), w 1 w 2 , w 3 , . . . , w n w_1w_2,w_3,...,w_n w1w2,w3,...,wn称为回归系数(coefficient)。
判断下下面两种多项式是否为线性模型。
1. y = 2 w 0 + w 1 x 1 + w 2 x 2 + w 3 x 3 + w n x n + . . . 1. y = 2w_0 + w_1x^{1} + w_2x^{2} + w_3x^{3} + w_nx^{n} + ... 1.y=2w0+w1x1+w2x2+w3x3+wnxn+...
2. y = w 0 + s i n ( w 1 ) x 1 + c o s ( w 2 ) x 2 + e x p w 3 x 3 + . . . 2.y = w_0 + sin(w_1)x_1 + cos(w_2)x_2+exp^{w_3x_3} + ... 2.y=w0+sin(w1)x1+cos(w2)x2+expw3x3+...
显然,1式最终式可以转换为线性模型的多项式的,而2式却不能。所有2式不是线性模型。从中我们可以得到这样的结论:是否为线性模型取决于其被求系数 w 0 , w 1 . . . w n w_0,w_1...w_n w0,w1...wn之间是否为线性关系,与样本特征变量 x 0 , x 1 . . . x n x_0,x_1...x_n x0,x1...xn的形式无关。
而对于非线性模型的学习,我们通常无法通过和线性模型那样进行固定公式的参数逼近,而需要使用之后要学习的带核函数的SVM,神经网络等更复杂的模型。

最小二乘法(OLS)

上面讲的了线性回归模型的一些简单概念,接下来实践下最简单的线性模型算法——最小二乘法(Ordinary Least Squares,OLS)。最小二乘法是通过最小化样本真值与预测值之间的方差和来达到计算出 w 1 , w 2 , w 3 , . . , w n w_1,w_2,w_3,..,w_n w1,w2,w3,..,wn的目的。就是:
arg min ⁡ ( ∑ ( y 1 − y ) 2 ) \argmin(\sum(y_1-y)^2) argmin((y1y)2)
其中 y 1 y_1 y1是样本预测值,y是样本中的真值。下面使用波士顿房价数据来实践。
导入库和数据

from sklearn import linear_model
import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

boston = load_boston()
datas = boston.data
target = boston.target
name_data = boston.feature_names

进行简单的数据可视化,筛选特征

fig = plt.figure()
fig.set_size_inches(14, 9)
for i in range(13):
    ax = fig.add_subplot(4, 4, i+1)
    x = datas[:, i]
    y = target
    plt.title(name_data[i])
    ax.scatter(x, y)
plt.tight_layout()  # 自动调整子图间距
plt.show()

请添加图片描述
从图片可以看出,特征RM和LSTAT具有明显的相关性,且一个呈单调递增,一个呈单调递减,所以选择这两个特征进行训练。
提取特征 RM,LSTAT

j_ = []
for i in range(13):
    if name_data[i] == 'RM':
        continue
    if name_data[i] =='LSTAT':
        continue
    j_.append(i)
x_data = np.delete(datas, j_, axis=1)

接下来把处理好的数据集分为训练集和测试集,选择线性回归模型训练与预测数据。

X_train, X_test, y_train, y_test = train_test_split(x_data, target, random_state=0, test_size=0.20)
lr = linear_model.LinearRegression()
lr.fit(X_train, y_train)
lr_y_predict = lr.predict(X_test)
score = lr.score(X_test, y_test)
print(score)
print("w0:",lr.intercept_)
print("w1,w2:", lr.coef_)

请添加图片描述

从训练结果来看,训练的得分不是很好,只有0.5409084827186417,拟合到的线性模型是:y = -1.2625286844374415 + 5.10906846 x 1 x_1 x1 - 0.65494879 x 2 x_2 x2

岭回归(Ridge Regression)

岭回归是俄罗斯科学家Tikhonov提出的,它通过改变回归目标函数,达到控制回归参数值随着维度疯狂增长的目的。岭回归是在OLS的基础上改进的,它的回归目标函数与普通的OLS的差别在于将 α ∑ w 2 \alpha\sum w^2 αw2加入了最小化目标,其中 α \alpha α是一个可以调节的超参数,w是线性模型中的所有参数。 α ∑ w 2 \alpha\sum w^2 αw2也被称为L2惩罚项(L2 Penalty)。岭回归的目标函数是:
arg min ⁡ ( ∑ ( y 1 − y ) 2 + α ∑ w 2 ) \argmin(\sum(y_1-y)^2+\alpha\sum w^2) argmin((y1y)2+αw2)

Lasso回归

Lasso回归与岭回归差别不大,Lasso回归只是把岭回归的惩罚项中的 w 2 w^2 w2改为了 ∣ w ∣ |w| w,称为L1惩罚项。但惩罚效果却比L2严厉很多,可以产生稀疏回归参数的作用,即多数回归参数为零。它的目标函数是:
arg min ⁡ ( ∑ ( y 1 − y ) 2 + α ∑ ∣ w ∣ ) \argmin(\sum(y_1-y)^2+\alpha\sum |w|) argmin((y1y)2+αw)

OLS,岭回归,Lasso回归之间对比

从目标函数可以看出,岭回归,Lasso回归都是在OLS的基础上产生的,这样看来,OLS似乎已经可以解决所有线性回归的问题了,什么还会出现岭回归,Lasso回归等模型呢?
其实是因为OLS会随着特征维度的增加,模型求得的参数 w 0 , w 1 , w 2 , . . , w n w_0,w_1,w_2,..,w_n w0,w1,w2,..,wn的值也会显著的增加。产生这个现象的原因是OLS试图最小化公式 arg min ⁡ ( ∑ ( y 1 − y ) 2 ) \argmin(\sum(y_1-y)^2) argmin((y1y)2)的值,因此为了拟合训练数据中很小的x值差异产生较大的y值差异,这样就必须要使用较大的w值。而越来越大的w值在测试数据上的反映的结果则是任何一个特征微小的变化都会导致最终的预测目标值大幅度变化,产生过度拟合现象。为了面对OLS在高维度数据训练存在过拟合现象,所以引入了加入惩罚项的岭回归,Lasso回归等模型。岭回归相比OLS在高维特征训练的结果来看,模型参数w的值会显著降低,并且 α \alpha α参数的大小与训练结果的回归参数呈反向关系: α \alpha α越大,回归参数越小,模型越平缓。但是在岭回归模型中,无论将 α \alpha α设多大,回归模型参数都只有非常小的绝对值,达不到零值。这样就造成了一个结果,可能有很多特征对最终预测结果的影响不大,但还是得将其加入模型计算中,这样会对数据的产生,存储,传输,计算等产生较大的浪费。Lasso就解决了岭回归的这样一个问题,Lasso回归可以将一个或多个不重要的特征参数值计算为零。从而减少特征参数,达到了压缩相关特征的目的。下面我们实践来看下这些差异。

# encoding = 'utf-8'
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import linear_model

# 导入数据
data = pd.read_csv(r'C:\data\data.csv')
x_data = data.drop('y', 1)
x = x_data.drop('x11', 1)
y_data = data.loc[:, 'y']
name_data = list(data.columns.values)
# 数据预处理
train_data, test_data, train_target, test_target = train_test_split(x_data, y_data, test_size=0.3)
Stand_X = StandardScaler()  # 特征进行标准化
Stand_Y = StandardScaler()  # 标签也是数值,也需要进行标准化
train_data = Stand_X.fit_transform(train_data)
test_data = Stand_X.transform(test_data)
train_target = Stand_Y.fit_transform(train_target.values.reshape(-1, 1))  # reshape(-1,1)指将它转化为1列,行自动确定
test_target = Stand_Y.transform(test_target.values.reshape(-1, 1))
# 最小二乘法
lr = linear_model.LinearRegression()
lr.fit(train_data, train_target)
lr_y_predict = lr.predict(test_data)
score = lr.score(test_data, test_target)
print("最小二乘法:", score)
print("w0(截距):", lr.intercept_)
print("回归系数:", lr.coef_)
# 岭回归
rg = linear_model.Ridge(alpha=0.01)
rg.fit(train_data, train_target)
rg_score = rg.score(test_data, test_target)
print("*********************************************")
print("岭回归(a=0.01):", rg_score)
print("w0(截距):", rg.intercept_)
print("回归系数:", rg.coef_)
# 岭回归
rg = linear_model.Ridge(alpha=0.1)
rg.fit(train_data, train_target)
rg_score = rg.score(test_data, test_target)
print("*********************************************")
print("岭回归(a=0.1):", rg_score)
print("w0(截距):", rg.intercept_)
print("回归系数:", rg.coef_)
# Lasso回归
ls = linear_model.Lasso(alpha=0.01)
ls.fit(train_data, train_target)
ls_score = ls.score(test_data, test_target)
print("*********************************************")
print("LASSO回归:", ls_score)
print("w0(截距):", ls.intercept_)
print("回归系数:", ls.coef_)

请添加图片描述
通过训练结果可以明显看出这三种模型之间的差异与在相同模型下 α \alpha α值的设置不同产生不同的回归参数。最后总结下这三个模型的优缺点:

模型 优点 缺点
最小二乘法(OLS) 建模快速简单,适用于要建模的关系不是非常复杂且数据量不大的情况 特征维度高的数据下存在过拟合现象且求得的参数多
岭回归 解决了OLS在特征维度高的数据存在过拟合现象 它缩小了回归参数的值,但没有达到零,没有特征选择功能。没有解决OLS求得的参数多的缺点
Lasso回归 具有特征选择功能,同时解决了OLS过拟合和参数多的缺点 Lasso回归会使得一些绝对值较小的系数直接变为0,这就产生了它的损失函数不是连续可导的,由于L1范数用的是绝对值之和,导致损失函数有不可导的点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习之线性回归——OLS,岭回归,Lasso回归 的相关文章

  • 有趣算法之C++函数模板

    C 函数模板 20200924 原文链接 https www runoob com w3cnote c templates detail html 原文正在慢慢理解中 模板是C 支持参数化多态的工具 使用模板可以使用户为类或者函数声明一种一
  • Qt-信号和槽

    一 Qt信号和槽机制 emit的使用 一 相关概念 1 信号 Signal 就是在特定情况下被发射的事件 例如PushButton 最常见的信号就是鼠标单击时发射的 clicked 信号 一个 ComboBox 最常见的信号是选择的列表项变
  • 【SQLSERVER】 "in"的替换方法

    期望效果 select From Empoylee Where Address1 Address2 in Select Address1 Address2 From EmpoyleeAdresses Where Country Canada

随机推荐

  • iOS架构-组件化(项目框架搭建2)

    静态库引用静态库 如果像上图一样 直接在业务层组件引用数据层组件的文件 则会报错 因为组件之间没有建立引用关系 如下图 静态库如何引用Pods第三方库 拷贝Podfile文件到项目 打开终端执行pad install 直接引用Pod下面的Y
  • VC++6.0调试工具使用初步

    摘要 程序设计初者学会IDE 集成开发环境 中提供的调试工具 是一件非常重要的事 本文在初学者有初步的程序设计体验 只需要掌握到控制结构 为前提 介绍了单步执行 断点设置及观察程序运行情况的方法 并配有练习的建议 方便读者的学习 相关博文
  • HTTP协议头部与Keep-Alive模式详解

    转自 https www byvoid com zhs blog http keep alive header 1 什么是Keep Alive模式 我们知道HTTP协议采用 请求 应答 模式 当使用普通模式 即非KeepAlive模式时 每
  • Bootstrap导航

    Bootstrap 导航 1 定义导航组件 基本结构 ul class nav li class active a href 首页 a li li a href 导航标题1 a li li a href 导航标题2 a li ul 1 1
  • Code39码和Code93码的区别

    条形码可以标示出产品的生产国 制造厂家 图书分类号 邮件起止地点 类别 日期等许多信息 因而在很多领域都得到了广泛的应用 尤其是那些可以同时支持字母 数字 字符这些字符集的条码 比如Code39和Code93 都是可以支持多种字符集的条形码
  • ios游戏开发

    知识系统 英文教程网站 http www csdn net article 2012 12 20 2813035 game dev guide 开发类库 http www csdn net article 2012 11 07 281158
  • Jmeter动态吞吐量实现

    在容量测试时 控量 是非常重要的 JMeter 是根据线程数大小来控制压力强弱的 但我们制定的压测目标中的指标往往是吞吐量 QPS TPS 这就给测试人员带来了不便之处 必须一边调整线程数 一边观察 QPS TPS 达到什么量级了 为了解决
  • 本地视频播放器

    这是一个基于VUE Go做的一个本地视频播放器项目 欢迎fork或star 使用指南 本地开发 安装依赖 npm install 开发模式 npm run dev 打包 npm run build 启动后端 bee run 直接使用 解压
  • “条件递进式编程”技巧两例

    什么是 条件递进式编程 呵呵 这是我自己起的名字 所谓条件递进式编程 就是指需要一系列相关函数组合执行的情况下 后续函数执行的必要性由前面所有函数执行是否成功来决定 比如说 有一系列函数如下DoSomething1 DoSomething2
  • 端到端的图像压缩------《End-to-end optimized image compression》笔记

    End to end optimized image compression 简介 内容 整体算法结构以及流程如下 前向传播 变换优化问题 变分推导问题 实验结果 结论 论文地址 https arxiv org abs 1611 01704
  • 获取map中第一个key值

    获取map中第一个key值 param map 数据源 return public static String getKeyOrNull Map
  • SqliLabs Less26-26a

    第二十六关 GET类型基于你所有的空格和言论都是属于我的错误 1 判断注入点 根据提示 sql语句应该存在过滤 观察源代码发现存在or and 空格 斜杠过滤 绕过方法 Or and 采取双写绕过 注释过滤 采取and 1闭合语句绕过 空格
  • 获取url内的参数数据

    例如我们的页面 是含有参数的 类似于 www baidu com userdata 百度用户 我们想获得 url内的userdata的数据值 那么就需要 使用下方这个正则判断方式来进行计算 window location href 这个可以
  • SSM 基础面试题

    什么是 MyBatis 参考答案 1 MyBatis 是一个半自动 ORM 对象关系映射 框架 它内部封装了 JDBC 开发时只需要关注 SQL 语句本身 不需要花费精力去处理加载驱动 创建连接 创建 statement 等繁杂的过程 程序
  • VMware 中的 Ubuntu 虚拟机看不到共享文件夹怎么办?

    初学Linux 在VMWare 上装了Ubuntu14 04 主机端和虚拟机相互间的访问是必不可少的 途径有许多 其中vmware tool提供的共享文件夹方式简单又方便 然而 有时却莫名其妙的 在Ubuntu上看不到共享文件夹了 网上查了
  • 【vue3+elementplus】动态设置二次封装的el-form组件中的v-model绑定的变量名

    众所周知 在form表单中 el select el input等需要使用v model绑定变量 这个变量就是当前选择 输入的内容 一般会取ruleForm作为入参
  • java对象赋值给另一个对象_java注解实现对象的属性赋值,从此少写代码,快乐生活...

    各位志同道合的朋友们大家好 我是一个一直在一线互联网踩坑十余年的编码爱好者 现在将我们的各种经验以及架构实战分享出来 如果大家喜欢 就关注我 一起将技术学深学透 我会每一篇分享结束都会预告下一专题 我们平时在做一些业务时 从前台获取的数据用
  • 自定义模块导入错误

    当在python2 7 导入自定义模块 发生Importerror No module named xxx时 可将模块所在路径拷贝到E xxx python2 7 Lib site packages下 再进行导入则可解决问题 经过多方的摸索
  • MobaXterm出现X11-forwarding : ✘ (disabled or not supported by server)及conda: command not found等问题

    x11 forwarding disabled解决办法 3L csdn的博客 CSDN博客 如何安装X11 xorg https www cnblogs com yun qi p 16201843 html如何解决在Ubuntu中使用x11
  • 机器学习之线性回归——OLS,岭回归,Lasso回归

    机器学习之线性回归 线性回归 最小二乘法 OLS 岭回归 Ridge Regression Lasso回归 OLS 岭回归 Lasso回归之间对比 线性回归 什么是线性回归呢 其实线性回归是统计学中的 线性回归 Linear Regress