02_线性模型(回归线性模型)

news2025/5/13 18:56:13

描述

线性模型是在实践中广泛使用的一类模型,线性模型利用输入特征的线性函数(linear function)进行预测。

用于回归的线性模型

对于回归问题,线性模型预测的一般公式如下:

$ \widehat y = w[0]*x[0]+w[1]*x[1]+…+w[p]*x[p]+b$

这里 x[0] 到 x[p] 表示单个数据点的特征(本例中特征个数为 p+1),w 和 b 是学习模型的参数, $ \widehat y $ 是模型的预测结果。

对于单一特征的数据集,公式如下:

$ \widehat y = w[0]*x[0]+ b$

这里 w[0] 是斜率,b 是 y 轴偏移。对于有更多特征的数据集,w 包含沿每个特征坐标轴的斜率。或者也可以将预测的响应值看作输入特征的加权求和,权重由 w 的元素给出(可以取负值)。

线性回归(最小二乘法)

线性回归是回归问题最简单也最经典的线性方法。线性回归寻找参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y之间的均方误差最小。均方误差(mean squared error)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。

看一个例子:

import pandas as pd
import numpy as np
import mglearn
import warnings
warnings.filterwarnings('ignore')

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X,Y = mglearn.datasets.make_wave(n_samples=60)
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=42)

lr = LinearRegression().fit(X_train, Y_train)
# 斜率(w):coef_
# 偏移或截距(b):intercept_
print(lr.coef_,lr.intercept_)
# 训练集,测试集分数
print(lr.score(X_train, Y_train),lr.score(X_test, Y_test))

对于回归问题,score返回的是是 R 2 R^2 R2分数(K近邻回归的例子中,KNeighborsRegressor的score返回的也是 R 2 R^2 R2分数),也叫作决定系数,是回归模型预测的优度度量,位于 0 到 1 之间。

执行过上例会发现结果不是很好,训练集和测试集上的分数非常接近。这说明可能存在欠拟合,而不是过拟合。对于这个一维数据集来说,过拟合的风险很小,因为模型非常简单(或受限)。然而,对于更高维的数据集(即有大量特征的数据集),线性模型将变得更加强大,过拟合的可能性也会变大。

再看一个例子:

X,Y = mglearn.datasets.load_extended_boston()
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=0)

lr = LinearRegression().fit(X_train, Y_train)

print(lr.score(X_train, Y_train),lr.score(X_test, Y_test))

训练集和测试集之间的性能差异是过拟合的明显标志,因此我们应该试图找到一个可以控制复杂度的模型。标准线性回归最常用的替代方法之一就是岭回归

岭回归

岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束。换句话说,w 的所有元素都应接近于 0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。这种约束是所谓正则化(regularization)的一个例子。正则化是指对模型做显式约束,以避免过拟合。岭回归用到的这种被称为 L2 正则化。

from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train, Y_train)
print(ridge.score(X_train, Y_train),ridge.score(X_test, Y_test))

Ridge 是一种约束更强的模型,所以更不容易过拟合(线性回归对数据普遍存在过拟合)。复杂度更小的模型意味着在训练集上的性能更差,但泛化性能更好。由于我们只对泛化性能感兴趣,所以应该选择 Ridge 模型而不是 LinearRegression 模型。

Ridge 模型在模型的简单性(系数都接近于 0)与训练集性能之间做出权衡。简单性和训练集性能二者对于模型的重要程度可以由用户通过设置 alpha 参数来指定(默认参数 alpha=1.0)。alpha的最佳设定值取决于用到的具体数据集。增大 alpha 会使得系数更加趋向于 0,从而降低训练集性能,但可能会提高泛化性能。

# 对比
ridge10 = Ridge(alpha=10).fit(X_train,Y_train)
print(ridge10.score(X_train, Y_train),ridge10.score(X_test, Y_test))

ridge03 = Ridge(alpha=0.3).fit(X_train,Y_train)
print(ridge03.score(X_train, Y_train),ridge03.score(X_test, Y_test))

学习曲线

将模型性能作为数据集大小的函数进行绘图,这样的图像叫作学习曲线。通过学习曲线可以直观的看到模型的大小对训练分数的影响

import pandas as pd
import numpy as np
import seaborn as sns
import mglearn
import warnings
warnings.filterwarnings('ignore')

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge

# 加载数据
df_bst = pd.read_csv(r'..\..\seaborn-data\boston.csv')

# 固定 alpha 值,但改变训练数据量 / 或者 固定训练数据量,调整alpha
list_ret=[]
for i in range(10):
    df_sub = df_bst.sample(50 +i*50)
    s_medv = df_sub['MEDV']
    df_data = df_sub.drop("MEDV",axis=1)
    X_train,X_test,Y_train,Y_test = train_test_split(df_data,s_medv,random_state=42)
    lr = LinearRegression().fit(X_train, Y_train)
    ridge = Ridge().fit(X_train, Y_train)
    list_ret.append({
        'count':50 +i*50,
        'sorce':lr.score(X_train, Y_train),
        'type':'Linear_train'
        })
    list_ret.append({
        'count':50 +i*50,
        'sorce':lr.score(X_test, Y_test),
        'type':'Linear_test'
        })
    list_ret.append({
        'count':50 +i*50,
        'sorce':ridge.score(X_train, Y_train),
        'type':'Ridge_train'
        })
    list_ret.append({
        'count':50 +i*50,
        'sorce':ridge.score(X_test, Y_test),
        'type':'Ridge_test'
        })
    
    df_ret = pd.DataFrame(list_ret)
    sns.lineplot(df_ret,x='count',y='sorce',hue='type')

执行上例,从图中可以明显的看出无论是岭回归还是线性回归,所有数据集大小对应的训练分数都要高于测试分数。由于岭回归是正则化的,因此它的训练分数要整体低于线性回归的训练分数。随着模型可用的数据越来越多,两个模型的性能都在提升,最终线性回归的性能追上了岭回归。如果有足够多的训练数据,正则化变得不那么重要,并且岭回归和线性回归将具有相同的性能。

通过模型预测数据

# 根据模型,预测数据
s_medv = df_bst['MEDV']
df_data = df_bst.drop("MEDV",axis=1)
X_train,X_test,Y_train,Y_test = train_test_split(df_data,s_medv,random_state=42)
lr = LinearRegression().fit(X_train, Y_train)
ridge = Ridge().fit(X_train, Y_train)

array_lr = lr.predict(df_data)
array_ridge = ridge.predict(df_data)

df_pre = pd.DataFrame(index=df_data.index,data={'linear':array_lr,'ridge':array_ridge})
df_pre['medv']=s_medv

df_pre.plot(kind='line') # 图形化展示数据

# sns.lineplot(df_pre,x=df_pre.index,y='medv',color='r')
# sns.lineplot(df_pre,x=df_pre.index,y='ridge',color='r')
# sns.lineplot(df_pre,x=df_pre.index,y='linear',color='g')

lasso

还有一种正则化的线性回归是 Lasso,与岭回归相同,使用 lasso 也是约束系数使其接近于 0,但用到的方法不同,叫作 L1 正则化。 L1 正则化的结果是,使用 lasso 时某些系数刚好为 0。这说明某些特征被模型完全忽略。这可以看作是一种自动化的特征选择。某些系数刚好为 0,这样模型更容易解释,也可以呈现模型最重要的特征。

from sklearn.linear_model import Lasso

lasso = Ridge().fit(X_train, Y_train)
print(lasso.score(X_train, Y_train),lasso.score(X_test, Y_test))

执行上例,可以看到Lasso 在训练集与测试集上的表现都很差(欠拟合),与 Ridge 类似,Lasso 也有一个正则化参数 alpha(默认值 alpha=1.0),可以控制系数趋向于 0 的强度。为了降低欠拟合,可以尝试减小 alpha,同时还需要增加 max_iter 的值(运行迭代的最
大次数)

lasso001 = Ridge(alpha=0.01,max_iter=100000).fit(X_train, Y_train)
print(lasso.score(X_train, Y_train),lasso.score(X_test, Y_test))

alpha 值变小,可以拟合一个更复杂的模型,在训练集和测试集上的表现也更好。但如果把alpha设得太小,那么就会消除正则化的效 果,并出现过拟合现象。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)

1. 整体架构概览 Spark SQL的运行过程可以想象成一个"SQL查询的加工流水线",从原始SQL语句开始,经过多个阶段的处理和优化,最终变成分布式计算任务执行。主要流程如下: SQL Query → 解析 → 逻辑计划 → 优化 → 物理…

【计算机网络】网络IP层

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:传输层协议TCP 下篇文章:数据链路层 文章摘要&#xff1…

一天学会Maven

一、Maven简介和快速入门 1.1 Maven介绍 Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 总结:Maven就是一个软件&#xf…

变量函数实战:高保真APP原型“发票页面”动态交互教程

变量函数是高保真交互原型设计中常见的高级交互功能,能够避免重复复制与手动修改页面元素和逻辑标注,让演示更有真实体验感。本文分享一个高保真APP交互原型页面的实操案例,结合原型设计工具中的变量函数与逻辑判断功能,手把手教你…

Spring Boot 3 + Undertow 服务器优化配置

优化背景 当你的application需要支持瞬时高并发的时候,tomcat已经不在是最优的选择,我们可以改为Undertow,并对其进行优化。 Undertow 是一个轻量级的、高性能的Java Web 服务器,由JBoss 开发并开源。它是基于非阻塞(…

7系列 之 OSERDESE2

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性,并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…

vue3+flask+sqlite前后端项目实战

基础环境安装 pycharm 下载地址: https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下载地址 https://code.visualstudio.com/docs/?dvwin64user python 下载地址 https://www.python.org/downloads/windows/ Node.js(含npm…

Java 线程的堆栈跟踪信息

Java 线程的堆栈跟踪信息,展示了线程的当前状态和执行位置。以下是详细解释: 线程基本信息 "Thread-0" #16 prio5 os_prio0 cpu0.00ms elapsed16.29s tid0x00000243105a4130 nid0x5384 waiting on condition [0x0000007687ffe000]线程名称…

【计算机视觉】OpenCV实战项目:Long-Exposure:基于深度学习的长时间曝光合成技术

Long-Exposure:基于深度学习的长时间曝光合成技术 项目概述与技术背景项目核心功能技术原理 环境配置与安装硬件要求建议详细安装步骤可选组件安装 实战应用指南1. 基础使用:视频转长曝光2. 高级模式:自定义光轨合成3. 批量处理模式 技术实现…

传输层协议UDP和TCP

传输层协议UDP和TCP 1、UDP2、TCP2.1、TCP协议段格式2.2、确认应答(ACK)机制2.3、超时重传机制2.4、连接管理机制2.5、理解CLOSE_WAIT状态2.6、理解TIME_WAIT状态2.7、流量控制2.8、滑动窗口2.9、拥塞控制2.10、延迟应答2.11、捎带应答2.12、面向字节流2.13、粘包问题2.14、TCP…

浅谈大语言模型原理

1.反向传播算法 背景 反向传播算法是当前深度学习的核心技术。 神经网络 x是输入,o是输出,w是需要训练的参数(w有初始值)三层全连接的神经网络:输入层、隐藏层、输出层 激活函数 f ( x ) 1 1 x − 1 f(x)\frac…

Clickhouse 迁移到 Doris 的最佳实践

一、引言 在将数据从 Clickhouse 迁移到 Apache Doris / SelectDB Cloud 的过程中,涉及表结构迁移、查询语句迁移以及数据迁移等多个关键环节。每个环节都有其复杂性和需要注意的细节,本文将详细介绍这些内容及对应的最佳实践方法。 二、表结构迁移 &…

WebSocket的原理及QT示例

一.WebSocket 介绍 1.概述 WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,它在 2011 年被 IETF 定为标准 RFC 6455,并由 RFC7936 补充规范。与传统的 HTTP 协议不同,WebSocket 允许服务器和客户端之间进行实时、双向的数据传输&a…

vue3:十二、图形看板- echart图表-柱状图、饼图

一、效果 如图展示增加了饼图和柱状图,并且优化了浏览器窗口大小更改,图表随着改变 二、 饼图 1、新建组件文件 新增组件EchartsExaminePie.vue,用于存储审核饼图的图表 2、写入组件信息 (1)视图层 写入一个div,写入变量chart和图表宽高 <template><div ref…

2025年best好用的3dsmax插件和脚本

copitor 可以从一个3dsmax场景里将物体直接复制到另一个场景中 Move to surface 这个插件可以将一些物体放到一个平面上 instancer 实体器&#xff0c;举例&#xff1a;场景中有若干独立的光源&#xff0c;不是实体对象&#xff0c;我们可以使用instancer将他变成实体。 paste …

HAProxy + Keepalived + Nginx 高可用负载均衡系统

1. 项目背景 在现代Web应用中&#xff0c;高可用性和负载均衡是两个至关重要的需求。本项目旨在通过HAProxy实现流量分发&#xff0c;通过Keepalived实现高可用性&#xff0c;通过Nginx提供后端服务。该架构能够确保在单点故障的情况下&#xff0c;系统仍然能够正常运行&#…

5.12 note

Leetcode 图 邻接矩阵的dfs遍历 class Solution { private: vector<vector<int>> paths; vector<int> path; void dfs(vector<vector<int>>& graph, int node) { // 到n - 1结点了保存 if (node graph.size() - 1)…

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…

OBS studio 减少音频中的杂音(噪音)

1. 在混音器中关闭除 麦克风 之外的所有的音频输入设备 2.在滤镜中增加“噪声抑制”和“噪声门限”

智能手表 MCU 任务调度图

智能手表 MCU 任务调度图 处理器平台&#xff1a;ARM Cortex-M33 系统架构&#xff1a;事件驱动 多任务 RTOS RTOS&#xff1a;FreeRTOS&#xff08;或同类实时内核&#xff09; 一、任务调度概览 任务名称优先级周期性功能描述App_MainTask中否主循环调度器&#xff0c;系统…