ML 系列:机器学习和深度学习的深层次总结(02)线性回归

news2024/11/24 1:05:50

ML 系列: — 简单线性回归
线性回归、损失函数、假设函数

在这里插入图片描述
图 1.线性回归

文章目录

  • 一、说明
  • 二、线性回归
    • 2.1 简单线性回归
    • 2.2 回归中的损失函数
  • 三、线性回归中的评估标准
  • 四、线性回归模型训练
  • 五、可视化
    • 5.1 假设函数
    • 5.2 计算训练模型的损失:
    • 5.3 绘制 Hypothesis 函数,其中包含模型计算的 coef 和 intercept
  • 六、结论

一、说明

欢迎学习机器学习系列。这门综合课程目前包括40个部分,指导您了解机器学习、统计和数据分析的基本概念和技术。以下是最基本机器学习模型,线性回归模型。

二、线性回归

线性回归是一种从一个或多个其他变量预测一个或多个变量的方法。预测的变量称为因变量 (y),借助它们预测的变量称为自变量 (x)。如果只有一个自变量,则线性回归模型称为简单,否则称为多重。这里,重要的是因变量的连续性。通常,如果输入数据是 k 维(k 个特征或特征),则可以使用超平面在 k+1 维数据上拟合函数。在输入为一维的简单线性回归中,可以通过在二维数据上拟合一条线来解决回归问题。

2.1 简单线性回归

简单线性回归测量自变量与因变量之间的关系,并测量它们之间的相关性。在这种方法中,通过将线性方程拟合到观测数据,对两个变量(自变量和因变量)之间的关系进行建模。与回归问题相关的数据通常表示为一组输入/输出数据对。

表达式 1.对于回归数据:
在这里插入图片描述

在表达式 1 中,x_i 是指第 i 个输入数据,y_i 是指第 i 个输出数据。通常,x_i 或 input data 是长度为 n 和 y_i 的列向量,或者 outputs 是标量数。在简单线性回归中,有一个自变量;换句话说,数据是一维的,很明显输出是一个数字(定量标量)。

表达式 2.的行可以写成如下。
在这里插入图片描述

系数 x 或 a 是线的斜率,b 或常数是截距。

表 1.显示了简单线性回归的数据样本,在此示例中,自变量是发动机大小 (Engine_size),因变量是 CO2 排放量 (CO2_Emissions)。在这种情况下,数据是 x(自变量)和 y(因变量)点的二进制集。我们的目标是找到 a 和 b,从而产生 y 的最佳估计值。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv('CO2-Emission-by-Vehicles.csv')
df.head()

在这里插入图片描述

表 1.简单线性回归中的自变量和因变量
图 2.以两个维度显示上述数据。

df = np.array(df)
x = df_test[['Engine_size']]
y = df_test[['CO2_Emissions']]
plt.scatter(x, y, edgecolors='b')
plt.xlabel('Engine_size')
plt.ylabel('CO2_Emissions')

在这里插入图片描述

图 2.二维数据
通过更改 a 和 b 的不同值,可以绘制不同的线条。在图 3 中,绘制了四条不同的线,并将线参数的值写入每个图中。

# Plot_1
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
plt.subplot(2, 2, 1)
x_scatter = df_test[['Engine_size']]
y_scatter = df_test[['CO2_Emissions']]
plt.scatter(x_scatter, y_scatter, edgecolors='b', linewidths=4.)
plt.xlabel('Engine_size')
plt.ylabel('CO2_Emissions')
x_1 = np.linspace(1.5, 7.1, 50)
a_1, b_1 = 10, 15
y_1 = a_1*x_1 + b_1
plt.plot(x_1, y_1, 'r', label=f'a = {a_1}, b = {b_1}')
legend_properties = {'weight':'bold'}
plt.legend(prop=legend_properties)
plt.grid(alpha=0.5)
# Plot_2
plt.subplot(2, 2, 2)
x_scatter = df_test[['Engine_size']]
y_scatter = df_test[['CO2_Emissions']]
plt.scatter(x_scatter, y_scatter, edgecolors='b', linewidths=4.)
plt.xlabel('Engine_size')
plt.ylabel('CO2_Emissions')
x_2 = np.linspace(1.5, 7.1, 50)
a_2, b_2 = 20, 25
y_2 = a_2*x_2 + b_2
plt.plot(x_2, y_2, 'y', label=f'a = {a_2}, b = {b_2}')
plt.legend(prop=legend_properties)
plt.grid(alpha=0.5)


# Plot_3
plt.subplot(2, 2, 3)
x_scatter = df_test[['Engine_size']]
y_scatter = df_test[['CO2_Emissions']]
plt.scatter(x_scatter, y_scatter, edgecolors='b', linewidths=4.)
plt.xlabel('Engine_size')
plt.ylabel('CO2_Emissions')
x_3 = np.linspace(1.5, 7.1, 50)
a_3, b_3 = 30, 35
y_3 = a_3*x_3 + b_3
plt.plot(x_3, y_3, 'g', label=f'a = {a_3}, b = {b_3}')
plt.legend(prop=legend_properties)
plt.grid(alpha=0.5)


# Plot_4
plt.subplot(2, 2, 4)
x_scatter = df_test[['Engine_size']]
y_scatter = df_test[['CO2_Emissions']]
plt.scatter(x_scatter, y_scatter, edgecolors='b', linewidths=4.)
plt.xlabel('Engine_size')
plt.ylabel('CO2_Emissions')
x_4 = np.linspace(1.5, 7.1, 50)
a_4, b_4 = 65, 15
y_4 = a_4*x_4 + b_4
plt.plot(x_4, y_4, 'k', label=f'a = {a_4}, b = {b_4}')
plt.legend(prop=legend_properties)
plt.grid(alpha=0.5)

在这里插入图片描述
图 3.绘制多条不同的线条

在图 3 中,我们手动输入了 a 和 b 的参数或值,并通过试错法输入,但在机器学习中,我们正在寻找一种方法来计算这些值,以达到最低误差值并在上述函数中找到最小值。数据误差值由 loss 函数计算,该值应提供给优化算法,以便以最小化误差值的方式更改参数 (a 和 b)。更新参数和减少错误的过程称为 “学习”。

似乎黑线(右下角图)在其他三条线中更合适,并且在二维空间中,通过看到绘制的线,可以在一定程度上指定最佳参数;但我们知道,数据不能在高于三维的维度上可视化,为了能够将最佳线(在更高的维度中,超平面)拟合到数据,我们需要一个损失函数。

2.2 回归中的损失函数

回归问题有多种损失函数,下面给出了三种最常用的类型。

  1. 平均绝对误差或“MAE”
    MAE 函数是最简单的损失函数之一。为了计算此函数,我们平均整个数据集上实际值与模型预测之间差值的绝对值。

表达式 3.对于 MAE:
在这里插入图片描述

import numpy as np

# MAE loss function
def mae_loss(y_pred, y_true):
    absolute_error = np.abs((y_pred - y_true)) 
    sum_absolute_error = np.sum(absolute_error)
    loss = sum_absolute_error / y_true.size
    return loss
  1. 均方误差或“MSE”
    均方误差是使用最广泛的损失函数之一,为了计算 MSE,我们在整个数据集中平均实际值与模型预测之差的平方。

表达式 4.对于 MSE:
在这里插入图片描述

import numpy as np

# MSE loss function
def mse_loss(y_pred, y_true):
    squared_error = (y_pred - y_true) ** 2
    sum_squared_error = np.sum(squared_error)
    loss = sum_squared_error / y_true.size
    return loss

在上述两个关系中,y ̂_i 是指算法的输出或预测值,y_i 是指目标值或标签,这两个值之间的差异显示了每个数据样本的误差,在 “MAE” 中是误差的绝对值 |y_i - y ̂_i|然后计算它们的平均值;此函数对异常值数据不太敏感,但在 “MSE” 中,由于是针对每个误差计算平方,因此它对异常值样本具有很大的权重。因此,此函数对异常值高度敏感。在两个标准 MAE 和 MSE 中,值越低表示结果越好。
图 4.显示每个函数产生的误差量的可视化视图。
在这里插入图片描述

图 4.MAE 和 MSE 中产生的误差量

# Plot MSE
x_mse = np.arange(-1, 1, 0.01)
y_mse = np.square(x_mse)
plt.plot(x_mse, y_mse, "blue", label="MSE")
plt.grid(True, which="major", alpha=0.5)


# Plot MAE
x_mae = np.arange(-1, 1, 0.01)
y_mae = np.abs(x_mae)
plt.plot(x_mae, y_mae, "red", label="MAE")
plt.grid(True, which="major", alpha=0.5)
plt.xlabel('$y_i - y ̂_i$', size='x-large')
plt.ylabel('Loss', size='x-large')
plt.title('MAE vs MSE Loss Function')
plt.legend();

上述函数的图解如图 5 所示。
在这里插入图片描述
图 5. MAE 和 MSE 函数
3. Huber 函数
表达式 5.对于 Huber:
在这里插入图片描述

y_i 是指实际值或标签,y ̂_i 是指预测值,δ 也是指 delta 值。通过更改 delta 值,可以绘制各种函数,如图 6 所示。
在这里插入图片描述
图 6.具有不同 delta 值的 Huber 函数 (δ)
在图 6 中,横轴是指预测值和标签的减法,纵轴是指产生的损失量。

三、线性回归中的评估标准

回归问题有不同的标准。以下是三种最常用的类型。上一节中介绍的两个函数 MAE 和 MSE 也可以用作损失函数,但称为“R-Square”或“R2”的第三个标准仅用于评估。该标准的目的是以百分比的形式提供一个数字,以便我们可以更轻松地了解模型是否训练有素。这个准则的可解释性比前两个准则要容易,而且这个准则的值在无穷大和一的负范围内;标准越接近 1,模型在估计中的准确性就越好,而 MAE 和 MSE 的值越低,准确性就越好。

表达式 6.对于 R 平方准则:
在这里插入图片描述

在表达式 6 中,分数 y̅ 的分母是指目标数据或标签的平均值,其他项目与前面解释的 MSE 相同。

from sklearn.metrics import r2_score

# Actual values
actual = [1, 2, 3, 4, 5]

# Predicted values
predicted = [1.2, 1.8, 3.2, 3.9, 4.7]

# Compute R-Squared score
r2 = r2_score(actual, predicted)

print("R-Squared score:", r2)
# R-Squared score: 0.978

回归的目的是创建一个模型来估计以前未遇到的值。回归中的一种评估方法是 “Train/Test Split” 图 7。在这种方法中,样品分为两类:

1- 训练集 (Train) 或构建模型的部分。

2- 测试集或测试构建模型的零件。

在这里插入图片描述

图 7.通过训练/测试拆分方法划分样本来评估模型
在训练机器学习模型的过程中,通常会考虑训练数据 80% 和测试数据 20% 的比例。

四、线性回归模型训练

在下文中,我将解决一个简单线性回归的示例,我已将其代码放在我的 GitHub 上,您可以从那里下载数据集。我们必须训练一个模型,使其能够找到 a 和 b 的最佳值,从而获得尽可能小的误差。

包含入口

import pandas as pd
import numpy as np

数据
广告数据集包含有关产品在不同市场中的销售信息,以及该产品在每个市场中的广告预算。该数据集包括 200 个实例,具有电视广告预算、广播广告预算和报纸广告预算等 3 个特征。

目标变量是产品的销售额,它也是一个连续变量。我们可以使用广告预算来预测商品的销售情况。

df = pd.read_csv('Datasets/Advertising.csv')
# remove the first column from the DataFrame.
df = df.iloc[:, 1:]
df.head()

在这里插入图片描述

图 8. 绘制 5 行数据集
选择一项特征

df_new = df[['TV', 'Sales']]
df_new.head()

在这里插入图片描述

图 9. 绘制数据集的 5 行选定列
type(df_new) # pandas.core.frame.DataFrame
转换为 NumPy
dataset = np.array(df)
训练测试拆分

# Extract the values from array in the first column, assign them to the variable 'x'.
x = dataset[:, 0]
y = dataset[:, 1]

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

print(x_train.shape) # (160,)
print(y_train.shape) # (160,)
print(x_test.shape)  # (40,)
print(y_test.shape)  # (40,)

五、可视化

import matplotlib.pyplot as plt
plt.scatter(x_train, y_train);

在这里插入图片描述

图 10. 图 x_train 和 y_train

5.1 假设函数

如果我们有一个特征(也称为单变量线性回归),则线性回归中线的公式(也称为假设函数)可以简化为:

y h a t = β 0 + β 1 x y_hat = β₀ + β₁x yhat=β0+β1x

这里:

y_hat 是因变量或模型输出(也称为响应变量)
x 是自变量或输入(也称为预测变量)
β₀ 是 y 截距(也称为偏置项)
β₀ 确定直线与 y 轴相交的点。较大的值 β₀ 将整个行向上移动,而较小的值 β₀ 将整个行向下移动。
β₁ 是自变量 x 的系数(或权重)
β₁ 确定线的斜率。较大的 β₁ 值会使线条更陡峭,而较小的 β₁ 值会使线条更平坦。
β₀ 和 β₁ 是模型参数

x_train = x_train.reshape(-1, 1)
y_train = y_train.reshape(-1, 1)

代码 and 用于将训练数据数组从 1 维形状重塑为具有单列的 2 维形状。这样做通常是为了匹配某些机器学习算法的预期输入形状,或者执行需要 2 维输入的操作。

x_train.reshape(-1, 1)y_train.reshape(-1, 1)

x_train.shape, y_train.shape
# ((160, 1), (160, 1))
from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)
model.coef_, model.intercept_
# 0.04652973, 7.11963843

5.2 计算训练模型的损失:

# Compute the predicted values
y_pred = model.predict(x_train)

# Compute the loss (mean squared error)
loss = np.mean((y_train - y_pred) ** 2)
print(loss)  # 10.60

5.3 绘制 Hypothesis 函数,其中包含模型计算的 coef 和 intercept

plt.scatter(x_train, y_train);

x = np.linspace(0, 300, 100)

b0 = 7.11
b1 = 0.04

y_hat = b0 + b1*x

plt.plot(x, y_hat, 'r',  label=f'b0 = {b0},  b1 = {b1}');
plt.legend()

在这里插入图片描述

图 11. 绘制具有 coef 和 intercept 的假设函数
如果您想访问代码,请打开我的 GitHub 存储库并打开 06. linear_regression。

六、结论

在第 2 天,我们讨论了简单线性回归。在下一节课:机器学习系列:第 3 天 — 使用梯度下降 (GD) 进行优化时,我们将讨论一种称为梯度下降的基本优化算法。

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

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

相关文章

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.电平转换 2.芯片使能/失能 EN 引脚为高电平有效,内部上拉至 VCC(B),允许用户选择中继器何时有效。这可用于在上电时隔离行为不良的从机,直到…

饭店起名|饭店怎么起名有创意

给饭店起名是一个非常重要的任务,对于饭店的经营和吸引力都有着重要的影响。一个好的饭店名字能够吸引顾客、传达出饭店的风格和特色。在起名之前,我们需要先考虑一些因素,例如饭店的定位、菜品特色、目标顾客、所在地区等。下面是一些建议可…

20章 线性表、栈、队列和优先队列

1.编写一个程序,从文本文件读取单词,并按字母的升序显示所有的单词(可以重复)。单词必须以字母开头。文本文件作为命令行参数传递。 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays;pu…

python-数字反转

题目描述 给定一个整数 N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。 输入格式 一个整数 N。 输出格式 …

数据结构基础讲解(七)——数组和广义表专项练习

本文数据结构讲解参考书目: 通过网盘分享的文件:数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 数据结构基础讲解(六)——串的专项练习-CSDN博客 个人主页:樱娆…

猫头虎分析:iPhone 16 系列哪款更适合你?买 iPhone 16 选哪款好?

猫头虎分析:iPhone 16 系列哪款更适合你?买 iPhone 16 选哪款好? 大家好,我是猫头虎。每年苹果发布新机型时,总能引发广泛的讨论和期待。今年也不例外,苹果发布了备受瞩目的 iPhone 16 系列,无…

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

COCOS:(飞机大战02)简单的帧动画制作

飞机大战知识点总结 先准备2张图片 选中飞机Body,01:添加动画组件,02:新建动画剪辑资源,保存到动画目录。 在动画编辑器中先增加属性,点加号,选择cc.Sprite,选择spriteFrame把飞机图片hero0 拖…

项目售后服务方案(Word原件2024)

售后服务体系 售后服务流程 售后服务承诺 售后服务计划 技术支持响应承诺 售后服务响应时间 1.2 项目培训方案 项目培训体系 项目培训管理 培训目的与措施 项目培训安排 培训告知下达 培训人员贯彻 培训签到表 工作安排任务书,可行性分析报告,立项申请审…

聚观早报 | 拼多多“百亿减免”新政策;石头洗地机A30系列发布

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 9月10日消息 拼多多“百亿减免”新政策 石头洗地机A30系列发布 iQOO 13将采用京东方定制屏幕 iPhone 16 Pro或支…

Lombok失效:报错 找不到符号 Springboot项目

错误原因,Springboot项目为Lombok提供了版本管理的支持,所以引入Lombok依赖的时候,无需手动指定版本,手动指定了可能会导致依赖冲突。 去掉手动指定的版本,问题解决

Why I‘m getting 404 Resource Not Found to my newly Azure OpenAI deployment?

题意:为什么我新部署的Azure OpenAI服务会出现404资源未找到的错误? 问题背景: Ive gone through this quickstart and I created my Azure OpenAI resource created a model deployment which is in state succeedded. I also playaround …

使用Kimi生成Node-RED的代码

目录 引言 Kimi生成 导入Node-RED 引言 前面写过几篇博客介绍了Node-RED的使用。Node-RED使用起来已经很方便了,拖拉一下就可以生成程序流。当然,如果想偷懒,可以借助Kimi。 Kimi生成 Kimi不能生成图形,但是Node-RED支持JS…

Mysql事件操作

查看是否开启事件 SELECT event_scheduler; SHOW VARIABLES LIKE %event_scheduler%; 开启或关闭事件 SET GLOBAL event_scheduler 1; SET GLOBAL event_scheduler on; SET GLOBAL event_scheduler 0; SET GLOBAL event_scheduler off; 创建事件sql CREATE EVENT IF…

用Python实现时间序列模型实战——Day 16: 时间序列预测方法

一、学习内容 1. 一步预测与多步预测的区别与方法 一步预测: 一步预测指的是仅预测下一个时间步的值。模型只预测未来一个时间点,然后终止。这种预测方法通常用于短期预测,且误差较小。 多步预测: 多步预测指的是预测多个未来时…

好书推荐!《Transformer与扩散模型:生成式AI实战指南》,附赠PDF!

《Transformer 和扩散模型的生成式 AI 实用指南》 是一本关于生成式人工智能的技术指南,特别关注了Transformer和扩散模型在AI领域的应用。 这本大模型书籍已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 这本…

三、数组————相关算法题探讨(持续更新中)

数组中相关算法题探讨 前言一、二分查找1.1 思路分析1.2 数组遍历的做法1.2 二分查找的做法1.2.1 二分查找定义1.2.2 二分查找代码实现(方法一)1.2.3 二分查找代码实现(方法二) 二、移除数组中的元素2.1 思路分析2.2 三种解法2.2.…

yolov5 自训练模型转 tensorrt 及测试

文章目录 一、准备yolov5自训练模型二、下载tensorrtx源码三、从pt模型生成wts模型四、修改tensorrtx源码4.1 修改 yololayer.h4.2 修改 yolov5.cpp 五、编译运行tensorrt/yolov5 在yolov5训练完模型后,将其转换为tensorrt格式,可以加速推理时间&#xf…

基于单片机的仔猪喂饲系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

【Authing身份云-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…