机器学习-回归问题(Regression)

前言

与KNN分类任务预测的输出为离散型不同. 在机器学习中,回归任务是用于预测连续数值型变量的任务。回归任务在很多领域都有着广泛的应用.

简单的线性回归

在一个回归问题中,很显然模型选择和好坏会直接关系到将来预测结果的接近程度.即寻找到一条直线,最大的“拟合”样本特征和样本标记输出的关系.
在这里插入图片描述
如图所示,黑点是样本特征.蓝色直接为最大“拟合”直线 y = a x + b y=ax+b y=ax+b

公式中的参数a,b即《什么是机器学习》提到的模型参数,线性回归算法即为参数学习.

损失函数

对于第一个样本点 [ x ( i ) , y ( i ) ] [x^{(i)},y^{(i)}] [x(i),y(i)],根据直线方程

  • 预测值为: y ^ ( i ) = a x ( i ) + b \hat y^{(i)}=ax^{(i)}+b y^(i)=ax(i)+b
  • 用最小二乘法定义误差: ∑ i = 1 m ( y ( i ) − a x ( i ) − b ) 2 \displaystyle\sum_{i=1}^m (y^{(i)}-ax^{(i)}-b)^2 i=1m(y(i)ax(i)b)2

在这里插入图片描述
对loss function 求偏导得到(微分中值定理:值大最时导数为0):
在这里插入图片描述

计算技巧: 可以把a的计算转换成向量点乘的方式
即: ∑ i = 1 m ( x ( i ) − x ˉ ) ( y ( i ) − y ˉ ) \displaystyle\sum_{i=1}^m (x^{(i)}-\bar x) (y^{(i)}-\bar y) i=1m(x(i)xˉ)(y(i)yˉ)转成向量
[ x ( 1 ) − x ˉ x ( 2 ) − x ˉ . . . x ( m ) − x ˉ ] ∗ [ y ( 1 ) − x ˉ y ( 2 ) − x ˉ . . . y ( m ) − x ˉ ] \begin{bmatrix} x^{(1)} - \bar x \\ x^{(2)} - \bar x \\ ... \\ x^{(m)} - \bar x \end{bmatrix} * \begin{bmatrix} y^{(1)} - \bar x & y^{(2)} - \bar x & ... & y^{(m)} - \bar x \end{bmatrix} x(1)xˉx(2)xˉ...x(m)xˉ [y(1)xˉy(2)xˉ...y(m)xˉ]计算效率显著提升,因为CPU对向量运算有优化.

如何评价一模型的好坏

衡量标准 : ∑ i = 1 m ( y t e s t ( i ) − y ^ t e s t ( i ) ) 2 衡量标准:\displaystyle\sum_{i=1}^m (y_{test}^{(i)}-\hat y_{test}^{(i)})^2 衡量标准:i=1m(ytest(i)y^test(i))2

如果m很大,误差很小,但是累计起来很大

  • 均方误差(MSE): 1 m ∑ i = 1 m ( y t e s t ( i ) − y ^ t e s t ( i ) ) 2 \frac 1 m \displaystyle\sum_{i=1}^m (y_{test}^{(i)}-\hat y_{test}^{(i)})^2 m1i=1m(ytest(i)y^test(i))2
  • 均方根误差(RMSE): 1 m ∑ i = 1 m ( y t e s t ( i ) − y ^ t e s t ( i ) ) 2 \sqrt {\frac 1 m \displaystyle\sum_{i=1}^m (y_{test}^{(i)}-\hat y_{test}^{(i)})^2} m1i=1m(ytest(i)y^test(i))2
  • 平均绝对值误差(MAE): 1 m ∑ i = 1 m ∣ y t e s t ( i ) − y ^ t e s t ( i ) ∣ \frac 1 m \displaystyle\sum_{i=1}^m |y_{test}^{(i)}-\hat y_{test}^{(i)}| m1i=1mytest(i)y^test(i)

RMSE > MAE,因此RMSE 作为误差标准,能够更好的减小误差.

但是以上的指标都带着单位,这意味着我们无法对不同的模型进行比较,因此我们需要一种没有单位的指标 R Squared( R 2 R^2 R2)
在这里插入图片描述

案例代码

我们将使用scikit-learn内置的波士顿房价数据集。波士顿房价数据集是一个经典的机器学习数据集,包含506个样本,每个样本有13个特征,如犯罪率、房产税率等。我们的目标是根据这些特征预测房屋价格

import numpy as np
import pandas as pd
 
##  准备数据, 因为官方内置函数load_boston在1.2版本移除了
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep=r"\s+", skiprows=22, header=None)
X = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :3]])
y = raw_df.values[1::2, 2]

## 选择回归器,将使用线性回归作为我们的回归器
from sklearn.linear_model import LinearRegression
reg = LinearRegression()

## 拆分数据集,我们通常将数据集拆分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。我们将数据集拆分为70%的训练集和30%的测试集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 特征工程-标准化
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.fit_transform(X_test)

## 训练回归器
reg.fit(X_train, y_train)

## 评估回归器:当回归器训练完成后,我们需要使用测试集来评估回归器的性能。我们可以使用predict()函数对测试集进行预测,并使用score()函数计算回归器的性能指标,如均方误差、R平方等
y_pred = reg.predict(X_test)
mse = np.mean((y_pred - y_test) ** 2)
r2 = reg.score(X_test, y_test)
print("Mean Squared Error: ", mse)
print("R Squared: ", r2)

多元线性回归

我们将一元变量推广到多原变量,设多元函数式为
在这里插入图片描述
我们使用线性代数的向量概念对该式进行整理,记 w 0 = b w_0=b w0=b,那么此时,我们构造一个权重向量 w w w和特征向量 x x x
在这里插入图片描述
那么此时,我们上述的多元函数式则可以写成 f ( x ) = w T x f(x)=w^Tx f(x)=wTx.损失函数写成如下形式
在这里插入图片描述
对L(w)化简:
在这里插入图片描述
在这里插入图片描述

对L(w)求偏导:
在这里插入图片描述

使用(求导)正规方程需要注意的问题:

  1. 正规方程仅适用于线性回归模型,不可乱用;
  2. X T X X^TX XTX为奇异矩阵则无法求其逆矩阵
  3. 使用正规方程时应该注意当特征数量规模大于10000时, ( X T X ) − 1 (X^TX)^{-1} (XTX)1求其逆矩阵的时间复杂度会很高

梯度下降法

梯度下降法是用来计算函数最小值的。它的思路很简单,想象在山顶放了一个球,一松手它就会顺着山坡最陡峭的地方滚落到谷底:
在这里插入图片描述
由导数知识我们不难发现,要使损失函数L(w)的值减小,我们只需让回归系数向与当前位置偏导数符号相反的方向更新即可,如下图所示:
在这里插入图片描述
于是,我们可以得到最基本的梯度下降算法的更新步骤:
在这里插入图片描述
其中,超参数 η \eta η代表学习速率(learning_rate),即单次更新步长。 η \eta η值的选择需谨慎,如果太小更新速率太慢则很难到达;如果太大则容易直接越过极值点。
在这里插入图片描述
寻找合适的步长 η \eta η是个手艺活,在工程中可以将上图画出来,根据图像来手动调整
在这里插入图片描述

  • f ( x ) f(x) f(x)往上走(红线),自然是 η \eta η过大,需要调低
  • f ( x ) f(x) f(x)一开始下降特别急,然后就几乎没有变化(棕线),可能是 η \eta η较大,需要调低
  • f ( x ) f(x) f(x)几乎是线性变化(蓝线),可能是 η \eta η过小,需要调高

另一个问题,并不是函数都有唯一的极值,有可能找到的是:局部最优解
在这里插入图片描述
解决方法: 多运行几次,随机初始点

由于不同特征的单位不同,梯度下降的方向也会受到一些数据偏大或者偏小的数字的影响,导致数据溢出,或者无法收敛到极小值。
解决方法: 数据归一化

小批量梯度下降(MBGD)

在这里插入图片描述

案例代码

from sklearn.linear_model import SGDRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
import pandas as pd
 
# 导入必要的库 
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep=r"\s+", skiprows=22, header=None)
X = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :3]])
y = raw_df.values[1::2, 2]

# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 特征工程-标准化
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.fit_transform(X_test)

# 使用指定参数创建SGDRegressor
sgd_regressor = SGDRegressor(loss="squared_error", fit_intercept=True,max_iter=100000, learning_rate='invscaling', eta0=0.01)

# 将模型拟合到训练数据
sgd_regressor.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = sgd_regressor.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("均方误差:", mse)
  1. loss=“squared_loss”: 此参数指定用于优化的损失函数。在线性回归中,通常使用平方损失,最小化残差的平方和。
  2. fit_intercept=True: 将该参数设置为True允许模型对数据进行拟合,引入截距项(偏置),这在数据没有零中心分布时是必要的。
  3. learning_rate=‘invscaling’: 学习率决定了优化过程中每次迭代的步长。'invscaling’会随着时间调整学习率,这在实现收敛时可能更有优势。
  4. eta0=0.01: 当使用’invscaling’学习率时,此参数设置了初始学习率。

主要参考

《机器学习实战 原理/代码:Linear-Regression(线性回归)》
《scikit-learn:回归任务》
《非常详细的线性回归原理讲解》
《什么是梯度下降法?》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果输入法怎么换行?3个换行技巧,速速掌握!

在日常打字的时候,我们经常会遇到需要换行的情况。比如,在聊天、写作、编辑文档等场景下,当一行文字输入完成后,我们通常需要将光标移动到下一行再继续输入文字。那么这时候就需要我们进行换行操作。 然而,很多用户对…

Web安全漏洞分析-XSS(上)

随着互联网的迅猛发展,Web应用的普及程度也愈发广泛。然而,随之而来的是各种安全威胁的不断涌现,其中最为常见而危险的之一就是跨站脚本攻击(Cross-Site Scripting,简称XSS)。XSS攻击一直以来都是Web安全领…

HMM(Hidden Markov Model)详解——语音信号处理学习(三)(选修一)

参考文献: Speech Recognition (Option) - HMM哔哩哔哩bilibili 2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 HMM - 6 - 知乎 (zhihu.com) 隐马尔可夫(HMM)的解码问题维特比算法 - 知乎 (zhihu.com) 本次省略所有引用论文 目录 一、介绍 二、建模单…

MATLAB中imbothat函数用法

目录 语法 说明 示例 使用底帽和顶帽滤波增强对比度 imbothat函数的功能是对图像进行底帽滤波。 语法 J imbothat(I,SE) J imbothat(I,nhood) 说明 J imbothat(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学底帽滤波。底帽滤波计算图像的形态学闭运算&#…

从零开始,轻松打造个人化Chrome浏览器插件

说在前面 在我日常开发以及娱乐生活中,浏览器是我使用频率较高的一个应用,当我大学拥有第一部电脑开始,之后不论电脑换成什么,以及使用的是什么系统,我的首选浏览器都是Chrome,不仅仅是因为其速度快&#x…

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透(Cache Penetration) 解决方案: 2. 缓存雪崩(Cache Avalanche) 解决方案: 3. 缓存击穿(Cache Breakdown) 解决方案: 二、三者出现的根本原…

dbeaver连接amabri-hbase

目录 尝试过程 解决之道 总结 尝试过程 注意此章节为记录试错过程,无需跟随操作,仅作试错记录。真正操作方法请看“解决之道”章节 环境ambari安装的hbase2.1.6 使用apche phoenix默认驱动配置 备注:Apache Phoenix 是一个开源的、基于…

Amazon CodeWhisperer 使用体验

文章作者:STRIVE Amazon CodeWhisperer 是最新的代码生成工具,支持多种编程语言,如 java,js,Python 等,能减少开发人员手敲代码时间,提升工作效率。PS:本人是一名 CodeWhisperer 业余爱好者 亚马逊云科技开发者社区为开…

文件中找TopK问题

目录 1.解题思路2.创建一个文件并在文件中写入数据3.为什么要建立小堆而不建立大堆?4.如何在现有的数据中建立适合的大堆?5.代码实现 1.解题思路 TopK问题即是在众多数据中找出前K大的值,则可以根据堆的性质来实现,但在使用堆之前…

R语言gWQS包在加权分位数和回归模型的应用

在流行病学研究中,相较于单一因素的暴露,多因素同时暴露的情况更为常见。传统模型在评价多因素联合暴露时存在数据维度高、多重共线性等问题. WQS 回归模型的基本原理是通过分位数间距及加权的方法,将多种研究因素的效应综合成为一个指数&…

华为云cce负载配置时间同步

华为云cce将负载配置好之后,发现里面的时间与真实时间不同步,差了12小时,怎么办? 这时候就需要配置时间同步了。 华为云cce里面通过配置数据存储的路径来解决这个问题的,配置后,需要重启负载。 新建负载…

python实验3 石头剪刀布游戏

实验3:石头剪刀布游戏 一、实验目的二、知识要点图三、实验1. 石头剪刀布2. 实现大侠个人信息 一、实验目的 了解3类基本组合数据类型。理解列表概念并掌握Python中列表的使用。理解字典概念并掌握Python中字典的使用。运用jieba库进行中文分词并进行文本词频统计。…

JSON.stringify方法详解 后端接受JSON数据格式

1、方法定义:JSON.stringify(value, replacer, space) 参数说明: value:js对象 replacer:替换对象,可以是一个方法、对象或数组,将value按照替换规则展示。 space:填充参数,可以是数…

Protocol handler start failed

背景 上一次启动项目还好好的,关闭项目重新打开时,报错了! 报错提示 英文:Protocol handler start failed 翻译:协议处理程序启动失败 原因 端口被其他程用了,导致端口冲突。 解决方案 打开任务管理…

深入理解Java中的String、StringBuilder和StringBuffer(每天一个技术点,第一天)

大家好,我是你们的博主每天一个技术点。今天,我们将探讨Java中的一个重要主题:String、StringBuilder和StringBuffer。这些类在Java编程中无处不在,但它们之间的区别和用法可能并不是所有人都清楚。所以,让我们深入了解…

10分钟的时间,带你彻底搞懂JavaScript数据类型转换

前言 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步! 🍅 个人主页:南木元元 目录 JS数据类型 3种转换类型 ToBoolean ToString ToNumber 对象转原…

Flutter加固原理及加密处理

​ 引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁,加固是必不可少的措施之一。Flutter加固原理主要包括代码混淆、数据加密、安全存储、反调试与反分析、动态加载和安全通信等多个方面。通过综合运用这些措施,可以提高Flutter应用的安全性&#xf…

【UE】热成像效果

效果 步骤 1. 新建一个空白项目,勾选“光线追踪”选项 2. 添加一个第一人称游戏内容包到项目 3. 打开第一人称角色蓝图“BP_FirstPersonCharacter”,添加一个后期处理组件 在事件图表中设置通过按键N来切换不同的后期处理效果 将后期处理设置引脚提升为…

golang—kafka架构原理快速入门以及自测环境搭建(docker单节点部署)

kafka Apache Kafka 是一个分布式的流处理平台。它具有以下特点: 支持消息的发布和订阅,类似于 RabbtMQ、ActiveMQ 等消息队列支持数据实时处理能保证消息的可靠性投递支持消息的持久化存储,并通过多副本分布式的存储方案来保证消息的容错高…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…
最新文章