1.故事线
从前,在一个名叫线性大陆的小镇上,住着一个名叫雷格的男人。Reg 是一位热衷于预测事物的科学家。天气、股市,甚至他最喜欢的球队夺冠的概率,他都已经预料到了。但有一天,他面临一项看似不可能的挑战:预测邻居的房价。 他收集了他能找到的关于他附近房屋的所有数据,包括房间数量、花园大小、到最近超市的距离以及许多其他特征。然后,他坐在办公桌前,开始在一张纸上涂鸦。几个小时过去了,雷格全神贯注于他的计算。
突然,他的猫跳到桌子上,打翻了咖啡杯。雷格正要生气,但随即他发现了一件奇怪的事:纸上的咖啡渍似乎形成了一条直线。 他记得在某处读到一条直线可以用来模拟变量之间的关系,就在那时,他突然想到:他发现了线性回归!他记得在某处读到一条直线可以用来模拟变量之间的关系,就在那时,他突然想到:他发现了线性回归!
借助这个简单而强大的工具,Reg 能够做出准确的预测并帮助许多人。在我们的文章中,我们将以一种简单、引人入胜且全面的方式解释线性回归,以便您也能成为预测大师!
2.LR介绍
现在您已经了解了 Reg 的故事和他发现线性回归的故事,让我们更深入地了解它是什么以及它是如何工作的。线性回归是机器学习和统计学中最基本的算法之一,用于根据一个或多个输入变量预测数值结果。这是一种监督学习,这意味着我们使用标记数据来训练模型以对新的、看不见的数据做出准确的预测。简单来说,它就像(x) 和 (y) 映射。
线性回归的核心是通过一组数据点找到“最佳拟合”线,其中该线表示输入变量和我们要预测的输出变量之间的线性关系。然后,通过插入输入变量并求解输出变量,这条线可用于对新数据点进行预测。
为了更准确地理解它,让我们认识一下穆罕默德,他是一位农民,他想预测即将到来的季节的作物产量。他一直在跟踪过去几周他的作物接受的阳光和水量,以及温度和湿度水平。Mohammed 知道所有这些因素都会影响他的作物产量,但他不确定如何根据他收集的数据做出准确的预测。
输入线性回归。通过使用线性回归,Mohammed 可以通过他的数据点找到最佳拟合线,该线表示输入变量(阳光、水、温度和湿度)与输出变量(作物产量)之间的平均关系。有了这条线,Mohammed 就可以对新的数据点做出预测,例如他的作物在即将到来的季节将获得的阳光量、水量、温度和湿度。
3. 技术细节
线性回归是一种监督机器学习算法,用于预测连续值。之所以称为“线性”,是因为它假定输入变量(也称为“特征”)和输出变量(也称为“目标”)之间存在线性关系。线性回归的目标是找到 **代表这种关系的最佳拟合线,以便对新数据点做出准确的预测。
你还记得高中的线性函数公式吗? (y = mx + b) 这个公式是LR的基础。其中 y 是目标变量,x 是特征变量,m 是直线的斜率,b 是直线的 y 截距。
在Reg试图根据房屋大小预测价格的例子中,目标变量是房价,特征变量是房屋大小,斜率(m)和y轴截距(b)代表关系两个变量之间。通过使用线性回归计算最佳拟合线,我们可以使用等式 (房价 = m * 房屋大小 + b) 根据未来任何时间的大小预测任何房屋的价格。
现在您脑海中浮现的真正问题是如何知道 (m) 和 (b) 的最佳值。 好吧,让我们一起看看。
想象一下,您正在玩飞镖游戏,并且您正试图击中靶心。你扔了一支飞镖,它落在了棋盘上的某个地方。但是你对它降落的地方不太满意,因为你瞄准了靶心。所以,你又扔了一支飞镖,这次它落在离靶心更近的地方。你不断地投掷飞镖,试图尽可能靠近靶心。
3.1 损失函数
在机器学习中,“靶心”是代表输入变量和输出变量之间关系的最佳拟合线。但由于我们不知道靶心的确切位置,我们必须不断地投掷“飞镖”(即调整斜率和 y 轴截距的值),直到我们尽可能接近靶心。
但是我们怎么知道我们是否正在接近靶心呢?
这就是损失函数的用武之地。损失函数就像一个记分牌,告诉我们离靶心有多远。它接受我们当前的斜率和 y 轴截距值,并将输出变量的预测值与输出变量的实际值进行比较。预测值和实际值之间的差异越大,记分牌上的“分数”越高(即损失越高)。
我们的目标是最小化损失(即尽可能靠近靶心),因此我们不断调整斜率和 y 轴截距的值,直到损失尽可能低。一旦损失最小化,我们就找到了表示输入变量和输出变量之间关系的最佳拟合线。
在我们的文章中,我们将解释如何计算损失函数的技术细节,以及如何使用它来使用线性回归找到最佳拟合线。但现在,请记住,这就像一场飞镖游戏,我们正在努力尽可能接近靶心!
这一切都归结为这个等式:
y = mx + b。
我们将执行以下操作:
- 定义要优化的内容(损失函数)
- 查看优化损失函数的步骤。
- 获取导致最佳拟合回归线的 w 和 b 的值,到达靶心。
这称为优化,我们将使用一种称为梯度下降的算法来实现它。
现在,让我们定义损失函数!
假设我们有 n 个点 (X1, Y1) … (Xn, Yn) 并且我们想要获得最适合这 n 个点的回归线。
请记住,我们的目标是使线和实际点之间的差异最小。所以,我们希望 (y_actual - y_predicted) 很小,但我们希望所有点都这样,所以我们对所有点求和。
实际值 (y) 和预测值 (y^) 之间的差异之和。
但是等等,有一个问题,这将加起来为零,因为有时差异是正的,有时是负的,它们会相互抵消。
啊哈,你是对的,这就是为什么我们要对差值求平方,然后得到所有 n 个点的平均值。现在它变成正数,它们加起来我们称之为平方差的平均值 (J)。
因此,我们的损失函数 (J) 变为:
J(m, b) = (1/n) * Σ( y_actual(i) — y_regression(i))²。
在这里,n 是我们数据集中数据点的数量,求和符号 Σ 表示实际 y 值 (y_actual) 和预测 y 值 (y_regression) 之间的平方差之和。
我们的线性回归模型的目标是最小化这个损失函数,我们可以使用各种优化技术来做到这一点,比如我们之前提到的梯度下降。因此,如果我们想为我们的数据创建最佳拟合线,我们需要找到最小化均方误差的 m 和 b 值。
但别担心,我们不需要手动执行此操作——有大量可用的库和工具只需几行代码就可以为我们完成此操作!”,我们只需要了解其背后的动机^_^。
Waaait,您有时会在文献中看到 1/2n 而不是 1/n,这是为什么呢?这是一个数学技巧,当我们得到这个项的导数时,我们会用它来简化我们的事情。
LR 损失函数。
总结一下:
- 获取实际值 (y) 和预测值 (y^) 之间的差异。
- 平方差。
- 对 n 个数据点求和。
- 除以 2n。
为了更好地理解,让我们看下图:
红线代表预测值,蓝点是实际值。我们希望最小化它们之间的差异,以绿色显示。为此,我们将使用称为梯度下降的优化算法,该算法迭代更新 m 和 b 的值以找到使损失函数最小化的值。
3.2 梯度下降
从前,一群徒步旅行者在茂密的森林里迷路了。他们想找到出去的路,所以他们沿着最陡峭的下坡路走。这类似于梯度下降的工作原理,通过找到最陡峭的下坡路径来达到损失函数的最小值。
为了最小化某些东西,我们得到它关于我们最小化的变量的导数( ∂) 。 因此,为了最小化损失函数,我们将得到它对 m 和 b 的导数。
我们知道 ( y_regression = mx + b )。让我们分解一些公式:
- 损失函数公式:
*J(m, b) = (1/n) * Σ( y_regression(i) — y_actual(i) )²。对于 i= 1, …, n。
*该公式用于计算预测值与实际值之间的差异。通过找到预测值和实际值之间的平方差,我们可以确定我们的模型与真实值的差距。目标是最小化这种差异以使预测更准确。 - 关于 m 的导数:
*∂J/∂m = (1/n) * Σ(x * (y_regression(i) — y_actual(i)))
*这个公式给出了损失函数相对于回归线的斜率 (m)。这个导数告诉我们损失函数会随着 m 的微小变化而变化多少。 - 关于 b 的导数:
*∂J/∂b = (1/n) * Σ(y_regression(i) — y_actual(i))
*这个公式给出了损失函数相对于 y 截距的变化率回归线 (b)。这个导数告诉我们损失函数会随着 b 的微小变化而变化多少。
ew,那是很多数学。伟大的!现在我有了衍生品,我该如何处理它们?我们去获得 m 和 b 的值,这将使我们成为靶心。
梯度下降的步骤是:
- 随机选择 m 和 b 的值以启动该过程。
- 使用 m 和 b 计算损失函数的梯度(导数)。
- 更新 m 和 b。
- 重复直到梯度变化很小或为零,这称为收敛。通常,我们会让我们的代码循环预定义的迭代次数。
梯度下降步骤
和以前一样,我们需要在一开始就获得直觉。那么,让我们看看下面的情节:
视觉上的梯度下降步骤。
在前面的图中,我们在y 轴上有成本函数,在x 轴上有线性回归权重 (m) 。
该图显示了成本函数如何随着权重在梯度下降过程中的更新而变化。最初,权重设置为随机值,成本函数很高。随着权重的更新,成本函数减小,最终算法收敛到成本函数的最小值,该值代表线性回归模型的最优权重。
3.3 Pyt hon中的梯度下降代码
虽然 Python 中有许多库可以为我们执行线性回归,但理解其背后的代码对于理解算法的工作原理非常有用。在本节中,我们将使用Numpy实现线性回归,Numpy 是一个强大的 Python 数值计算库。通过编写我们自己的代码,我们将对底层数学有更深入的了解,并能够根据需要调整算法。此外,查看代码可以帮助我们调试在实施过程中可能出现的任何问题。
那么,让我们深入研究代码,看看如何使用Numpy实现线性回归。
def gradient_descent ( x, y, m= 1 , b= 1 , alpha= 0.1 , num_iters= 1000 ):
# 使用初始斜率和 y 截距值计算初始回归值
y_regression = m*x + b
# 获取大小数据集的
data_size = len (y)
# 迭代指定的迭代次数
for i in range (num_iters):
# 计算损失函数关于 m 的偏导数 loss_function_change_m
= ((y_regression - y)*x) . sum () / 数据大小
# 计算损失函数关于b的偏导数
loss_function_change_b = (y_regression - y)。sum () / data_size
# 使用学习率 alpha 和损失函数的偏导数更新斜率和 y 截距值
m = m - alpha * loss_function_change_m
b = b - alpha * loss_function_change_b
# 使用更新后的值计算新的回归值斜率和 y 截距值
y_regression = m * x + b
返回m, b
真实示例:使用线性回归根据 SAT 分数预测 GPA
为了更好地理解线性回归,让我们看一个真实世界的例子。假设我们要根据学生的 SAT 分数预测他们的 GPA。我们有几个学生的 SAT 分数和 GPA 数据集,我们想使用线性回归找到表示两个变量之间关系的最佳拟合线。
首先,我们将导入必要的库并加载数据集:
import pandas as pd # 导入 pandas 库进行数据处理
import numpy as np # 导入 numpy 进行数值运算
import matplotlib.pyplot as plt # 导入 matplotlib 进行数据可视化
%matplotlib inline # 显示 matplotlib 绘图的魔术命令 inline
data = pd.read_csv( 'sat_scores.csv' ) # 读取数据集并将其存储在名为“data”的 pandas 数据框中
接下来,我们将查看数据并可视化 SAT 分数与 GPA 之间的关系:
# SAT 分数和 GPA 的散点图
plt.scatter(data[ 'SAT Score' ], data[ 'GPA' ])
# 标注 x 轴和 y 轴
plt.xlabel( 'SAT Score' )
plt.ylabel( 'GPA' )
# 显示情节
plt.show()
从散点图中我们可以看出,SAT 分数和 GPA 之间似乎存在正相关关系。这意味着随着 SAT 分数的增加,GPA 也往往会增加。
现在我们需要将数据拆分为 train 和 test。你问为什么,我们来看下面的故事:
想象一下,您是一位老师,正在给您的学生做一个测试。但是,您没有给他们进行全新的测试,而是决定给他们进行与上周完全相同的测试。你告诉他们,“别担心,你已经知道所有的答案了!” 但是当学生们开始参加考试时,他们意识到有些不对劲——有些问题已经改变了,有些答案已经调换了,有些问题是全新的。
如果您不将数据集拆分为训练集和测试集,这基本上就是可能发生的情况。如果您使用整个数据集来训练您的模型,这就像为您的模型提供测试答案。当您随后使用相同的数据集来测试您的模型时,这就像为您的模型提供与之前完全相同的测试。您的模型将在该测试中表现良好,因为它已经看到了所有答案——但它无法推广到新数据。
这就是训练测试拆分的用武之地。通过将您的数据集拆分为训练集和测试集,您实际上是在为您的模型提供一个新的测试。您在训练集(旧测试)上训练您的模型,然后在测试集(新测试)上测试您的模型。通过这种方式,您可以看到您的模型对新数据的泛化效果如何——并且您不会误以为您的模型比实际情况更好。
拆分后,我们将使用线性回归找到表示 SAT 分数和 GPA 之间关系的最佳拟合线:
从sklearn.linear_model import LinearRegression
X = data[[ 'SAT Score' ]]
y = data[ 'GPA' ]
reg = LinearRegression() reg.fit(X, y)
前面的代码从 scikit-learn 库中导入 LinearRegression 类,该库提供 Python 中的机器学习工具。然后,它从数据集中选择“SAT 分数”列作为预测变量(输入特征)X,并选择“GPA”列作为响应变量(输出特征)y。然后将 LinearRegression 对象实例化为“reg”并使用“fit”方法拟合数据,该方法计算最佳拟合线的系数。
“好吧,伙计们,是时候看到奇迹发生了!我们已经在一些 SAT 和 GPA 数据上训练了我们的线性回归模型,现在是时候看看它如何根据 SAT 分数预测 GPA 了。为了可视化我们模型的性能,我们将根据我们的测试数据(红色)绘制预测线(蓝色)。你准备好了吗?我们开工吧!”
plt.scatter(X_test, y_test, color= 'red' )
plt.plot(X_test, y_pred, color= 'blue' )
plt.xlabel( 'SAT' , fontsize= 20 )
plt.ylabel( 'GPA' , fontsize= 20 )
plt.title( '预测线(蓝色)与测试数据(红色)' , fontsize= 25 )
plt.show()
“啊,线性回归,机器学习世界值得信赖的主力军。它可以预测房价、GPA 等等!但是等一下,这是什么?我们的预测线似乎在某些地方与实际测试数据有所不同。这里发生了什么?啊,是的,线性回归存在的祸根——异常值。这些讨厌的偏差会对我们模型的预测造成严重破坏,使线偏离数据的真实模式。这还不是全部——线性回归还假设特征和目标变量之间存在线性关系,这在现实世界中可能并不总是如此。不要误会我们的意思,线性回归是一个非常强大的工具,但重要的是要认识到它的局限性并适当地使用它。现在,
我们希望本文对线性回归提供了全面且易于理解的概述。我们首先介绍了简单线性回归的概念,解释了最佳拟合线的概念,并介绍了计算直线斜率和截距的数学公式。然后,我们讨论了成本函数和梯度下降优化算法对于最小化成本函数和找到斜率和截距的最优值的重要性。
为了使概念更具体,我们使用了一个根据学生的 SAT 分数预测学生 GPA 的真实示例,并演示了如何使用 Python 和 scikit-learn 库实现线性回归。