1.系统学习-线性回归

news2025/2/24 6:32:28

系统学习-线性回归

  • 前言
  • 线性回归介绍
  • 误差函数
  • 梯度下降
    • 梯度下降示例
  • 回归问题常见的评价函数
    • 1. MAE, mean absolutely error
    • 2. MSE, mean squared error
    • 3. R square (决定系数或R方)
  • 机器学习建模流程
  • 模型正则化
  • 拓展阅读
  • 作业

链接: 2.系统学习-逻辑回归

前言

线性回归是一种应用非常广泛的回归模型:销量预测、网站流量、生物指标预测等。其中包含的一些知识点例如:梯度下降、L1/L2正则化等在其他机器学习、深度学习模型中也会应用,需要认真掌握。本章会以房价预测案例介绍机器学习建模流程。
链接: Kaggle房价预测竞赛
学习目标:

  • 线性回归定义
  • 梯度下降法求解回归系数
  • 常用的回归任务评价指标
  • 机器学习建模流程
  • 【选修拓展阅读】:过拟合、正则化,多重共线性
  • 完成课后QA及代码作业

线性回归介绍

回归分析是一种预测性的回归建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系,用于预测各种连续变量的值,例如通过父亲的身高、母亲的身高、家庭收入等预测同学的身高,通过地段、面积等预测房屋价格。 线性回归基于简单的假设: 假设自变量和因变量之间的关系是线性的, 即因变量可以表示为自变量中元素的加权和。

我们把特征表示为向量x =(x1,x2,…,xm)项 ,加权权重表示为向量 w=(w1,w2,…,wm),线性回归模型可以表示为:

y = w T x + b y = w^T x + b y=wTx+b
为了方便表示,我们把偏置项也移动到特征里,作为x0 ,且其值总为1,也为偏置项增加一个权重 ,那么线性回归可以表示为:

y = w T x y = w^T x y=wTx
这样就简洁多了,现在问题来了,如何求解影响权重 呢,因为影响因素的值我们是已知的,只要知道权重,我们就可以通过模型得到一个预测结果。

误差函数

一个很自然的想法是,我们首先定义个误差函数,去求解这个误差函数最小的时候所对应的 就可以了。其中对于一个回归问题,我们通常采用MSE (Mean Square Error )作为误差函数:
MSE = 1 n ∑ i = 1 n ( y true ( i ) − w T x ( i ) ) 2 . \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left( y_{\text{true}}^{(i)} - w^T x^{(i)} \right)^2. MSE=n1i=1n(ytrue(i)wTx(i))2.
在这里插入图片描述

梯度下降

链接: 梯度下降直观理解小视频
梯度是函数关于参数的徧导数,这里以我们的MSE函数为例,grad,
表示函数的某处最小值到最大值的指向与最大值与最小值的差异程度。那么意味着梯度不仅告诉我们,函数变大的方向,也告诉了我们变大的程度。我们的函数(MSE)是越小越好,那么我们只要朝着梯度的反方向迈进就可以了。
在这里插入图片描述
在上图中,我们绘制了一个函数 func(x1,x2),其中底部的两个坐标为 ,纵轴坐标为函数对应的取值,底部的箭头是在不同 取值下的梯度。可以看到,梯度总是指向让函数取值变大的方向,梯度的箭头越长意味着变化越大。因此,我们只需要让 的取值,不断朝着梯度的反方向更新,就可以一步步走向函数的最低点。

利用求导公式可知,梯度等于:

∂ MSE ∂ w i = − 1 n ∑ j = 1 n 2 ⋅ ( y true ( j ) − w T x ( j ) ) ⋅ x i ( j ) . \frac{\partial \text{MSE}}{\partial w_i} = -\frac{1}{n} \sum_{j=1}^{n} 2 \cdot \left( y_{\text{true}}^{(j)} - w^T x^{(j)} \right) \cdot x_i^{(j)} . wiMSE=n1j=1n2(ytrue(j)wTx(j))xi(j).
那么,在线性回归中,我们可以沿着梯度的反方向进行更新:
w i = w i − learning_rate ⋅ ∂ MSE ∂ w i . w_i = w_i - \text{learning\_rate} \cdot \frac{\partial \text{MSE}}{\partial w_i} . wi=wilearning_ratewiMSE.

梯度下降示例

下面我们就利用梯度下降,来解决一个房价预测的问题。

import numpy as np 
 
x = np.array([1, 2, 1.2, 1.5]) 
y = x * 2 + np.random.randn(4) 
 
print("假设我们有一组房屋的面积数据:") 
print(x) 
print("其对应的房屋价格:") 
print(y) 

在这里插入图片描述

import matplotlib.pyplot as plt 
%matplotlib inline
# 房屋面积和房价可以从散点图看出具备某种线性关系
 
plt.scatter(x, y) 
plt.xlabel("house area") 
plt.ylabel("house price")

在这里插入图片描述

 # 定义我们的误差函数
 
def mse(y_true, y_pred): 
    return np.mean((y_true - y_pred) ** 2) #隐藏了累加和除以 n 的细节
 
# 定义梯度的计算公式
 
def grad(y_true, w, x): 
    return np.mean(2 * (y_true - w*x) * -x) 
 
# 定义梯度下降迭代过程
 
def grad_decent(y_true, w, x, learning_rate): 
    w = w - learning_rate * grad(y_true, w, x) 
    return w 
w = np.random.rand()  # w赋值一个随机初始值
 
learning_rate = 0.001 
num_iteration = 2000 
loss = [] 
for step in range(num_iteration): 
    w = grad_decent(y, w, x, learning_rate) 
    loss_step = mse(y, w*x) 
    loss.append(loss_step) 
plt.plot(loss) 
plt.xlabel("#iteration") 
plt.ylabel("mse_loss") 

在这里插入图片描述

plt.scatter(x, y, label="true") 
plt.scatter(x, w*x, label="predict", marker="^") 
plt.legend() 

在这里插入图片描述

回归问题常见的评价函数

1. MAE, mean absolutely error

MAE = 1 n ∑ i = 1 n ∣ y true ( i ) − y pred ( i ) ∣ . \text{MAE} = \frac{1}{n} \sum_{i=1}^n \left| y_{\text{true}}^{(i)} - y_{\text{pred}}^{(i)} \right| . MAE=n1i=1n ytrue(i)ypred(i) .
计算简单,但是在0处不可导,所以在使用梯度下降需要特殊处理,值越大则误差越大,值域在0到正无穷大。
我们用 来计算一下之前的预测误差:

y_pred = w * x 
from sklearn.metrics import mean_absolute_error as mae 
mae(y, y_pred)

2. MSE, mean squared error

在梯度下降已经介绍,这里直接计算:

from sklearn.metrics import mean_squared_error as mse 
mse(y, y_pred)

领域基于MSE,也有一些衍生指标,比如RMSE,MSE,就是对 开根号,这里不再详述。

3. R square (决定系数或R方)

统计领域常用,但是在机器学习领域用的很少的一种回归评价指标,值域在负无穷大到1,越接近1越好,代表预测值对真实值解释程度越高。
R 2 = 1 − 残差平方和 总平方和 . R^2 = 1 - \frac{\text{残差平方和}}{\text{总平方和}} . R2=1总平方和残差平方和.
残差平方和 = ∑ i = 1 n ( y true ( i ) − y pred ( i ) ) 2 . \text{残差平方和} = \sum_{i=1}^n \left( y_{\text{true}}^{(i)} - y_{\text{pred}}^{(i)} \right)^2 . 残差平方和=i=1n(ytrue(i)ypred(i))2.
总平方和 = ∑ i = 1 n ( y true ( i ) − y ˉ ) 2 . \text{总平方和} = \sum_{i=1}^n \left( y_{\text{true}}^{(i)} - \bar{y} \right)^2 . 总平方和=i=1n(ytrue(i)yˉ)2.
在这里插入图片描述

 from sklearn.metrics import r2_score as r2 
 
r2(y, y_pred) 

机器学习建模流程

我们以Kaggle房价预测竞赛为例,利用线性回归,搭建一套完整的机器学习建模流程。

  1. 加载数据&分析
  2. 数据处理
  3. 特征工程
  4. 数据划分
  5. 模型训练
  6. 模型评估
# 加载数据
import pandas as pd

train = pd.read_csv("./house-prices-advanced-regression-techniques/train.csv")
test = pd.read_csv("./house-prices-advanced-regression-techniques/test.csv")
sample_submission = pd.read_csv("./house-prices-advanced-regression-techniques/sample_submission.csv")

# 查看数据形状
print("Train shape:", train.shape)  # (1460, 81)
print("Test shape:", test.shape)   # (1459, 80)

# 查看前几行
print(train.head())
print(test.head())

# 提取目标变量 SalePrice
target = train['SalePrice'].values
test_ids = test['Id'].values

# 删除不必要的列
train.drop(['SalePrice', 'Id'], axis=1, inplace=True)
test.drop(['Id'], axis=1, inplace=True)

# 合并训练和测试数据,方便统一处理
data = pd.concat([train, test], axis=0).reset_index(drop=True)

# 检查数据类型
print(data.dtypes.value_counts())

# 丢弃缺失比例>80% 的特征
data.drop(data.isnull().mean()[data.isnull().mean() >0.8].index.tolist(), axis=1,inplace=True) 

# 处理缺失值:数值型用中位数填充,类别型用 "NULL" 填充
data.loc[:, data.dtypes != 'object'] = data.loc[:, data.dtypes != 'object'].fillna(
    data.loc[:, data.dtypes != 'object'].median()
)
data.loc[:, data.dtypes == 'object'] = data.loc[:, data.dtypes == 'object'].fillna("NULL")

# 确保没有缺失值
print("缺失值总数:", data.isnull().sum().sum())

# 对目标变量进行对数变换
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.displot(target)
sns.displot(np.log1p(target))

# 恢复对数化后的目标值
sns.displot(np.expm1(np.log1p(target)))

# 对类别型特征进行 OneHot 编码
from sklearn.preprocessing import OneHotEncoder

cat_feature = OneHotEncoder().fit_transform(data[data.columns[data.dtypes == 'object']])
print("类别特征形状:", cat_feature.shape)

# 对数值型特征进行标准化
from sklearn.preprocessing import StandardScaler

num_feature = StandardScaler().fit_transform(data[data.columns[data.dtypes != 'object']])
print("数值特征均值:", num_feature.mean(0))
print("数值特征标准差:", num_feature.std(0))

# 合并类别特征和数值特征
feature = np.concatenate([cat_feature.todense(), num_feature], axis=1)
print("合并后特征形状:", feature.shape)

# 划分训练和测试数据
num_train = len(train)
train_feature = feature[:num_train]
test_feature = feature[num_train:]

# 对目标变量标准化
from sklearn.preprocessing import StandardScaler

target_log1p = np.log1p(target)
scaler = StandardScaler()
target_log1p_scale = scaler.fit_transform(target_log1p.reshape(-1, 1))

# 模型训练
from sklearn.linear_model import Ridge

model = Ridge()
model.fit(train_feature, target_log1p_scale)

# 模型预测
def predict(model, feature):
    pred = model.predict(feature)
    pred = scaler.inverse_transform(pred)
    pred = np.expm1(pred)
    return pred

train_pred = predict(model, train_feature)

# 计算均方误差
from sklearn.metrics import mean_squared_error as mse

train_mse = np.sqrt(mse(target, train_pred))
print("训练集均方误差:", train_mse)

# 测试集预测
test_pred = predict(model, test_feature)

# 保存结果
sample_submission["SalePrice"] = test_pred.reshape(-1)
sample_submission.to_csv("submission.csv", index=False)

模型正则化

在这里插入图片描述
L1&L2 正则化
通过在误差函数中添加关于参数的1阶或2阶模,达到限制模型能力的作用。
L 1 = MSE + ∑ ∣ w i ∣ . L1 = \text{MSE} + \sum |w_i| . L1=MSE+wi∣.
L 2 = MSE + ∑ w i 2 . L2 = \text{MSE} + \sum w_i^2 . L2=MSE+wi2.
其中L1正则化线性回归叫做Lasso
,
L2正则化线性回归叫做Ridge.在sklearn中可以很方便的调用。
from sklearn.linear_model import Ridge, Lasso, LinearRegression

L1&L2如何发挥作用?

在这里插入图片描述

拓展阅读

链接: 欠拟合、过拟合及如何防止过拟合
链接: 机器学习中常常提到的正则化到底是什么意思?
链接: 多重共线性问题

作业

  1. 回答L1与L2正则化的线性回归分别具备什么特性?
  2. 注册Kaggle平台,阅读文档了解Kaggle平台使用,参加Kaggle房价预测竞赛,分别采用普通LinearRegression/Ridge(L2正则化线性回归)/Lasso(L1正则化线性回归)进行建模,尝试构造更多的
    特征,对比三种模型精度,最优模型Kaggle提交得分低于0.14

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

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

相关文章

windows使用zip包安装MySQL

windows通过zip包安装MySQL windows通过zip包安装MySQL下载MySQL的zip安装包创建安装目录和数据目录解压zip安装包创建配置目录 etc 和 配置文件 my.ini安装MySQL进入解压后的bin目录执行命令初始化执行命令安装 验证安装查看服务已安装 启动MySQL查看服务运行情况修改密码创建…

【Postgresql】数据库忘记密码时,重置密码 + 局域网下对外开放访问设置

【Postgresql】数据库忘记密码时,重置密码 + 局域网下对外开放访问设置 问题场景数据库忘记密码时,重置密码局域网下对外开放访问设置问题场景 Postgresql可支持复杂查询,支持较多的数据类型,在生产中较为使用。但有时在局域网下,想通过外部连接使用数据库,可能会出现数…

大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库

大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客:https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG ,难以解决的时候。 尝试了N种方法,都不行的解决方法。…

数字IC前端学习笔记:脉动阵列的设计方法学(四)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构(也称为脉动阵列)表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…

软件工程-【软件项目管理】--期末复习题汇总

一、单项选择题 (1)赶工一个任务时,你应该关注( C ) A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 (2)下列哪个不是项目管理计划的一部分&…

【Git学习】windows系统下git init后没有看到生成的.git文件夹

[问题] git init 命令后看不到.git文件夹 [原因] 文件夹设置隐藏 [解决办法] Win11 win10

《Posterior Collapse and Latent Variable Non-identifiability》

看起来像一篇很有用的paper,而且还是23年的 没看完 后边看不懂了 Abstract 现有的解释通常将后验崩塌归因于由于变分近似而使用神经网络或优化问题。 而本文认为后验崩塌是潜在变量不可识别性的问题(a problem of latent variable non-identifiability) 本文证明了…

申请腾讯混元的API Key并且使用LobeChat调用混元AI

申请腾讯混元的API Key并且使用LobeChat调用混元AI 之前星哥写了一篇文章《手把手教拥有你自己的大模型ChatGPT和Gemini等应用-开源lobe-chat》搭建的开源项目,今天这篇文章教大家如何添加腾讯云的混元模型,并且使用LobeChat调用腾讯混元AI。 申请腾讯混…

Navicat通过ssh连接mysql

navicat 通过ssh连接mysql 对搭建完的mysql连接时,通过ssh连接的方法 需要确保mysql默认端口3306没有被防火墙阻拦 第一步 第二步 35027448270)] 需要注意的是乌班图系列的默认root的ssh是禁止的,应该用别的账户登录

【NACOS插件】使用官网插件更换NACOS数据库

说明 nacos 2.3.1默认支持mysql和derby数据库,如果想要支持其他数据库,可以通过使用插件方式实现。对于该插件的使用,官方说明文档较为粗略(不过也没问题,实际上整个过程就是很简单,只是使用者想复杂了),网…

mysql基础(jdbc)

1.Java连接数据库步骤 1.注册驱动 Class<?> driverManagerClass.forName("com.mysql.cj.jdbc.Driver"); 2.获取连接 Connection conDriverManager.getConnection("jdbc:mysql://localhost:3306/studymysql","root","123456"); …

ROM修改进阶教程------修改刷机包init.rc 自启用户自定义脚本的一些基本操作 代码格式与注意事项

在很多定制化固件中。我们需要修改系统的rc文件来启动自己的一些脚本。但有时候修改会不起作用,其具体原因在于权限与代码格式的问题。博文将系统的解析代码操作编写的注意事项与各种权限分别。了解以上. 轻松编写自定义启动脚本. 通过博文了解💝💝💝 1-------💝💝…

硬件模块常使用的外部中断

对于STM32来说&#xff0c;想要获取的信号是外部驱动的很快的突发信号 例1&#xff1a;旋转编码器的输出信号&#xff1a; 可能很久都不会拧它&#xff0c;不需要STM32做任何事情但是一拧它&#xff0c;就会有很多脉冲波形需要STM32接收信号是突发的&#xff0c;STM32不知道什…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅&#xff0c;从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍&#xff1a; 一、主要功能 …

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

VTK知识学习(27)- 图像基本操作(二)

1、图像类型转换 1&#xff09;vtkImageCast 图像数据类型转换在数字图像处理中会频繁用到。一些常用的图像算子(例如梯度算子)在计算时出于精度的考虑&#xff0c;会将结果存储为float或double类型&#xff0c;但在图像显示时&#xff0c;一般要求图像为 unsigned char 类型,…

在跨平台开发环境中构建高效的C++项目:从基础到最佳实践20241225

在跨平台开发环境中构建高效的C项目&#xff1a;从基础到最佳实践 引言 在现代软件开发中&#xff0c;跨平台兼容性和高效开发流程是每个工程师追求的目标。尤其是对于 C 开发者&#xff0c;管理代码的跨平台构建以及调试流程可能成为一项棘手的挑战。在本文中&#xff0c;我…

网络协议入门

一、概述 1、模型 为了减少协议设计的复杂性&#xff0c;大多数网络模型均采用分层的方式来组织。每一层都有自己的功能&#xff0c;就像建筑物一样&#xff0c;每一层都靠下一层支持。每一层利用下一层提供的服务来为上一层提供服务&#xff0c;本层服务的实现细节对上层屏蔽…

集成RabbitMQ+MQ常用操作

文章目录 1.环境搭建1.Docker安装RabbitMQ1.拉取镜像2.安装命令3.开启5672和15672端口4.登录控制台 2.整合Spring AMQP1.sun-common模块下创建新模块2.引入amqp依赖和fastjson 3.新建一个mq-demo的模块1.在sun-frame下创建mq-demo2.然后在mq-demo下创建生产者和消费者子模块3.查…