手工线性回归
在 Python 和 R 中
由 Unsplash 上的 CHUTTERSNAP 拍摄
线性回归背后的基本思想很简单。用数学术语来说,我们希望用自变量 X 来预测因变量 Y 。假设两个变量以线性方式相关,我们可以用简单的线性公式预测 Y :
作者的线性方程
(波浪等号表示“大约”)。简单地说,一旦我们对两个系数之间的关系有所了解,即我们已经对两个系数 α 和 β 进行了近似,我们就可以(有一定把握地)预测 y。αα代表截距(值 y 与 f(x = 0) ),ββ是斜率。
有了线性回归的帮助,我们可以回答很多问题;例如
- “海平面的上升与气温上升有联系吗?”,
- “有三间卧室的房子会有多贵?”
- “如果我们增加 20%的营销预算,我们能卖出多少产品?”
背后的数学原理
作者 10 次观察的散点图
我们来看一些数据!尽管上图中的观察结果有很大偏差,但趋势是明显可见的。这表明 X 和 Y 之间呈正相关。我们可以利用最小二乘法 的 方法来近似模拟两者之间关系的线性函数。让
作者的一组观察结果
是一组观察值,用散点图中的点表示。现在可以应用最小二乘法来近似系数 α 和 β 。
该方法最小化线性回归线的误差平方和(用机器学习术语来说,这是线性回归的成本函数)。误差在下一个图中用橙色线表示。通过将方程微分为β,我们得到以下公式:
作者对β的最小二乘法
顶部带有杆的 x 和 y 代表 x 和 y 的样本平均值。
通过将近似的 β 代入线性方程,我们得到 α 的近似:
作者给出的 Alpha 近似值
或者,你可以通过梯度下降来最小化成本函数。现在我们已经知道了线性回归的近似系数,我们可以绘制方程并进行第一次目视检查。
按作者列出的带回归线的散点图
图中的绿线代表线性方程,我们刚刚对其系数进行了近似。橙色箭头是误差(也称为残差),它们告诉我们观察值与预测值的偏差。误差总和越小,回归线拟合得越好。总和为 0 将是一个完美的拟合,这意味着所有的观察都是完全线性的。
残留物分析
对误差/残差的解释是建立回归模型的重要步骤。通过观察残差,我们可以知道它们是如何分布的(平均值为 0 的正态分布是最好的)以及它们是否是同方差的,即残差的方差是否是常数。
残差平方和(RSS)和残差标准差(RSE)
残差是预测值 y hat (即近似值)与观察值 y ,之间的差值,在上图中显示为橙色线。残差平方和 RSS 由以下公式定义:
作者的剩余平方和
在 **RSS、**的帮助下,我们可以计算出剩余标准误差( RSE )。RSE 是真实回归线标准偏差的估计值。这意味着平均而言,y 的值与真正的回归线相差一个 RSE。真回归线也叫人口回归线,描述的是 X 和 Y 的真实关系。我们如下计算 RSE :
作者的剩余标准误差
图基-安斯科姆图
残留物的直观表示可能会有所帮助。良好拟合的残差满足三个标准:
- 残留物的平均值为 0
- 残基是独立的
- 残差服从正态分布
借助 Tukey-Anscombe 图和简单的直方图,我们可以检查标准上的残留物。Tukey-Anscombe 图是一个散点图,它显示了残留物。绿线( y=0 )代表回归线。现在我们可以看到残数是如何围绕回归线排列的:
作者图片
目测表明,残差是独立的(它们不遵循一种模式,即没有系统误差),残差的平均值为 0,并且它们遵循正态分布。
点击这里查看一些不好的图。
r 平方
评估回归模型的另一种方法是 R 平方值。它通过测量可以用 X 解释的 Y 的变化比例,告诉我们模型与数据的拟合程度。为此,我们需要 RSS 和平方和 ( TSS) 。
作者的 r 平方
其中 TSS 是总平方和的计算公式
作者的平方和合计
r 的平方可以取 0 到 1 之间的值。接近 1 的结果意味着许多可变性可以通过回归来“解释”。接近 0 的结果可以表明我们的模型很差。这可能表明线性模型是错误的,或者误差的方差很高。
计算机编程语言
进行线性回归最简单的方法是利用 sklearn 库。
我们首先导入必要的库,然后定义我们的数据( X 和 Y )。请注意,数据可以很容易地来自数据帧。下一步是调用 LinearRegression()来拟合我们的模型。在我们的数据上拟合(x,y) 方法。这将返回一个包含我们的回归模型的对象,该模型现在可用于预测 x 的 y 。
import numpy as np
import seaborn as sns
from sklearn.linear_model import LinearRegression
import sklearn.metricsx = np.array([4, 6, 8, 10, 12, 14, 18, 18, 21]).reshape(-1,1)
y = np.array([2, 6, 4, 9, 5, 8, 6, 10, 10]).reshape(-1,1)# fitting the model
reg = LinearRegression().fit(x,y)# predicting values (x_new is an array of values you want to predict from)
x_new = x
y_new = reg.predict(x_new)# plot regression line
ax = sns.scatterplot(x[:,0],y[:,0])
sns.lineplot(x = x_new[:,0],y = y_new[:,0], color='green')
ax.set(xlabel='X', ylabel='Y')
plt.show()# R Squared
print(f'R Squared: {reg.score(x,y)}')
这会导致以下结果:
作者使用 R 平方值进行回归
有关 sk learning 线性回归如何工作的更多信息,请访问文档。
稀有
r 已经有一个内置的函数来做线性回归,叫做 lm() (lm 代表线性模型)。我们通过插入 X 和 Y 的数据来拟合模型。summary() 返回我们模型的一个很好的概述。看那个:R 的平方和我们用 Python 计算的一样。
# observed data
x <- c(4, 6, 8, 10, 12, 14, 18, 18, 21)
y <- c(2, 6, 4, 9, 5, 8, 6, 10, 10)# fit model
reg <- lm(y ~ x)# get summary of model
summary(reg)# Output
Call:
lm(formula = y ~ x)Residuals:
Min 1Q Median 3Q Max
-2.6377 -1.5507 0.3188 1.3623 3.1449Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.3768 1.6452 1.445 0.1918
x 0.3478 0.1217 2.858 0.0244 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 2.022 on 7 degrees of freedom
Multiple R-squared: 0.5386, Adjusted R-squared: 0.4727
F-statistic: 8.17 on 1 and 7 DF, p-value: 0.02439# plotting the regression line
plot(x,y)
abline(reg)
作者用 R 绘制的回归线
来源
詹姆斯、加雷思、丹妮拉·威滕、特雷弗·哈斯蒂和罗伯特·蒂布拉尼。2013.103 统计学习入门。纽约州纽约市:斯普林格纽约。http://link.springer.com/10.1007/978-1-4614-7138-7(4。2020 年啤酒节)。
“最小二乘法”。2020.维基百科。https://en.wikipedia.org/w/index.php?title=Least_squares&oldid = 978615667(4。2020 年啤酒节)。
sklearn.linear_model。线性回归-sci kit-学习 0.23.2 文档”。https://sci kit-learn . org/stable/modules/generated/sk learn . linear _ model。LinearRegression.html(5。2020 年啤酒节)。
线性回归系数可能在骗你
由作者创建
当心贝塔
解释线性回归系数很容易,因为它太简单了。训练一个模型可以用几行代码完成,结果产生的统计数据可以实事求是地说:“SAT 每增加一分,你被录取的机会就增加 0.002%”。
每当你带着这个目的训练一个线性回归(或逻辑回归)模型时,要小心:你正在危险的水域中行走。
线性回归到底在做什么?它将每个输入乘以一个值,然后将它们相加——作为额外的自由度,可以添加一个“截距”。结果应该是 y 变量。
让我们把线性回归放在上下文中。以下面的数据集为例,它包含学生申请研究生院的几个属性,如 GRE 或大学 GPA,以及他们的录取机会。
然后,线性回归方程变成:
当我们在数据集上训练线性回归模型时,我们发现系数为:
那么,默认情况下,我们可能倾向于作出以下声明:
- GRE 考试每增加一分,你被录取的几率就会增加 0.2%。
- 托福考试每增加一分,你的机会就会增加 0.3%。”
- 做研究能让你的录取几率增加 2.3%。”
要是这么简单就好了。
为了给出一个真正准确和严格的解释系数的定义:“这是如果 x 变量增加一个单位,保持所有其他 x 变量固定时 y 变量的变化。”这部分通常在解释系数时省略,因为它太长了。
例如,真正准确的解释应该是:
GRE 考试每得一分,你的机会增加 0.2%,假设:
-你的托福分数保持不变(标准分数)
-你的大学评分保持不变(1-5 分)
-你的 SOP 保持不变(1-5 分)
-你的 LOR 保持不变(1-5 分)
-你的 CGPA 保持不变(5-10 分)
-你的研究保持不变(0 或 1)
每个 x 变量的比例需要具体说明,因为线性回归严重依赖于比例。如果我们在一个数据集上训练,其中长度以英尺为单位,另一个以英里为单位,两者的性能将是相同的,但系数将是不同的。
理论上,一个变量的尺度变化不应该影响其他变量,但线性回归的实际实现并不总是像理论那样好。由于标度的较大差异会导致 y 变量出现缺口,系数调整算法通常会改变多个系数。
例如,当 research 列的标度为 0,100 而不是 0,1 时,考虑线性回归系数的差异。
研究系数降低,以应对规模的增加,但许多其他系数也发生了变化,特别是:
- GRE 分数从 0.0019 到 0.0012 (63%)
- 大学评级从 0.0085 到 0.0047 (55%)
- SOP 从 0.00046 到 0.0056(1.375%)
用 research 列在 0 到 100 的范围内训练一个模型和用另一个在 0 到 1 的范围内训练一个模型是完全有效的,但是结果是非常不同的。同样,你可能会发现长度、重量、价格、得分等不同测量值之间系数解释的差异。
确保您的系数在所有其他变量的上下文中有意义的唯一方法是指定每列的比例。
此外,添加和移除特征会对系数产生不同的影响。例如,如果我们完全删除研究列,其他系数需要增加,以解决缺少实质值加法器的问题(从线性回归的角度来看,功能仅用于增加或减少预测的y-值)。
所以让我们反过来想一想——如果起始数据集没有Research
列会怎么样?如果我们扩大数据集,我们会得到不同的结果,而数据的扩大通常意味着更接近事实。因此,除非你有“所有的数据”,至少在哲学上,你的线性回归系数永远不会是完美的。
然而,实际上,这意味着如果你能控制数据收集,你应该总是努力收集尽可能多的数据,因为有限的数据可能会影响系数。
多重共线性,或不同特征之间的高度相关性,也与系数的经验解释相抵触。例如,在所有其他因素保持不变的假设下,我们可能倾向于说“GRE 上的一分将增加 x %”的机会。实际上,GRE 成绩好的人很可能托福成绩也很好,并且正在申请评级更高的大学。
这意味着,由于相关因素,“GRE 上的一个点”所暗示的因果关系实际上可能会导致比 x %更大的增长。同样,“在 GRE 考试中失去一分”很可能会看到比 x %人们可以想象这在商业环境中会造成多大的破坏。
在很大程度上,所描述的大多数问题都可以追溯到多重共线性,这在每个现实世界的数据集中是不可避免的。如果您尝试变换数据集以消除多重共线性,系数将不再可解释(或者至少非常困难和有问题)。
实际上,唯一可靠的解决方案是首先不要使用线性回归。像 SHAP 这样伟大的解释方法大量存在,而且不容易受到简单线性回归容易出现的各种问题的影响。
但是,如果您坚持使用线性回归系数进行解释,请确保几乎没有多重共线性,并且为再现性和更接近事实的系数指定了比例和要素。
线性回归解释
[ —线性回归简单解释— ]
在这篇文章中,我将简单地解释线性回归。这可以被认为是一个线性回归的假人后,然而,我从来没有真正喜欢这个表达。
在我们开始之前,这里有一些额外的资源可以让你的机器学习事业突飞猛进:
*Awesome Machine Learning Resources:**- For* ***learning resources*** *go to* [***How to Learn Machine Learning***](https://howtolearnmachinelearning.com/books/machine-learning-books/)*!
- For* ***professional******resources*** *(jobs, events, skill tests) go to* [***AIgents.co — A career community for Data Scientists & Machine Learning Engineers***](https://aigents.co/)***.***
机器学习中的线性回归
在机器学习领域,线性回归是一种参数回归模型,它通过对一个观察值或数据点的输入特征进行加权平均,并添加一个名为的常数,即偏差项,来进行预测。
这意味着简单线性回归模型是具有特定固定数量的参数的模型,这些参数取决于输入要素的数量,并且它们输出数值预测,例如房屋的价格。
线性回归的一般公式如下:
线性回归公式
- ŷ 是我们要预测的值。
- n 是我们数据点的特征数。
- 是第跟特征的值。
- θI为模型的参数,其中θ0为偏差项。所有其他参数都是数据特征的权重。
如果我们想用线性回归来预测房子的价格,使用 2 个特征;房子的面积(平方米)和卧室的数量,自定义公式如下所示:
计算具有两个特征的房屋价格的线性回归公式:平方米和卧室数量
好吧,这看起来很直观。现在,我们如何计算最符合我们数据的θI的值呢?很简单:用我们的数据来训练线性回归模型。
为了确保我们都在同一点上,我们的训练数据被标记为数据:这是包含我们要为没有该值的新数据点计算的目标值的数据。在我们的房价示例中,我们的训练数据将包含大量房屋及其价格、平方米面积和卧室数量。
在我们训练了模型之后,我们可以用它来预测房子的价格,使用它们的平方米和卧室的数量。
训练模型的步骤如下:
- 首先,我们必须选择一个指标,通过将模型对训练集中的房屋所做的预测与实际价格进行比较,来告诉我们模型的表现如何。这些度量是像 均方误差 (MSE)或 均方根误差 (RMSE)这样的度量。
- 我们将模型的参数(θI)初始化为某个值(通常是随机的)并计算整个训练数据的这个误差。
- 我们迭代地修改这些参数,以便最小化这个误差。这是通过梯度下降等算法完成的,我现在将简要解释一下。
梯度下降训练
梯度下降 是一种优化算法,可用于各种各样的问题。这种方法的一般思想是反复调整模型的参数,以达到使这种模型在其预测中产生的误差最小化的一组参数值。
在模型的参数被随机初始化之后,梯度下降的每次迭代如下进行:利用这些参数的给定值,我们使用该模型对训练数据的每个实例进行预测,并将该预测与实际目标值进行比较。
一旦我们已经计算了该聚集误差(称为 成本函数 ),我们就测量该误差相对于模型参数的局部梯度,并且通过在梯度下降的方向上推动这些参数来更新这些参数,从而使得成本函数降低。
下图以图形方式显示了这是如何完成的:我们从橙色点开始,这是模型参数的初始随机值。在梯度下降的一次迭代之后,我们移动到蓝色点,它直接在初始橙色点的右下方:我们已经在梯度下降的方向上前进了。
梯度下降
一次又一次的迭代,我们沿着橙色的误差曲线前进,直到到达位于曲线底部的最佳值,在图中用绿点表示。
假设我们有一个只有一个特征的线性模型( x1 ),这样我们就可以很容易地绘制它。在下图中,蓝色的点代表我们的数据实例,对于这些数据实例,我们有目标的值(例如房子的价格)和一个要素的值(例如房子的平方米数)。
具有一个特征(x1)的线性回归模型的不同迭代的图形表示
在实践中,当我们使用梯度下降来训练模型时,我们首先用一条线来拟合我们的数据(初始随机拟合线),这不是它的一个很好的表示。在梯度下降的每次迭代之后,随着参数的更新,这条线改变它的斜率和它与 y 轴相交的位置。重复这个过程,直到我们达到一组足够好的参数值(这些值并不总是最优值),或者直到我们完成一定次数的迭代。
这些参数由绿色的最佳拟合线表示。
对于只有一个特征的模型来说,这很容易想象,因为线性模型的方程与我们在高中学习的直线方程是一样的。对于更多的特征,同样的机制也适用,但是这并不容易可视化。
只有一个特征的线性回归模型方程
直线方程
在我们完成这个过程并使用这个过程训练了我们的模型之后,我们可以使用它来进行新的预测!如下图所示,使用我们的最佳拟合线,并知道房子的平方米,我们可以使用这条线来预测它的价格。
使用线性回归进行预测
当然,这将是一个非常简单的模型,可能不是很准确,因为有很多因素影响着房子的价格。然而,如果我们增加相关特征的数量,线性回归可以为简单的问题提供相当好的结果。
结论和其他资源
线性回归是最简单的机器学习模型之一。它们容易理解,可解释,并且能给出相当好的结果。这篇文章的目标是为不是机器学习从业者的人提供一种以非数学方式理解线性回归的简单方法,所以如果你想更深入,或者正在寻找更深刻的数学解释,看看下面的视频,它很好地解释了我们在这篇文章中提到的一切。
就这些,我希望你喜欢这个帖子。请随时在 Twitter 上关注我。还有,你可以看看我在数据科学和机器学习上的帖子这里 。好好读!
更多类似的帖子请关注我的 ,敬请关注!
此处解释的信息摘自以下文章中的书,以及一些其他资源。
让你的机器学习知识更上一层楼
towardsdatascience.com](/the-book-to-really-start-you-on-machine-learning-47632059fd0e)**
在 5 分钟内解释线性回归
可以说是最基本的机器学习模型,尽可能简单地解释。
取自 Pixabay
线性回归是最广泛使用的方法之一,用于模拟两个或多个变量之间的关系。它可以应用于任何地方,从预测库存计划的销售,以确定温室气体对全球气温的影响,到根据降雨量预测作物产量。
在这篇文章中,我们将讨论什么是线性回归,它是如何工作的,并创建一个机器学习模型来根据许多因素预测一个人的平均预期寿命。
什么是线性回归?
根据维基百科,线性回归是一种建模因变量和一个或多个自变量之间关系的线性方法。简而言之,它是代表数据集的“最佳拟合线”。
下面是一个最符合数据点的线条示例。通过创建最佳拟合线,您可以预测未来点的位置并识别异常值。例如,假设此图表示基于重量的钻石价格。如果我们看红点,我们可以看到这颗钻石被高估了,因为在相同重量的情况下,它的价格比其他钻石高得多。同样,绿点的价值被低估了,因为它比其他重量相近的钻石便宜得多。
那么如何找到最佳拟合线呢?让我们找出答案。
简单线性回归如何工作
我们将关注简单线性回归。最佳拟合线,或表示数据的方程,通过最小化点和最佳拟合线之间的平方距离找到,也称为平方误差。
举个例子,上面显示了两条“最佳拟合线”,红线和绿线。注意误差(最佳拟合线和图之间的绿线)比红线大得多。回归的目标是找到一个误差总和最小的方程。
如果你想知道背后的数学,你可以看可汗学院的视频这里,他们在这里找到了 m 和 b 的偏导数
如果想使用简单的线性回归,可以使用 scikit-learn 库中的 linear regression 类。
from sklearn.linear_model import LinearRegression
多元线性回归
当您希望找到一个表示两个变量(自变量 x 和因变量 y)的方程时,简单线性回归非常有用。但是如果你有很多自变量呢?例如,汽车的价格可能基于多种因素,如马力、汽车尺寸和品牌本身的价值。
这就是多元回归的由来。多元回归用于解释一个因变量和多个自变量之间的关系。
下图显示了收入(y)与资历和教育年限(x)之间的关系。当有两个独立变量时,找到最佳拟合的平面,而不是最佳拟合线。
多项式回归
如果你有一组数据,它的最佳拟合线不是线性的(如下图所示)。这就是你想要使用多项式回归的时候。再次使用维基百科,它被定义为回归分析的一种形式,其中自变量 x 和因变量 y 之间的关系被建模为 x 中的 n 次多项式。更简单地说,它符合 x 和 y 之间的非线性关系。
当您想要使用多项式回归时,需要几行额外的代码:
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = n) #where n is equal to the number of degrees that you want
示例:预测平均预期寿命
为了演示如何用 Python 构建回归模型,我使用了 Kaggle 上的“预期寿命(世卫组织)”数据集。我的目标是创建一个模型,它可以根据一些变量预测某一年某一国家的人的平均预期寿命。请记住,这是一个非常基本的模型——我的下一篇文章将通过不同的方法来改进回归模型。
就准备数据而言,我或多或少遵循了我在 EDA 博客帖子中列出的步骤。
第 1 部分此处。
第二部分此处。
我在这个模型中引入了几个新主题,比如将分类数据(国家)转换为虚拟变量,以及评估所有变量的方差膨胀因子(VIF)。同样,我将在下一篇博文中讨论所有这些新话题。
我想分享的一件事是关联热图,因为这里有一些非常有趣的关联:
- “受教育程度”和 0.73 的“预期寿命”之间有很强的正相关关系。这可能是因为教育在较富裕的国家更为成熟和普及。这意味着腐败、基础设施、医疗保健、福利等等更少的国家。
- 与上述观点类似,在“国内生产总值”和 0.44 的“预期寿命”之间存在适度的正相关,很可能是由于同样的原因。
- 令人惊讶的是,“酒精”和“预期寿命”之间有 0.40 的适度正相关。我猜这是因为只有较富裕的国家才能买得起酒,或者酒精消费在较富裕的人群中更为普遍。
# Create Model
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeaturespoly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(X)
poly_reg.fit(X_poly, y)X_train, X_test, y_train, y_test = train_test_split(X_poly, y, test_size=.30, random_state=0)
regressor = LinearRegression()
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
清理完数据后,我执行上面的代码来创建我的多项式多元回归模型,MAE 为 8.22,范围为 44.4。在我的下一篇博客文章中,我将介绍几种方法来改进回归模型(也适用于大多数机器学习模型),使用我在这里使用的相同数据集。
线性回归:从数学到代码
使用 Python 的数学和实现指南
作者图片
介绍
如果你有统计学背景,甚至可能是高中水平,你可能对线性回归(LR)很熟悉。简而言之,它是统计学和机器学习(ML)中使用的核心技术之一,用于定义一个模型,该模型最好地描述由未知过程生成的一组观察数据 D 。虽然你可以在网上找到大量的例子来解释如何使用示例代码实现 LR,但是我的帖子试图提供贝叶斯 LR 背后的数学的逐步分解,并进一步试图解释如何使用 Python 代码实现它。请注意,我对这个概念包括符号的理解和解释,完全是基于本书第三章[1]。最后提供了参考资料,供您参考。对于那些熟悉该算法的人来说,这篇文章可能是对其背后概念的修正。对于那些不熟悉的人来说,我希望这篇文章能在你浏览其他作者提供的概念时起到指导作用。有一些线性代数,概率论和微积分的知识是必不可少的,以获得足够的这个职位。好了,我们开始吧!
数学
假设你有一组 D 的观察数据, (tᵢ, x ᵢ),从一个未知过程中得到的其中**ᵢ*和 tᵢ 分别是输入和输出。粗体 x ᵢ 的意思是它是一个矢量。这个未知过程的一个输出, tᵢ 与其输入 x ᵢ,之间的关系可以用一个函数tᵢ= f(xᵢ, w *)来描述。几何上,从线性代数的角度来看,一旦我们有了正确的一组基向量,我们就可以表示向量空间中的任何向量/点。这里的想法是,我们的输入生活在一个 d 维空间,ℝᴰ,我们的输出生活在一个 m 维 space,ℝᴹ,我喜欢称之为输出空间。我们的建模问题现在变成寻找 M 的合适值,即合适数量的基和参数值, w ,其组合这些基。这些依据又是, x 的函数,我相信是为了调音的目的!。这些函数被称为基函数。有许多函数可以用作基函数,例如多项式、高斯函数、sigmoids 等。在本文的代码部分,我们将使用多项式。
作者根据[1]和[2]提供的图片
这个函数描述了这个数据中的一个模式,如果确实有一个模式,那么下次我们有一个输入x**ᵢ,我们期望测量相同的输出 tᵢ ,这也可以通过我们的函数来预测。然而,实际上这并不完全准确,因为在我们的测量中总有一些噪声。因此,我们的函数应该考虑这种噪声。我们的观察将倾向于围绕我们的函数预测。由于中心极限定理,这些预测的分布近似于高斯分布。**
图片由作者基于[1]
所有观测值的联合概率(假设它们是独立同分布的)是单个观测值的概率分布的乘积,如下所示。
图片由作者基于[1]
这个表达式叫做似然**,如果我们在两边都应用 log,这样我们就可以处理加法而不是乘积,我们得到下面的表达式。**
作者根据[1]和[2]提供的图片
希腊φ符号被称为设计矩阵,我们将在代码部分看到构建它的一种方式。 t 是输出观测值的列向量 tᵢ 和 X 是矩阵,其中每行是观测值 x *ᵢ.*假设我们固定 M 的值,使可能性最大化的模型的参数值具有封闭形式的解,称为最大可能性估计**。**
作者图片
为了获得最大可能性的直觉,让我们做一个简单的思维实验。假设我们抛一次硬币,也许会有一条尾巴。好,让我们再抛一次,和我们又得到一条尾巴。好吧,也许这枚硬币有瑕疵。让我们再翻转一次,这次我们仍然得到一条尾巴。基于这些观察,我们不妨得出结论,得到尾巴的机会是 100%。但是我们知道我们的硬币是公平的,即先验知识。使用 Baye 定理,我们使用这个先验知识来提出一个更好的表达式来计算我们的参数 w 。
图片由作者基于[1]
将 log 应用于等式的两边,并求解最佳参数 w ,如之前所做的,我们获得下面的表达式及其下面的参数估计。这叫做最大后验估计**(图)。**
作者图片
最大似然法和最大后验概率法都只能给我们一个模型参数的精确估计,我们以后可以用它来进行预测。然而,在做预测时,重要的是要有一定的不确定性,这样我们才能从预测中做出正确的决定。显然,如果我们在这里结束,它不足以建立一个健壮的模型。
贝叶斯方法(BLR)进一步采用最大后验概率来形成预测分布。根据该分布,每个未来输入将具有相应的目标均值和方差/协方差。下面是数学的高级视图。
作者图片
现在可以使用下面的等式获得预测分布
作者图片
利用高斯分布的条件分布和边缘分布性质,可以得到后验参数分布和预测分布。更多细节见[1]的第 2 章。
在上述所有方法中,我们假设我们的数据和参数的方差(即 w )、和分别是已知的。实际上,这些值是未知的,可以从数据集进行估计。完整的贝叶斯治疗,我不打算在这篇文章中讨论,提供了一种称为证据近似的技术,可以用来近似这些值。然而,有几件事值得指出,我将在这里提到它们。如果 α⁻ 很高, w 将逼近最大似然估计。如果数据集很小, w 将逼近先验。随着数据集大小向无穷大增加,我们预测的方差变小,接近极限 β⁻ 。**
密码
使用 Python 代码,让我们从构建设计矩阵开始。如前所述,在这种情况下,我们将使用多项式基函数。
让我们首先创建一个使用最大似然估计(ML)进行回归的类:
现在让我们创建一个使用最大后验概率(MAP)进行预测的类:
最后,让我们创建一个用于进行贝叶斯线性回归的类。请注意,这并不完全是贝叶斯方法,因为 α⁻ 和 β⁻ 被假定为已知的,并且应该在类实例化期间作为标准差传入。
测试
现在让我们测试我们的模型。我们将使用合成数据,因此首先我们创建一个简单的函数来生成合成数据,然后设置一些参数并准备训练和测试数据。
现在创建模型、训练、预测和绘图,例如 ML、MAP 和 BLR:
最后是我们的图表:
作者图片
结论
在这篇文章中,我试图介绍线性回归背后的核心数学,并尝试使用 python 代码实现它。然而,正如您所看到的,该模型并不是观察到的数据的最佳拟合。主要原因是模型不够复杂,无法拟合数据(即拟合不足)。模型复杂度是模型的参数数量 M,在这个例子中,我使用了随机值 7。贝叶斯方法还提供了一种可以逼近模型复杂度最优值的方法,我可能会在另一篇文章中介绍。
参考
[1]:主教,C. M. (2006 年)。模式识别与机器学习。斯普林格。
[2]: Deisenroth,M. P .,Faisal,A. A .,& Ong,C. S. (2020)。机器学习的数学。剑桥大学出版社。
在 Excel 中从头开始线性回归
这样你就能更好地理解线性回归是如何工作的
虽然使用 Excel/Google Sheet 来解决机器学习算法的实际问题可能是一个坏主意,但使用简单公式和简单数据集从头实现该算法对于理解算法如何工作非常有帮助。在为几乎所有的常用算法做过之后,包括神经网络,它给了我很大的帮助。
在这篇文章中,我将分享我是如何用梯度下降实现一个简单的 线性回归的。
现在让我们把手弄脏吧!
由 Karen Maes 在 Unsplash 上拍摄的照片
从零开始为 ML 的谷歌表
如果你想得到谷歌表,请在 Ko-fi 上支持我。
你可以得到我创建的所有谷歌表单(梯度下降的线性回归,逻辑回归,神经网络,KNN,k-means,等等)。)和下面的链接。
https://ko-fi.com/s/4ddca6dff1
使用简单数据集
首先,我使用一个非常简单的数据集和一个特征,您可以看到下图显示了目标变量 y 和特征变量 x。
创建线性模型
在 Google Sheet 或 Excel 中,您可以添加趋势线。所以你得到了线性回归的结果。
但如果你想用模型做预测,那么就必须实现模型,在这种情况下,模型相当简单:对于每个新的观察值 x,我们只需创建一个公式:y=a*x + b,其中 a 和 b 是模型的参数。
模型的成本函数
我们如何获得参数 a 和 b?a 和 b 的最佳值是最小化成本函数的值,成本函数是模型的平方误差。所以对于每个数据点,我们可以计算平方误差。
误差平方=(预测值-实际值)=(a* x+B-实际值)
为了找到代价函数的最小值,我们使用梯度下降算法。
简单梯度下降
在实现线性回归的梯度下降之前,我们可以先做一个简单的函数:(x-2)^2.
想法是使用以下过程找到该函数的最小值:
- 首先,我们随机选择一个初始值。
- 然后对于每一步,我们计算导函数 df 的值(对于这个 x 值): df(x)
- 而 x 的下一个值是通过减去导数乘以步长的值得到的: x = x - step_size*df(x)
您可以修改梯度下降的两个参数:x 的初始值和步长。
在某些情况下,梯度下降不起作用。例如,如果步长太大,x 值可能会爆炸。
线性回归的梯度下降
梯度下降算法的原理与线性回归相同:我们必须计算成本函数相对于参数 a 和 b 的偏导数。让我们将它们记为 da 和 d b。
误差平方=(预测值-实际值)=(a* x+B-实际值)
da = 2(a x+b-实值) x
db = 2(a* x+b-实际值)
在下图中,您可以看到 a 和 b 如何向目标值收敛。
现在在实践中,我们有许多观察结果,应该对每个数据点都这样做。这就是 Google Sheet 中事情变得疯狂的地方。所以,我们只用了 10 个数据点。
您将看到,我首先创建了一个带有长公式的工作表来计算 d a 和 db,其中包含所有观察值的导数之和。然后我创建了另一个表来显示所有的细节。
如果打开 Google Sheet,修改渐变下降的参数:a 和 b 的初始值,步长,就可以自己玩了。尽情享受吧!
现在如果你想了解其他算法,请随意复制这张谷歌表,并对逻辑回归甚至神经网络稍加修改。
为了更好地展示可视化模型,您可以阅读这篇文章:
可以检查一下自己是否真的懂多元线性回归
towardsdatascience.com](/linear-regression-visualized-and-better-understood-c8f7b9c69810)
使用 Tensorflow 2 从头开始线性回归
纯用 TensorFlow 2.0 写线性回归算法
照片由 Andrik Langfield 在 Unsplash 上拍摄
线性回归是最基本的,也许是最常用的机器学习算法之一,初学者和专家都应该烂熟于心。在本文中,我将带你了解如何只用 Tensorflow 实现线性回归。讨论将分为两部分,第一部分解释线性回归的概念,第二部分是如何在 Tensorflow 中实现线性回归。
一.概念
线性回归试图通过拟合线性方程来模拟因变量和自变量之间的关系。假设我们有 100 名学生的测验分数和学习时间长度的数据。
100 名学生的测验分数和学习时间
通过观察散点图,我们可以很容易地用公式y=mx+b
画一条线,其中m
和b
分别是斜率和 y 轴截距。从图上可以看出,m
和b
分别大约为 40 和 0。
让我们在m=40
和b=0
之间划一条线。
用公式 y=40x 拟合直线
y=40x
线好看!然后,我们可以估计学生的分数是 40 乘以学生学习的小时数。
线性回归的工作原理与此完全相同,只是它不能从散点图中直观地检查斜率和 y 截距。相反,它首先猜测斜率和 y 轴截距,然后衡量其猜测的准确性。如果不够好,它会调整斜率和 y 轴截距,直到直线与数据吻合。
线性回归是一个三步算法:
- 初始化线性方程的参数(斜率和 y 轴截距的第一次猜测)。
- 基于某个函数测量拟合优度。
- 调整参数,直到步骤 2 中的测量看起来不错。
1。线性方程和初始化
现在,我们已经围绕线性回归建立了我们的直觉,让我们从数学的角度来讨论每一步。
线性回归模型的第一步是初始化一个线性方程,是的,我们将使用y=mx+b
但是我们必须推广我们的方法。这样做的原因是,我们可能会面临多个独立变量的数据。可以把它看作是在我们的测验分数数据中增加了另一个变量,比如学习时喝的咖啡量。拥有这个coffee
维度将使线性方程看起来像这样:y=m1x1+m2x2+b
,其中 m1 和 m2 分别是学习时间和咖啡维度的斜率,x1 和 x2 是学习时间和咖啡变量。
我们将使用点积来表示矩阵、m
和x,
的乘积,而不是为每个新变量写一个更长的方程。注意,使用术语张量也是有效的,因为它是矩阵的推广。黑体字母用来表示矩阵,所以线性方程应该写成 y =m⋅x+b。
有许多方法可以初始化方程的参数,最常见的是使用随机值、0 或 1。你可以自由使用任何类型的初始化,这个选择将决定你的学习算法终止的速度。在算法的下一次迭代中,这些参数将基于步骤 2 中讨论的某个函数进行更新。
2.损失函数
现在假设你为 m 和 b 设置的初始值都是 1,那么你的方程就是y=1x+1
。初始预测将看起来像下图中的橙色点。这显然是一个非常糟糕的预测,我们需要一个数字来量化这些预测是好是坏。
初始预测
有许多方法可以衡量我们预测的好坏,我们将使用其中一种叫做*均方误差(MSE)的方法。*在这种情况下,误差意味着差异,所以 MSE 字面意思是取实际值和预测值之差的平方,然后取平均值。它在数学上写为
图片来自researchgate.net
像 MSE 这样的函数叫做损失函数或者目标函数。这些是算法想要最小化的函数。如果我们的线性回归模型完美地预测了测验分数,它的 MSE 将等于 0。因此,在算法的每次迭代中,它应该更新参数,以使 MSE 更接近 0,而不会过度拟合。过度拟合本身是一个完整的主题,但它的本质含义是,我们不希望我们的学习算法对训练数据如此好,却在测试集上惨败。
3。梯度下降
当然,我们可以继续猜测参数,直到我们足够接近零 MSE,但这将需要时间和努力— 梯度下降将为我们做到这一点。如果你不熟悉这个术语,有大量的文章和视频解释它的概念。
梯度下降是人工智能的基石之一。就是机器学习中的学习。像梯度下降这样的算法允许学习算法在没有被如此明确地告知的情况下学习。(你需要温习一下微积分,了解梯度下降是如何工作的。)
梯度下降是一种优化算法,我们将使用它来最小化我们的损失函数(在这种情况下为 MSE)。它通过在每次迭代中用小的变化来更新参数,这个变化也可以很大,这取决于你的偏好(学习率)。
在每次新的迭代中,更新的参数将是p _ new = p _ old-(l * dL/DP),其中 p 是参数,它可以是斜率、m
或 y 轴截距、b
。新变量, l 和dL/DP,是损失函数相对于参数的学习率和偏导数。
通过足够的迭代,斜率和 y 轴截距将更接近 40°和 0°,我们认为这些值“足够接近”以符合我们的数据。正如您可能已经观察到的,如果您恰好将参数初始化为接近 40 和 0,比如 35 和 0.5,那么算法将需要较少的迭代。
如果你想更深入地研究梯度下降的数学,这篇文章很有帮助。
停止标准
以下是终止算法的一些可能方式:
- 一旦达到指定的迭代次数,就终止算法。
- 一旦满足指定的 MSE,就终止算法。
- 如果 MSE 在下一次迭代中没有改善,则终止该算法。您可以指定一个精度,如 0.001,如果两个连续 MSEs 之间的差值小于该精度,则停止算法。
II TensorFlow2 实现
在本演示中,我们将遵循上面讨论的线性回归算法的三步方法,并使用停止标准 1 终止算法。
导入库
这些是我们在这个演示中需要的唯一的库。TensorFlow 用于构建算法,pyplot 用于可视化,而boston_housing
作为我们的玩具数据集。
*import tensorflow as tf
import matplotlib.pyplot as pltfrom tensorflow.keras.datasets import boston_housing*
1.初始化一个线性方程
让我们从创建一个带有初始化选项的SimpleLinearRegression
类开始。
我指定了三个初始化选项,ones
、zeros
和random
(默认)。tf.random.uniform
将从范围minval
和形状shape
的maxval
内的均匀分布中产生随机值的张量。我将m
定义为一个没有特定形状的变量,因此它可以足够灵活地接受任意数量的独立变量,这可以通过设置shape=tf.TensorShape(None)
来实现。
2.损失函数
接下来是实现我们的损失函数,MSE。概括地说,MSE 在数学上写为:
图片来自 researchgate.net
下面是我在 TensorFlow 中实现的函数:
这在 Tensorflow 中写起来相当容易。首先取true
和predicted
值的差,用tf.square
求差的平方,然后用tf.reduce_mean
求差的平方的平均值。
该函数接受true
和predicted
值,前者来自数据本身,但后者必须经过计算。
predict
方法是通过简化线性方程来完成的。首先我们取m
(斜率张量)和x
(特征张量)的点积,加上 y 轴截距b
。我必须指定reduction_sum
中的缩减将被计算到1
的轴,否则它将把张量缩减为单个和。
3.更新参数
我们需要梯度下降来更新每次迭代的参数。没有必要从头开始创建这个算法,因为 Tensorflow 已经为此建立了一个函数,tf.GradientTape
。默认情况下,GradientTape
将persistent
设置为False
,这意味着最多可以对该对象中的gradient()
方法进行一次调用。因为我们使用它来计算每次迭代的两个梯度(一个用于m
,另一个用于b
,所以我们必须将其设置为True
。然后,我们指定将要计算梯度的损失函数,在这种情况下是带有参数y
和self.predict(X)
的mse
,它们分别代表true
和predicted
值。
每个参数将通过减去学习率和参数梯度的乘积来更新。
****p_new = p_old - (l*dL/dp)****
学习是一个超参数,应该在训练线性回归时指定。使用接受损失函数和参数的gradient()
方法计算梯度dL/dp
。这个操作只是求解损失函数相对于参数的偏导数。我们必须在每次迭代中计算两个梯度,一个用于m
和b
。
为了用新值更新参数,新值只是旧值减去l*dL/dp
,我们简单地使用tf.Variable
的assign_sub()
方法。
训练方法
让我们用一个train
方法把所有的东西放在一起。
它做的第一件事是,检查数据是否只包含一个独立变量,如果是,那么它会把它变成一个 2D 张量。
self.m.assign([self.var]*X.shape[-1])
将使用我们在初始化过程中设置的初始值初始化m
,其形状遵循数据中独立变量的数量。
我们算法的停止标准是迭代次数,由epoch
定义。对于每次迭代,它将调用update
方法。
这是线性回归的全部代码。
测试我们的算法
是时候使用波士顿房屋数据集来测试我们的算法了。
使用keras.datasets
加载数据集:
*(x_train, y_train), (x_test, y_test) = boston_housing.load_data()*
标准化数据:
*mean_label = y_train.mean(axis=0)
std_label = y_train.std(axis=0)mean_feat = x_train.mean(axis=0)
std_feat = x_train.std(axis=0)x_train = (x_train-mean_feat)/std_feat
y_train = (y_train-mean_label)/std_label*
创建并训练一个SimpleLinearRegression
对象。
*linear_model = SimpleLinearRegression('zeros')
linear_model.train(x_train_norm, y_train_norm, learning_rate=0.1, epochs=50)*
这是最近五次迭代的损失:
让我们使用测试集来预测:
*# standardize
x_test = (x_test-mean_feat)/std_feat# reverse standardization
pred = linear_model.predict(x_test)
pred *= std_label
pred += mean_label*
我们必须首先将输入标准化,然后一旦我们有了预测,就逆转这个过程。
结论
尽管简单,但线性回归是业内最常用的机器学习算法之一,一些公司会测试你对它的理解程度。虽然有更简单的方法来实现这个算法,比如使用 scikit-learn 甚至 TensorFlow 的LinearRegressor
,但我们从头开始实现了整个算法,目的是体验 TensorFlow 的功能。当你进入神经网络时,有像Keras
这样的高级库,它简化了使用 TensorFlow 作为后端构建神经网络的过程。但最终,特别是如果你是一名研究人员,你会想要定制你的模型,无论你想要什么,这就是 TensorFlow 的低级功能非常有用的地方。
Python 中的线性回归
线性回归简介
线性回归是一种统计方法,用于模拟响应变量和解释变量之间的线性关系。回归函数描述了给定解释变量时响应变量的期望值,并由线性函数建模。
在本帖中,我们将回顾线性回归背后的理论,以及如何使用 python 中的机器学习库 scikit-learn 实现线性回归模型。
我们开始吧!
给定一个 p 维输入向量:
我们想预测一个实值响应 Y 。给定输入向量 X ,允许我们预测 Y 的线性回归模型具有以下形式:
该模型描述了输入特征的加权和。它假设在给定 X 的情况下,代表 Y 的期望的回归函数是线性的或近似线性的。参数β是未知系数,输入向量 X 可以来自定量输入、变换输入、基展开、交互项和/或代表类别的虚拟变量。给定一组训练数据,我们估计β参数的值:
这里,每个 x 为输入向量(特征值列表),每个 y 为响应, N 为训练样本数。
如果我们回头看看回归模型:
我们看到,估计量 f 是一个常数加上具有相应 beta 值(或权重)的输入的线性组合。在求和中, p 是输入值或特征的数量。我们需要的是一种估计p+1β参数的方法:
估计β参数最常用的方法是最小二乘法。该方法选择使残差平方和(RSS)最小的β参数值:
第一次遇到这种情况时,你可能会感到畏惧。简而言之,该方法选择描述每个特征重要性的权重。有关解释线性回归模型的更多信息,请查看 Christoph Molnar 的 可解释的机器学习 。
所以现在我们应该考虑如何最小化 RSS。让我们用矩阵符号重写 RSS:
在矩阵 X 中,每一行都是一个输入特征,RSS 是一个带有 p +1 个参数的二次函数。我们可以对 RSS 相对于p*+1β参数求导:*
如果我们设这个导数等于零:
我们有独特的解决方案:
我们现在有了使 RSS 最小化的β参数。给定输入向量,我们可以通过训练输入的拟合值来表示预测值:
我们现在已经讨论了足够多的理论。现在让我们讨论如何在 python 中实现线性回归模型。
出于我们的目的,我们将使用来自 Kaggle 的医疗费用个人数据集数据。
首先,让我们导入 pandas 库:
*import pandas as pd*
接下来,让我们使用’将数据读入 Pandas 数据框。read_csv()'方法:
*df = pd.read_csv("insurance.csv")*
让我们打印前五行数据:
*print(df.head())*
我们将使用年龄、身体质量指数(bmi)、吸烟状况和性别建立一个线性回归模型来预测医疗费用。让我们定义我们的输入和输出:
*import numpy as np df['sex_code'] = np.where(df['sex'] == 'female', 1, 0)
df['smoker_code'] = np.where(df['smoker'] == 'yes', 1, 0)X = np.array(df[['age', 'bmi', 'children', 'sex_code', 'smoker_code']])
y = np.array(df['charges'])*
让我们为培训和测试拆分数据:
*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)*
让我们从 scikit-learn (sklearn)导入线性回归模块,定义我们的线性回归对象,并拟合我们的模型:
*reg = LinearRegression()
reg.fit(X_train, y_train)*
现在,让我们打印出我们的模型表现如何。我们将使用 R 指标来衡量绩效。r 是一个统计指标,用于衡量数据与回归线的接近程度。值介于 0 和 1.0 之间,值 1.0 代表完美的模型性能:
*print("Model Performance: ", reg.score(X_test, y_test))*
我们看到我们的模型表现得相当好。0.78 的 R 意味着我们的模型解释了我们数据中 78%的方差。我就讲到这里,但是我鼓励你阅读更多关于线性回归的内容,自己动手处理数据和编写代码。以下是一些有助于您继续学习的额外资源:
结论
总之,在这篇文章中,我们讨论了线性回归背后的理论。线性回归使用特征的加权和来表示响应变量。使用最小二乘法计算模型中的权重。我们还展示了如何在 python 中实现一个线性回归模型,并使用它来基于患者特征预测医疗成本。我希望你觉得这篇文章有用/有趣。这篇文章中的代码可以在 GitHub 上找到。感谢您的阅读!
Python 中的线性回归
线性回归背后的数学和 Python 实现方式
Python 中的线性回归
线性回归是一种基于监督学习的机器学习算法。线性回归是一种预测模型,用于寻找因变量和一个或多个自变量之间的线性关系。这里,因变量/目标变量(Y)应该是连续变量。
让我们使用 ski-kit learn 来学习简单线性回归背后的数学和 Python 实现方式
资料组
让我们先看看我们的数据集。为了便于解释,我选取了一个简单的数据集。 Years of Experience vs Salary
。
我们想根据一个人多年的经验来预测他的工资?
简单线性回归背后的数学
数据集
Exp vs 薪水[图片由作者提供]
在给定的数据集中,我们有 Exp vs Salary。现在,我们要预测 3.5 年经验的工资?让我们看看如何预测?
线性方程
线性回归方程[图片由作者提供]
c
→y-intercept
→x 为零时 y 的值是多少?
回归线在 y 轴截距处切割 y 轴。
Y
→给定 X 值的预测 Y 值
我们来计算一下 m 和 c 。
m
又称回归系数。它表明因变量和自变量之间是否存在正相关关系。正相关意味着当自变量增加时,因变量的平均值也增加。
m →斜率/回归系数[图片由作者提供]
回归系数定义为 x 和 y 的协方差除以自变量 x 的方差。
方差 →数据集中的每个数字离均值有多远。
x̄→x 的平均值
ȳ→y 的平均值
协方差是两个变量之间关系的量度。
我已经在 excel 表格中完成了所有的数学计算,可以从我的 GitHub 链接下载。
作者图片
协方差=(σ[(x̅—易)])/n =529.0740741
方差=(σ[(x̅—Xi)])/n= 1.509876543
m=协方差/方差= 529.0740741/1.509876543 = 350.488878657
m=350.4088307
现在来计算截距
y=mx+c
c=y-mx
应用平均 y (ȳ)和平均 x (x̅)in)等式并计算 c
c=733.3360589
c = 1683.33333-(350.4088307 * 2.7111)
计算了 m 和 c 之后,现在我们可以做预测了。
我们来预测一个有 3.5 年经验的人的工资。
y = MX+c
y 预测=(350.4088307 * 3.5)+733.3360589 = 1959.766966
x=3.5 的预测 y 值是**1959.766966**
性能赋值
为了评估我们的回归模型有多好,我们可以使用以下指标。
SSE-平方和误差
误差或 r esidual 是实际值和预测值之间的差值。所有误差的总和可以抵消,因为它可以包含负号,并给出零。所以,我们把所有的误差平方,然后求和。误差平方和最小的线是最佳拟合线。
最佳拟合线总是穿过 x̅和 ȳ.
在线性回归中,通过最小化误差(数据点和直线之间的距离)来计算最佳拟合直线。
误差平方和又称残差或残差平方和
SSE 方程[图片由作者提供]
SSR 回归的平方和
SSR 也被称为回归误差或解释误差。
是预测值与因变量 ȳ的均值之差的总和
SSR 方程[图片由作者提供]
SST 平方和合计
SST/总误差=误差平方和+回归误差。
数据集的总误差或可变性等于由回归线(回归误差)解释的可变性加上被称为误差或残差的无法解释的可变性( SSE )。
SST 方程[图片由作者提供]
已解释的错误或可变性→ SSR
未解释的错误→ SSE
作者图片
MSE →均方误差
MSE 是数据点的实际值和预测值之间的平方差的平均值。
MSE ->方程[图片由作者提供]
RMSE 均方根误差
RMSE 是衡量这些残差分布程度的指标。换句话说,它告诉你数据在最佳拟合线周围的集中程度。
RMSE 通过取 MSE 的平方根来计算。
RMSE 解释:
RMSE 解释为未解释方差的标准差(MSE)。
RMSE 包含与因变量相同的单位。
RMSE 值越低,表示拟合度越好。
相关系数
在建立模型之前,必须确定好的预测因素。相关系数®用于确定两个变量之间的关系强度。这将有助于确定良好的预测。
公式:
相关系数®[图片由作者提供]
相关系数®[图片由作者提供]
r 值范围从-1 到 1。
-1
表示负相关,即 x 增加,y 减少。
+1
表示正相关,表示 x 和 y 向同一个方向移动。
0
或接近 0 意味着没有相关性。
R ( R 平方) →决定系数
决定系数 →该指标在建立模型后用于检查模型的可靠性。
r→它等于回归解释的方差(回归误差或 SSR)除以 y 中的总方差(SST)
R →它描述了 y 中的总方差有多少是由我们的模型解释的。
如果误差(无法解释的误差或 SSE) <方差 (SST)表示模型是好的。最佳拟合是未解释误差(SSE)最小的线。
r 值的范围从 0 到 1。
0 →表示差的型号
1 或接近 1 →表示最好的型号
决定系数
计算我们数据集中的均方误差,RMSE,R
作者图片
让我们使用 scikit learn 在 Python 中做同样的实现。
使用的代码可以在我的 GitHub 链接中作为 Jupyter 笔记本下载。
1。导入所需的库
**import** numpy **as** np
**import** pandas **as** pd
**import** matplotlib.pyplot **as** plt
**import** seaborn **as** sns
2。加载数据
df=pd.read_csv(**"exp1.csv"**)
df
df.describe()
3。EDA —探索性数据分析
- 散点图
plt.scatter(df.Exp,df.Salary,color=**'red'**)
[我们可以找到 x 和 y 之间的线性关系]
- 直方图
df.hist()
- 求相关系数®
df.corr()
r 值 0.98 表明关系密切。
我们可以使用热图来绘制相关性
sns.heatmap(df.corr(),annot=True,vmin=-1,vmax=-1)
- 查找缺失值
df.isna().sum()
[没有丢失的值]
4.将特征分配给 X 和 Y
x=df.iloc[:,0:1]
x.head(1)
y=df.iloc[:,1:]
y.head(1
5.可视化数据集
plt.scatter(x, y)
plt.title(**'Experience Vs Salary'**)
plt.xlabel(**'Years of Experience'**)
plt.ylabel(**'Salary'**)
plt.show()
6.使用 sklearn 建立模型
**from** sklearn.linear_model **import** LinearRegression
lin_reg=LinearRegression()
lin_reg.fit(x,y)
可视化模型
plt.scatter(x,y)
plt.plot(x,lin_reg.predict(x),color=**'green'**)
plt.title(**"Regression Model"**)
plt.xlabel(**"YOE"**)
plt.ylabel(**"Salary"**)
7 .。使用模型预测 3.5 年工作经验的工资
ypredict=lin_reg.predict(np.array([[3.5]]))
ypredict
*#Output:array([[1959.76696648]])*
8。m(斜率)和 c(截距)值
lin_reg.coef_
*#Output:array([[350.40883074]])* lin_reg.intercept_
*#Output:array([733.33605887])*
9.计算决定系数
ypredict=lin_reg.predict(x)
ypredict
**from** sklearn.metrics **import** mean_squared_error,r2_score,explained_variance_score
print (**"Coefficient of determination :"**,r2_score(y,ypredict))
print (**"MSE: "**,mean_squared_error(y,ypredict))
print(**"RMSE: "**,np.sqrt(mean_squared_error(y,ypredict)))#Output:
Coefficient of determination : 0.9729038186936964
MSE: 5163.327882256747
RMSE: 71.85630022661024
我们使用数学计算和 python 实现得到相同的值。
如果这是一个大型数据集,我们必须分割数据进行训练和测试。
GitHub 链接
在我的 GitHub 链接中可以找到这个故事中用到的代码、数据集和 excel 表格
结论
在这个故事中,我们采用了简单的数据集,并使用 scikit learn 学习了简单线性回归背后的数学和 python 实现方式。
我们还可以使用 statsmodel 实现线性回归。
我关于机器学习的其他博客
相关系数、决定系数、模型系数
towardsdatascience.com](/line-of-best-fit-in-linear-regression-13658266fbc8) [## Python 中的逻辑回归
详细的逻辑回归
towardsdatascience.com](/logistic-regression-in-python-2f965c355b93) [## 支持向量机简介
如何在分类问题中使用 SVM?
towardsdatascience.com](/an-introduction-to-support-vector-machine-3f353241303b) [## K-最近邻算法简介
什么是 KNN?
towardsdatascience.com](/an-introduction-to-k-nearest-neighbours-algorithm-3ddc99883acd) [## 机器学习中的朴素贝叶斯分类器
使用 sklearn 的数学解释和 python 实现
pub.towardsai.net](https://pub.towardsai.net/naive-bayes-classifier-in-machine-learning-b0201684607c) [## 理解机器学习中的决策树
决策树背后的数学以及如何使用 Python 和 sklearn 实现它们
better 编程. pub](https://betterprogramming.pub/understanding-decision-trees-in-machine-learning-86d750e0a38f)
关注此空间,了解更多关于 Python 和数据科学的文章。如果你喜欢看我的更多教程,就关注我的 中LinkedIn推特 。
点击这里成为中等会员:
https://indhumathychelliah.medium.com/membership
Python 中的线性回归:Sklearn vs Excel
内部 AI
对于快速和近似的线性回归预测业务案例,Microsoft excel 是一个好的替代方案吗?我认为是的,但是让我们做一个试金石来确定它。
大约 13 年前, Scikit-learn 开发作为 David Cournapeau 的 f Google Summer of Code 项目的一部分开始。随着时间的推移,Scikit-learn 成为 Python 中最著名的机器学习库之一。它提供了几种分类、回归和聚类算法,在我看来,它的主要优势是与 Numpy、Pandas 和 Scipy 的无缝集成。
在本文中,我将比较 Scikit-learn 和 excel 的多元线性回归的预测精度。Scikit-learn 提供了许多参数(称为估计器的超参数)来微调模型的训练并提高预测的准确性。在 excel 中,我们没有太多的调整回归算法。为了公平比较,我将使用默认参数训练 sklearn 回归模型。
目标
该比较旨在了解 excel 和 Scikit-learn 中线性回归的预测准确性。此外,我将简要介绍在 excel 中执行线性回归的过程。
样本数据文件
为了进行比较,我们将使用 8 年来每天多次测量的 100,000 个降水、最低温度、最高温度和风速的历史读数。
我们将使用降水量、最低温度和最高温度来预测风速。因此,风速是因变量,其他数据是自变量。
培训数据—样本
我们将首先在 excel 上建立并预测风速的线性回归模型。然后我们将使用 Scikit-learn 做同样的练习,最后,我们将比较预测的结果。
Excel 功能区截图
要在 excel 中执行线性回归,我们将打开示例数据文件,并在 excel 功能区中单击“数据”选项卡。在“数据”选项卡中,选择数据分析选项。
提示: 如果看不到“数据分析”选项,那么点击文件>选项>加载项。选择“分析工具库”并点击“Go”按钮,如下图所示
Excel 选项屏幕截图
点击“数据分析”选项,将打开一个弹出窗口,显示 excel 中可用的不同分析工具。我们将选择回归,然后单击“确定”。
将显示另一个弹出窗口,提供独立值和从属值系列。风速(因变量)的 Excel 单元格参考在“输入 Y 范围”字段中提及。在“输入 X 范围”中,我们将提供独立变量的单元格参考,即降水量、最低温度和最高温度。
我们需要选中复选框“Label ”,因为示例数据中的第一行有变量名。
在指定数据后单击“确定”按钮,excel 将建立一个线性回归模型。你可以把它看作是 Scikit-learn 编码中的训练(fit 选项)。
Excel 进行计算,并以漂亮的格式显示信息。在我们的示例中,excel 可以拟合 R 平方为 0.953 的线性回归模型。考虑到训练数据集中有 100,000 条记录,excel 在不到 7 秒的时间内执行了线性回归。除了其他统计信息,它还显示了不同自变量的截距和系数。
基于 excel 线性回归输出,我们可以整理出以下数学关系。
风速= 2.438 +(降水量* 0.026) +(最小温度0.393)+(最大温度0.395)
我们会用这个公式来预测测试数据集的风速,这是 excel 回归模型没有见过的。
例如,对于第一个测试数据集,风速= 2.438+(0.51 * 0.026)+(17.78 * 0.393)+(25.56 * 0.395)= 19.55
此外,我们计算了预测的残差,并绘制了它以了解其趋势。我们可以看到,在几乎所有的情况下,预测的风速都低于实际值,风速越大,预测的误差就越大。
风速实际值与 Excel 线性回归残差散点图
让我们不要在 Scikit-learn 中钻研线性回归。
步骤 1- 我们将导入将要用于分析的包。各个独立变量的值分布在不同的值范围内,并且不是标准的正态分布,因此我们需要 StandardScaler 来标准化独立变量。
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
步骤 2- 将 excel 文件中的训练和测试数据分别读入 PandasDataframe 的 Training_data 和 Test_data 中。
Training_data=pd.read_excel(“Weather.xlsx”, sheet_name=”Sheet1") Test_data=pd.read_excel(“Weather Test.xlsx”, sheet_name=”Sheet1")
我不会关注初步的数据质量检查,如空白值、异常值等。和各自的修正方法,并假设不存在与差异相关的数据序列。
请参考“机器学习监督算法如何识别正确的自变量?"用于自变量选择标准和相关性分析。
步骤 3- 在下面的代码中,我们声明了除“风速”之外的所有列数据为自变量,只有“风速”为训练和测试数据的因变量。请注意,我们不会使用“SourceData_test_dependent”进行线性回归,而是用它来比较预测值。
SourceData_train_independent= Training_data.drop(["WindSpeed"], axis=1) # Drop depedent variable from training datasetSourceData_train_dependent=Training_data["WindSpeed"].copy() # New dataframe with only independent variable value for training datasetSourceData_test_independent=Test_data.drop(["WindSpeed"], axis=1)
SourceData_test_dependent=Test_data["WindSpeed"].copy()
在下面的代码中,独立的训练和测试变量被缩放,并分别保存到 X-train 和 X_test。我们既不需要扩大训练规模,也不需要测试因变量的值。在 y_train 中,保存的从属训练变量不进行缩放。
sc_X = StandardScaler()X_train=sc_X.fit_transform(SourceData_train_independent.values) #scale the independent variablesy_train=SourceData_train_dependent # scaling is not required for dependent variableX_test=sc_X.transform(SourceData_test_independent)
y_test=SourceData_test_dependent
第 5 步- 现在我们将分别输入独立和非独立的训练数据,即 X_train 和 y_train,来训练线性回归模型。出于本文开头提到的原因,我们将使用默认参数执行模型拟合。
reg = LinearRegression().fit(X_train, y_train)
print("The Linear regression score on training data is ", round(reg.score(X_train, y_train),2))
训练数据的线性回归得分与我们使用 excel 观察到的得分相同。
步骤 6- 最后,我们将基于测试独立值数据集来预测风速。
predict=reg.predict(X_test)
基于预测的风速值和残差散点图,我们可以看到 Sklean 预测更接近实际值。
风速实际值与 Sklearn 线性回归残差散点图
在并排比较 Sklearn 和 excel 残差时,我们可以看到,随着风速的增加,这两个模型偏离实际值更多,但 sklearn 比 Excel 做得更好。
另一方面,excel 确实像 sklearn 一样预测了相似的风速值范围。如果近似线性回归模型对您的业务案例足够好,那么要快速预测值,excel 是一个非常好的选择。
实际风速与残差散点图
Excel 可以在相同的精度水平上执行线性回归预测,因为 sklearn 不是本练习的要点。我们可以通过微调参数来大幅提高 sklearn 线性回归预测的准确性,它更适合处理复杂的模型。对于快速和近似的预测用例,excel 是一个非常好的选择,具有可接受的准确性。
Python 中的线性回归——波尔多方程
预测葡萄酒的价格
波尔多红酒在全世界都很受欢迎。Bordeaux 案例研究非常著名地用于使用 r 解释和实现一元和多元线性回归。
线性回归查找数据集可能的最小残差平方和。从这里开始,让自己快速掌握线性回归基础知识。
这篇文章讲述了用一个变量和多个变量创建一个线性回归模型的步骤。然后,我们继续根据 R 平方对模型进行评分。讨论 R 平方的限制,我们探索调整 R 平方作为评估模型的更好分数。我们会遇到相关性和自变量之间的多重共线性以及出现这种情况时该怎么办。最后,我们使用最适合的模型预测值。
目标是:
我们希望根据天气状况等特定因素来预测波尔多葡萄酒的价格。价格本质上将量化葡萄酒的质量。
进口:
下面你将看到使用库组合的 Python 实现:Pandas
、Numpy
、Scikit-learn
、Matplotlib
。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression wine = pd.read_csv("wine.csv")
数据:
wine.shape
告诉我们我们正在处理 25 行 7 列。
Year
:葡萄收获酿酒的年份;
Price
:根据 1990-1991 年拍卖的波尔多葡萄酒平均市场价格的对数;
WinterRain
:冬季降雨量(毫米);
AGST
:生长季平均温度(摄氏度);HarvestRain
:收获降雨量(毫米);
Age
:葡萄酒的年份,以在木桶中储存的年数来衡量;FrancePop
:法国在Year
的人口(以千计)。
wine.info()
:
wine.describe(include="all")
:
wine.head()
:
Price
是我们的因变量,其余是我们用来预测Price
的自变量。Price
量化葡萄酒的品质。
现在我们创建一个一元线性回归模型,根据AGST
预测Price
。
一元线性回归模型:
**# create an instance of the class LinearRegression**
model1 = LinearRegression() **# .values converts the pandas series to a numpy array**AGST = wine.AGST.values.reshape((-1, 1)) **# x-value**
Price = wine.Price.values **# y-value**
x 输入数组需要 2D,更准确地说,需要尽可能多的行数和一列数。因此我们必须reshape
这个数组。reshape((-1,1))
:作为第一个参数的’-1 '让numpy
为您确定结果矩阵中未知的行数。“1”指定一列。输出是一维柱状阵列。
注意:未知数可以是列或行,但不能同时是列和行。
接下来,我们用 x 和 y 值拟合线性回归模型model1
。
model1.fit(AGST, Price)
用.fit()
计算直线 y = mx+c 的最优值,用给定 输入输出(x 和 y)作为自变量。它返回self
,这是变量模型本身。
模型 1 结果:
计算出的回归线的属性,即模型截距和斜率提取如下:
**# the model attributes**intercept = model1.intercept_slope = model1.coef_
y =斜率* x +截距
您会注意到intercept
是标量,slope
是数组。
model1.score(AGST, Price)
输出模型的 R 平方值。r 平方是给定数据与计算出的回归线接近程度的度量。
假设我们的模型(回归线)的形式为 y=mx+c ,R-squared 是平方误差的总和(根据回归线,特定点 x 的实际数据点 y 的值与在该值 x 处的 y 的计算值之间的差值)。
还有另一个“值”可以帮助我们预测模型的质量。这是调整后的 R 平方。
当我们加入更多的自变量时,r 平方总是会增加。因此,R 平方并不是衡量另一个变量是否应该包含在模型中的理想方法。但是 adjusted-R-squared(根据输入变量的个数修正的 R-squared)如果对模型没有帮助的话会 减少 。因此,我们应该为我们创建的每个模型计算调整后的 R 平方,以便进行比较。
调整后的 R 平方公式:
1 — (1-r_sq)*(len(y)-1)/(len(y)-X.shape[1]-1)
在我们的例子中,我们用Price
代替y
,用AGST
代替X
。
adj_r_sq = 1 — (1-r_sq)*(len(Price)-1)/(len(Price)-AGST.shape[1]-1)
我们的结果:
slope = array([0.63509431])
intercept = -3.4177613134854603r_sq = 0.43502316779991984
adj_r_sq = 0.4104589577042642
多元线性回归模型:
我们再加一个自变量→ HarvestRain
。
我们的y-value
保持原样。同样,我们必须reshape
我们的输入变量。一旦整形,我们使用np.concatenate
将两个独立变量合并成一个矩阵。axis = 1
指定它们沿着列轴连接。
var1 = wine.AGST.values.reshape((-1, 1))
var2 = wine.HarvestRain.values.reshape((-1, 1))X = np.concatenate((var1,var2), axis = 1)model2 = LinearRegression()model2.fit(X, Price)
模型 2 结果:
r_sq2 = model2.score(X, Price)
adj_r_sq2 = 1 - (1-r_sq2)*(len(Price)-1)/(len(Price)-X.shape[1]-1)intercept2 = model2.intercept_
slope2 = model2.coef_
我们的结果:
slope2 = array([ 0.60261691, -0.00457006])
**#array[0] corresponds to the coefficient of AGST
#array[1] corresponds to the coefficient of HarvestRain**intercept2 = -2.202653600949956r_sq2 = 0.7073707662049418
adj_r_sq2 = 0.6807681085872093
正如预期的那样,R 平方值增加了。但是看看调整后的 R 平方值——从之前的 0.41 变成了 0.68。这表明将变量HarvestRain
添加到model2
中给了我们一个更好的模型来预测Price
!
我们可以不断添加独立变量,并比较调整后的 R 平方值,以检查模型是变得更好还是更差。但是,在经历每次添加新变量创建新模型的漫长过程之前,我们可以使用 相关性 来计算出哪些变量不需要包含在内。
相互关系
相关性是指一对变量线性相关的程度。它的范围从-1 到+1。+1 表示完美的正线性关系;相关性为-1 表示完全负线性关系,相关性为 0 表示两个变量之间没有线性关系。
让我们找出每个变量之间的相互关系。
wine.corr()
注意 自变量和因变量(Price
)之间有高相关值是好事。当两个独立变量之间高度相关时,问题就出现了。这叫做多重共线性。
注意:“高相关性”指的是相关性的绝对值,因此包括正相关性和负相关性。
注意Year
和Age
是绝对负相关的(-1 相关系数)。这是有道理的,因为葡萄收获的年份越老,葡萄酒的年份就越老。
plt.plot(wine.Age.values, wine.Year.values, ‘o’)
Year
对Age
的曲线图
另外两对高度相关的自变量是Year
& FrancePop
和 Age
& FrancePop
。
由于上述原因,这些相关性也是有意义的。法国的人口FrancePop
,随着每一个Year
而增加。同样,葡萄酒的Age
随着Year
的增加而减少。
由于多重共线性,我们必须去除无关紧要的变量。
为什么?
如果 A 与 B 相关,那么我们不能解释 A 和 B 的系数。要知道为什么,想象一下 A=B(完全相关)的极端情况。然后,型号 y=100 A+50 B 与型号 y=5 A+10 B 或y =-2000A+4000B相同。
不存在最优解。我们必须不惜一切代价避免这些情况。
我们必须从Year
、FrancePop
和Age
中去掉一些独立变量。Year
与FrancePop
和Age
都相关,并且本质上给出与Age
相同的信息。
移除Year
后,我们仍然面临Age
和FrancePop
之间的多重共线性问题。FrancePop
与酒的质量无关。因此,我们保留Age
,这对于我们的模型来说直观上是有意义的,因为越老的葡萄酒通常越贵。
请注意,去掉所有三个- Year
、Age
和FrancePop
将导致我们创建一个缺少一个非常重要特性的模型-Age
。
最终模型:
model3 = LinearRegression()var1 = wine.AGST.values.reshape((-1, 1))
var2 = wine.HarvestRain.values.reshape((-1, 1))
var3 = wine.WinterRain.values.reshape((-1,1))
var4 = wine.Age.values.reshape((-1,1))X = np.concatenate((var1,var2,var3,var4), axis = 1)model3.fit(X, Price)r_sq3 = model3.score(X, Price)
adj_r_sq3 = 1 - (1-r_sq3)*(len(Price)-1)/(len(Price)-X.shape[1]-1)
intercept3 = model3.intercept_
slope3 = model3.coef_
我们的结果:
slope3 = array([ 0.60720935, -0.00397153, 0.00107551, 0.02393083])
intercept3 = -3.4299801869287148r_sq3 = 0.8285662193424285
adj_r_sq3 = 0.7942794632109141
model3
的调整后 R 平方是从model2
的 0.68 到 0.79 的跳跃!看起来棒极了!
你绝对可以尝试创建没有
Age
和FrancePop
的模型,以及没有Age
和有FrancePop
的模型,看看他们得分的差异。
这些预测:
我们期待已久的终于来了。非常感谢您抽出时间来完成这篇文章!
我们对model3
很满意,现在我们想使用这个模型进行预测。
将测试文件读入wine_test
。
wine_test = pd.read_csv(“wine_test.csv”)
wine_test.shape
: 2 行 X 7 列
wine_test.info()
:
先来得到model3
的预测回应:
y_pred = model3.predict(X)
。我们得到了一个预测响应的数组。这是使用AGST
、HarvestRain
、WinterRain
和Age
的给定值,我们用它们创建了model3
。
现在让我们使用wine_test
中的新数据。
var1 = wine_test.AGST.values.reshape((-1, 1))
var2 = wine_test.HarvestRain.values.reshape((-1, 1))
var3 = wine_test.WinterRain.values.reshape((-1,1))
var4 = wine_test.Age.values.reshape((-1,1))X_test = np.concatenate((var1,var2,var3,var4), axis = 1)y_pred_test = model3.predict(X_test)
y_pred_test
给出一个数组,第一个和第二个测试点的值分别为 6.7689 和 6.6849。
查看测试点的给定Price
,我们看到两个测试点的实际价格分别为 6.9541 和 6.4979。这说明我们的预测还是蛮不错的!
我们的测试集非常小,因此我们应该增加测试集的大小,以便对我们的模型更有信心。
参考资料:
线性回归变得简单!
掌握线性回归及其工作原理的虚拟指南——不需要计算机科学、ML 或统计学经验!
马特·拉格兰在 Unsplash 上拍摄的照片
W 当我想学习机器学习,并开始在互联网上搜索介绍性算法的解释和实现时,我大吃一惊。我登陆的每个网站都在解释算法,就像我在阅读某种研究论文一样,一点也不适合初学者!各种各样的术语和方程式被扔来扔去,以为我应该知道它们——而我对此毫无头绪。
通过这篇文章和本系列的其他文章,我将尝试用一种实际的、外行的方法来解释算法及其背后的直觉。不需要任何先验知识!如果在任何时候,你对某个术语或过程感到困惑,不要担心,很可能其他人也有同样的情况。请留下你的回复,我或其他熟悉这个术语的人会帮助你;像往常一样,我们一起踏上学习之旅:)。现在,事不宜迟,让我们开始思考吧!
线性回归背后的直觉
对许多人来说,线性回归被认为是机器学习的“hello world”。这是一个极好的起点,可以突出机器学习的能力以及统计学和计算机科学之间的交叉路口。
一般来说,线性回归用于通过揭示输入特征和数据目标值之间的潜在关系来理解我们所拥有的数据。一旦我们发现了这种关系,我们就有能力对我们以前从未见过的新数据做出预测。还是有点迷茫? 别急 ,我们来举个例子:)
Toa Heftiba 在 Unsplash 上拍摄的照片
让我们跳进一个假设的情况;我和你在寻找一个全新的房子!假设我们想知道在一个特定的社区,一栋普通的房子要花多少钱,你会怎么猜呢?
你可能会权衡大量不同的因素。有些可能是:
- 这所房子有多大?(平方英尺)
- 是哪个州/社区?
- 这个社区的犯罪率是多少?
- 离高速公路和商店有多近?
这份清单还在继续,你还能想出更多吗?
在与一些房地产经纪人交谈并询问您的朋友后,我们发现价格是由三个核心因素决定的:大小、犯罪和与商店/市场的接近度(记住,这是假设…我对房地产一无所知:)。换句话说,使用这三个值,我们应该能够预测任何房子的价值。
既然我们知道是什么决定了房子的价格,我们想揭示这些因素和目标价值之间的潜在关系,在我们的例子中,目标价值就是房子的总价。因此,我们面临这样一个等式:
房价 =(?x 大小 ) +(?x 犯罪 ) +(?x 接近度
从这个等式,我们可以推断出房子的价格是由三个属性决定的。在 ML 术语中,这些属性被称为特征并影响房价(目标值)。显然,每个特征对目标价值/房价的影响并不相同(即,面积对价格的影响可能比该地区的犯罪率更大)。因此,我们必须以某种方式发现房价的多少百分比依赖于每个具体特征并分配一个权重(用表示?)到每个特性。
现在,想象一下在我们发现问号的真实值后我们能做什么。只要给出三个数字,我们就能准确预测任何房子的价格:面积、犯罪率和离商店的距离!换句话说,我们应该已经理解了特性和目标值之间的潜在关系。
你猜怎么着?原来线性回归就是用来做这个的!使用该算法,我们将能够揭示权重,以便我们可以预测看不见的数据的目标值。
让我们快速回顾一下我们刚刚看到的关键术语:
- **特征:**负责预测最终输出的因素
- 目标值:我们想要最终预测的值。这个预测来自于将我们的特征值乘以我们的权重(上面的等式)
- 权重:各因素对预测值的影响量;这些被认为是算法的参数
*那么,我们如何准确地计算出这些权重/参数呢?*很高兴你问了!给你介绍一下我的好朋友,渐变下降。
梯度下降
既然我们已经对什么是线性回归有了一个坚实的理解,那么是时候深入研究*了。*具体来说,我们如何算出线性回归的权重参数?
随着梯度下降,模型的参数在每个“步骤”迭代地改变**,直到我们达到期望的精度。**
PITSTOP: 还记得什么参数吗?如果没有,请参考本部分上面关于关键术语的段落!
比方说,为了初始化我们的参数,我们使用你的母亲,一位前房地产经纪人说的随机值。
让我们用之前的等式代替问号:
房价 = (200 x 大小 ) + (-100 x 犯罪 ) + (1000 x 接近度)
根据你妈妈的说法,离商店的远近是决定房价的最重要的因素(正如分配给邻近特征的最大权重所示)。
请记住,这些数字是我们凭直觉选择的初始值。我们也可以选择完全随机的数字,这样就没问题了。这些初始值将在算法的每一步发生变化,并最终收敛于它们的最优值。
按照我们的类比,假设我们两个和你妈妈一起去参观房子,对于我们看到的每栋房子,我们都会问这些问题:
- 这所房子的面积有多大?
- 周围社区的犯罪率是多少?
- 房子离商店和必需品有多近?
对于第一个问题,我们希望答案是实际的平方英尺,因此代表的尺寸**。**
对于第二个问题,让我们想象一个叫做 VPY (每年受害人数)的假设尺度。这将显示过去一年中相关领域犯罪的受害者人数,并代表我们等式中的犯罪值。
对于我们的第三个也是最后一个问题,让我们假设另一个客观的假设范围,从 1 ( 离商店很远)到 100 ( 离商店很近)。该值将代表我们的接近度值。
德里克·托萨尼在 Unsplash 上拍摄的照片
当我们看到第一栋房子并问你妈妈问题时,她给出了以下回答:
- 这所房子有 3000 平方英尺。ft
- 犯罪率平均为 100 VPY
- 这座房子实际上是在一个偏僻的地方,只有船和飞机可以到达
请记住,因为我们想要根据我们的参数预测房子的价格,所以我们只需要这些值和而不是房子的实际价值**。在预测了房价之后,我们会问你妈妈房子的实际价格是多少,以便进行比较。**
我们的预测值和实际值之间的差异决定了我们的参数/权重的最优程度。梯度下降的任务是最小化这种差异(预测-实际);简单对吗?!
误差 =预测—实际
在文献中,这种差异被称为误差**,因为它表明预测与实际值相比有多不同/错误。**
现在,让我们将答案中的数字代入我们的等式:
=(200 x3000***)+(-100 x100)+(1000 x1)***
经过计算,我们的预测结果是:
房价 预测= 59.1 万美元**
现在,在预测之后,我们问你妈妈,得到房子的实际价格,并计算两个值之间的误差。
房价 实际= 30 万美元**
误差 =预测 — 实际= 59.1 万–30 万= 29.1 万
我们的误差结果是291000。从逻辑上讲,我们的目标是通过改变我们的权重/参数使这个值尽可能小。**
这个误差值在机器学习中还有另一个名字:代价。该值被称为成本,因为成本会使我们与实际值相差一定的量。在这个房屋的例子中,如果我们按照我们的预测行事,如果我们决定以这个价格购买房屋,那么实际上会多花291,000 美元!****
为了确保您理解,错误/成本为 0 意味着什么?
这意味着我们的预测正是实际值,我们的参数是最优的!
现在的问题是,我们究竟应该如何改变权重来最小化我们的成本?我们如何知道增加或减少哪一个?
当然,在这种情况下,我们可以只是直观地增加和减少数字,直到我们达到一个低误差/成本;但是,想象一下如果我们有 100 个特征。我不知道你是怎么想的,但我肯定不想在一百个价值的权重上无所事事!应该有更简单的方法…
同样,我们还有另一个问题:我们得到的误差不能只代表一个房子。因为我们希望我们的改变世界的公式能够代表所有的房子,所以我们希望我们的参数能够在给定三个值任何房子——而不仅仅是一个的情况下做出准确的预测。
由于这个原因,我们必须得到我们想要的一大堆房子的值(大小,犯罪,接近度),把它们代入方程,找出误差,然后分别改变参数。我们得到的房子和数据越多,我们的公式就越能概括!
梯度下降的核心目的是最小化成本函数。通过最小化成本函数( pred — actual ),我们还确保了最低的误差和最高的精度!我们迭代地检查我们的数据集(逐值/逐屋),同时在每一步更新我们的参数。
回到我们的房屋参观类比,回想一下我们有三个参数:大小、犯罪和邻近性。如前所述,我们希望他们在最小化成本函数的方向上改变。查看每个数据点就相当于对我们看到的每栋房子问同样的三个问题,插入这些值以提取误差/成本,并决定下一步应该朝哪个方向走以最小化成本函数。****
现在,终极问题。我们如何决定我们应该朝哪个方向前进以最小化我们的成本?
微积分在这里扭转了局面。通过对成本函数相对于特定变量的导数,我们可以得到我们应该改变变量的方向。
我知道乍一看这听起来极其复杂,但是不要担心!其实挺容易的。通过对特定函数求导,我们能够得到误差的斜率。这个斜率代表误差的方向,我们简单地在那个方向上采取小步骤,以便减少总误差。我们寻找前进的方向,并为我们的每个变量(本例中为三个)前进一步。方向/坡度代表坡度,我们的步代表我们的下降,因此坡度下降!****
假设我们有下面的抛物线,它映射了我们三个函数中每一个函数的成本和权重(总共三个抛物线)。这意味着,在每一步,我们都更接近每个重量的最佳值!
单个参数的成本(J)对权重(W)的映射
PITSTOP: 为了确保您理解,斜率为 0 意味着什么?
这意味着我们对特定变量的权重是最优的,我们不需要采取任何措施来纠正我们的错误!换句话说,我们在抛物线的顶点(看图!).这个点也被称为局部最小值
概括一下,我们现在有了成本函数的导数,代表了我们需要前进的方向。现在我们要做的就是更新每个参数!这是通过以下方式实现的:
大小更新 = 大小旧——(学习率 x 成本函数的导数w/大小)
罪更新 = 罪 旧——(学习率 x 成本函数的导数w/罪)****
接近度 更新= … (你能猜出这个吗?)
这被称为更新规则,并使用它们唯一的偏导数应用于我们所有的参数。我们对每一步(我们看到的每一个数据点)的所有参数应用这个更新规则。
你可能想知道学习率是多少。这表示每个步骤中参数更新的数量。学习率是可配置的,通常在 0 和 1 之间选择一个值;更简单地说,它决定了模型学习的速度:
- 如果学习率太小,模型将花费大量的时间和步骤来收敛于局部最小值
- 如果学习率太高,我们可能会错过最佳值,并且迈得太大
小学习率对大学习率
就像金发姑娘:不太热,不太冷,刚刚好。调优这个超参数对机器学习非常重要!
回顾一下,一次迭代意味着询问关于单个房子的三个问题,并分别更新我们的参数。
在多次迭代我们的数据集之后,当我们到达成本足够低的点(即上面成本抛物线的顶点)时,我们会停下来。
一旦成本低了,我们知道参数是优化的。使用这些针对我们的特征(大小、犯罪和邻近)的优化参数,我们现在能够准确地猜测任何房子的价格,而不用看到价格本身!我们需要做的就是问这三个问题,用我们的最佳重量乘以它们——还有 viola!
这就是**机器在机器学习中学习的:精确预测机器给出的任何东西的最佳参数。****
就是这样!现在你是机器学习和线性回归方面的专家— 也许不是,但这是朝着正确方向迈出的一大步!
结论
现在我们终于完成了,让我们复习一下你学过的所有术语:
- 特征: 它们是什么?
- 目标值: 是什么?
- 权重/参数: 它们是什么,控制什么?
- 渐变下降: 这有助于我们完成什么?
- 误差/成本: 这是怎么算出来的?
- 成本函数的导数: 这提供了什么,如何用它来更新我们的参数?
- 渐变/下降: 我们如何获得渐变?血统是什么意思?
- 局部极小值: 如果我们在梯度下降中处于局部极小值意味着什么?
- 更新规则: 这个什么时候应用?一般公式是什么?
- 学习率: 学习率控制什么?如果太大了会怎么样?太小了?
- 优化: 权重/参数最优是什么意思?
如果你能回答所有这些问题,你就知道了线性回归和梯度下降背后的理论。
如果你不能回答其中的一个问题,继续向前向上滚动和找到答案!这些术语按照它们在文章中出现的顺序列出,出现时也用粗体显示。为了帮助你的读者更容易找到相关信息,你也可以随意突出重要的句子。
既然了解了线性回归,就可以编码了!请继续关注如何从头开始编写完整的线性回归代码,并进行跟踪,这样您就可以准确地知道它何时发布。现在,我希望你学到了新的东西,并希望很快见到你:)
Python 中的模型拟合、相关性、p 值、t 统计、置信区间和可视化
如何将线性回归模型拟合到数据,从模型中推断系数、标准误差、t 统计量和置信区间,以及绘制置信带、方差和单个协变量影响的可视化技术。
来源:Unsplash by 晨酿
线性回归是最常用的回归模型。原因是它使用简单,可以推断出好的信息,并且容易理解。在本文中,我们将讨论线性回归模型对数据的拟合,从中进行推断,以及一些有用的可视化。
要使用的工具:
- Python 编程语言及其一些流行的库。如果您不知道所有这些库,您仍然可以阅读本文并理解其概念。
- Jupyter 笔记本环境。
特征选择
以我的经验来看,最好的学习方法是通过举例。我将使用数据集,并不断解释根据数据拟合模型并推断信息的过程。我正在使用一个名为 NHANES 数据集的调查数据集。这是一个非常好的实践数据集。请随意从以下链接下载数据集:
在 GitHub 上创建一个帐户,为 rashida048/Datasets 开发做出贡献。
github.com](https://github.com/rashida048/Datasets/blob/master/nhanes_2015_2016.csv)
让我们导入包和数据集:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import statsmodels.api as sm
import numpy as npdf = pd.read_csv('nhanes_2015_2016.csv')
这个数据集非常大,我们不需要这篇文章的所有特性。我们将着重于回归模型,其中结果变量将是腰围的大小。如果您想处理任何其他变量,请确保您选择的是定量变量,而不是分类变量。因为线性回归被设计成只预测定量变量而不是分类变量。但是你可以用分类变量作为自变量。检查所有列的名称以了解数据集。
df.columns#Output:
Index(['SEQN', 'ALQ101', 'ALQ110', 'ALQ130', 'SMQ020', 'RIAGENDR', 'RIDAGEYR', 'RIDRETH1', 'DMDCITZN', 'DMDEDUC2', 'DMDMARTL', 'DMDHHSIZ', 'WTINT2YR', 'SDMVPSU', 'SDMVSTRA', 'INDFMPIR', 'BPXSY1', 'BPXDI1', 'BPXSY2', 'BPXDI2', 'BMXWT', 'BMXHT', 'BMXBMI', 'BMXLEG', 'BMXARML', 'BMXARMC', 'BMXWAIST', 'HIQ210'], dtype='object')
所以,只要保留腰围尺寸和一些似乎与腰围尺寸相关的其他变量,并制作一个新的更小的数据框架。仅凭直觉,任何人都会猜测体重可能与腰围大小有很强的相关性。性别、身体质量指数、身高也可能发挥重要作用。因此,为了方便起见,只使用这些列创建一个新的更小的数据帧,并删除任何空值。
keep = ['BMXWT', 'BMXHT', 'BMXBMI', 'BMXWAIST', 'RIAGENDR']
db = df[keep].dropna()
db.head()
线性回归和解释
我们有一个包含五列的数据集:体重、身高、体重指数(身体质量指数)、腰围和性别。如前所述,腰围是输出变量,我们将尝试使用其他变量进行预测。最初,只使用一个变量或一个协变量来预测腰围。体重(BMXWT)可能是一个很好的协变量,因为体重越高,腰围越大。尽管还有其他因素,比如身高或性别。但是我们以后会考虑的。我们将拟合模型,其中腰围将被表示为体重的函数。
model = sm.OLS.from_formula("BMXWAIST ~ BMXWT", data=db)
result = model.fit()
result.summary()
上面这张表对你来说可能看起来很吓人。但是大多数信息对我们来说并不那么重要。我们只需要表格的这一部分:
在第一列,我们有系数。记住线性回归公式:
Y = AX + B
在上表中,42.7189 是 B,0.6991 是我们的 A,我们知道 A 是斜率。所以,我们的斜率是 0.6991。这意味着,如果一个人增加一个单位的体重,他/她的腰围就会增加 0.6991 个单位,这是基于 P>|t|栏中提到的 P 值。接下来,标准误差为 0.005,这表示该估计斜率与真实斜率的距离。t-statistic 表示估计的斜率 0.6991 比零高出 144.292 个标准误差。最后两列是置信水平。默认情况下,置信度为 95%。置信区间是 0.69 和 0.709,这是一个非常窄的范围。稍后我们将绘制一个置信区间带。
db.BMXWAIST.std()
标准偏差为 16.85,似乎远高于回归斜率 0.6991。但是回归斜率是体重每单位变化时腰围的平均变化。也就是说,如果一个人比另一个人超重 10 个单位,他/她的腰围就会增加 0.6991*10 或 6.99 个单位。
相互关系
除了小子表中的这些值之外,结果摘要中还有一个参数很重要。这是结果摘要顶行中的 R 平方值。这里的 R 平方值是 0.795,这意味着 79.5%的腰围可以用体重来解释。现在,用皮尔逊系数的平方来检查这个回归系数。
cc = db[["BMXWAIST", "BMXWT"]].corr()
print(cc)BMXWAIST BMXWT
BMXWAIST 1.000000 0.891828
BMXWT 0.891828 1.000000
要计算 R 平方值:
cc.BMXWAIST.BMXWT**2
这再次返回 0.795 的 R 平方值。最重要的部分,即作为体重函数的腰部尺寸的预测值,可以通过以下方式得到:
result.fittedvalues
这只是结果的一部分。原来的结果要大得多。
让我们添加第二个协变量,看看它如何影响回归性能。我选择性别作为第二协变量。我想使用重新标记的性别栏:
db["RIAGENDRx"] = db.RIAGENDR.replace({1: "Male", 2: "Female"})
下面是模型和模型摘要:
model = sm.OLS.from_formula("BMXWAIST ~ BMXWT + RIAGENDRx", data=db)
result = model.fit()
result.summary()
在上面的代码中,BMXWT + RIAGENDRx 并不意味着这两列是连接的或者数学上相加的。这只是表明它们都包含在模型中。在这个新模型中,腰围被表示为体重和性别的函数。从上面的结果中,我们可以发现权重系数(BMXWT)是 0.7272,比以前高了一点。这一次,该系数意味着,如果同一性别的两个人的体重相差一个单位,他们的腰围将相差 0.7272 个单位。另一方面,性别系数(RIAGENDRx) -5.0832 意味着,如果我们比较相同体重的男性和女性,男性的腰围将比女性小 5.0832 个单位。
所有系数都表示为平均值。如果我们比较一个体重 70 的男人和一个体重 50 的女人,男人的腰围大约会和女人相差-5.0832+(70–50)* 0.7272 倍。
权重回归系数(BMXWT)在模型中加入性别后变化不大。当第二个协变量和第一个协变量有些相关时,添加第二个协变量会改变第一个协变量。让我们检查两个协变量之间的相关性:
db[['BMXWT', 'RIAGENDR']].corr()
如你所见,相关性是-0.2375。所以有相关性但不太强。你可以用我之前展示的拟合值法找到腰围的预测值。我不会再演示了。
我们再加上第三个协变量。我选择 BMXBMI 作为第三个协变量。你也可以尝试一些其他的变量。
model = sm.OLS.from_formula("BMXWAIST ~ BMXWT + RIAGENDRx + BMXBMI", data=db)
result = model.fit()
result.summary()
请注意,添加 BMXBMI 后,性别变量的系数发生了显著变化。我们可以说,身体质量指数正在掩盖腰围和性别变量之间的联系。另一方面,权重系数也发生了显著变化。在腰围和体重的关系中,身体质量指数也起到了掩盖作用。
您可以在模型中添加更多协变量,并查看每个协变量的效果。
模型的可视化
在本节中,我们将可视化回归模型的结果。我们将绘制回归线,它是拟合值或带有置信区间的预测值。如果您需要复习置信区间的概念,请查看这篇文章:
什么是置信区间,如何计算它及其重要特征
towardsdatascience.com](/confidence-interval-calculation-and-characteristics-1a60fd724e1d)
对于这个图,我们将固定性别为女性,身体质量指数为 25。同样,我们需要保留一个自变量作为焦点变量。我们会把它保持为重量(BMXWT)。因此,该图将显示所有年龄的身体质量指数 25 岁女性的预测腰围。
from statsmodels.sandbox.predict_functional import predict_functional
values = {"RIAGENDRx": "Female", "RIAGENDR": 1, "BMXBMI": 25}pr, cb, fv = predict_functional(result, "BMXWT",
values=values, ci_method="simultaneous")#Here, pr is the predicted values(pr), cb is the confidence band and #the fv is the function valuesax = sns.lineplot(fv, pr, lw=4)
ax.fill_between(fv, cb[:, 0], cb[:, 1], color='grey', alpha=0.4)
ax.set_xlabel("BMXWT")
_ = ax.set_ylabel("BMXWAIST")
图中的灰色区域是置信带。这意味着真正的腰围尺寸会落在那个区域。灰色区域的宽度沿回归线变化。所以,置信区间随着年龄不断变化。
您可以固定重量,也可以查看特定重量的结果。让我们将体重固定在 65,并为女性人口绘制身体质量指数与腰围的关系图。我们需要为此更改“值”参数。因为我们把身体质量指数值固定为 25。现在,我们要确定重量。因此,我们需要从 values 参数中删除身体质量指数值,并在其中添加权重。
del values["BMXBMI"] # Delete this as it is now the focus variable
#del values['BMXWT']
values["BMXWT"] = 65
pr, cb, fv = predict_functional(result, "BMXBMI",
values=values, ci_method="simultaneous")ax = sns.lineplot(fv, pr, lw=4)
ax.fill_between(fv, cb[:, 0], cb[:, 1], color='grey', alpha=0.4)
ax.set_xlabel("BMI")
_ = ax.set_ylabel("BMXWAIST")
在上面的图中,我们只画了平均值。给定体重、性别或身体质量指数的平均腰围模型。使用同样的回归模型,也可以评估方差结构,这将显示观察值偏离平均值的程度。为此,我们可以绘制残差与拟合值的关系图。请记住,拟合值是预测值或观察平均值,残差是观察平均值和真实值之间的差值。
pp = sns.scatterplot(result.fittedvalues, result.resid)
pp.set_xlabel("Fitted values")
_ = pp.set_ylabel("Residuals")
看起来,当观察值较低时,方差会稍高一些。
也可以只观察一个协变量的影响。我们可以仅使用一个协变量来查看分量加残差图或部分残差图,以了解我们是否保持其他协变量不变,以及因变量如何变化:
from statsmodels.graphics.regressionplots import plot_ccprax = plt.axes()
plot_ccpr(result, "BMXWT", ax)
ax.lines[0].set_alpha(0.2) # Reduce overplotting with transparency
_ = ax.lines[1].set_color('orange')
现在,当权重变量固定时,我们可以用同样的方式看到身体质量指数的影响。
ax = plt.axes()
plot_ccpr(result, "BMXBMI", ax)
ax.lines[0].set_alpha(0.2)
ax.lines[1].set_color("orange")
身体质量指数的影响比重量大得多。
在本文中,您学习了如何拟合线性回归模型,与线性回归相关的不同统计参数,以及一些好的可视化技术。可视化技术包括绘制回归线置信带、绘制残差和绘制单个协变量的影响。
更多阅读推荐:
如何在 Python 中执行假设检验:一个均值和两个均值的差异
机器学习的线性回归模型
概述最古老的监督机器学习算法,它的类型和缺点。
线性回归是基本的监督机器学习算法之一。虽然它相对简单,与其他机器学习算法相比可能不够花哨,但它仍然广泛应用于各个领域,如生物学、社会科学、金融、市场营销。它非常强大,可以用来预测趋势或产生洞察力。因此,在学习更复杂的 ML 技术之前,彻底了解线性回归——它的工作原理和变体——是多么重要,我怎么强调都不为过。
线性回归模型非常强大,可以用来预测趋势和产生洞察力。
本文的目的是提供一个线性回归模型的全面概述。它将为最后一分钟的修改或开发详细研究线性回归的思维导图提供极好的指导。
注意:在本文中,我们将使用流行的 Boston Housing 数据集,该数据集可以使用 sklearn.datasets 直接导入到 Python 中,或者使用库 MASS(现代应用统计函数)导入到 R 中。代码块是用 r 编写的
什么是线性回归?
线性回归是一种统计/机器学习技术,它试图对独立预测变量 X 和相关定量响应变量 y 之间的线性关系进行建模。预测变量和响应变量必须是数值,这一点很重要。一般的线性回归模型在数学上可以表示为
线性回归模型方程;作者图片
由于线性回归模型通过捕捉不可约的误差项来近似 Y 和 X 之间的关系,我们得到
带有近似值的线性回归模型方程;作者图片
这里,我们将使用线性回归来预测波士顿周围 506 个社区的中值房价(Y/响应变量= medv)。
线性回归揭示了哪些真知灼见?
使用线性回归预测中值房价将有助于回答以下五个问题:
- 预测变量和响应变量之间存在线性关系吗?
- 预测变量和反应变量之间有联系吗?有多强?
- 每个预测变量如何影响响应变量?
- 响应变量的预测有多准确?
- 自变量之间有交互作用吗?
线性回归模型的类型
根据预测变量的数量,线性回归可分为两类:
- 简单线性回归-一个预测变量。
- 多元线性回归-两个或多个预测变量。
线性回归模型的简单性可以归功于它的核心假设。然而,这些假设在模型中引入了偏差,导致过度泛化/欠拟合(更多关于偏差-方差权衡)。
一个容易记住的线性回归模型的假设的首字母缩略词是直线
线性回归模型的假设
LINE——一个简单的缩写词,包含线性回归模型的四个假设。
- L 线性关系:预测器&响应变量之间的关系是线性的。
- 独立观测值:数据集中的观测值是相互独立的。
- 残差的正态分布。
- 误差/残差具有恒定的方差:也称为同方差。
简单线性回归
一个简单的学习回归模型使用单个预测变量 x 来预测响应变量 Y。对于波士顿住房数据集,在分析中值住房价值/ medv 列和 12 个预测列之间的相关性后,带有几个相关列的 medv 散点图如下所示:
图 1:波士顿住房数据集的散点图;作者图片
在观察散点图时,我们注意到 medv 和 rm(平均房间数)几乎成线性关系。因此,它们的关系可以表示为
中位数价格预测广义方程;作者图片
目标是通过估计尽可能接近 506 个数据点的拟合系数来拟合线性模型。预测值和观察值之间的差异是误差,需要将其最小化以找到最佳拟合。最小化误差的最小平方的一种常用方法是普通最小二乘法(OLS 法)。
要在 R 中创建一个简单的线性回归模型,运行下面的代码块:
simpleLinearModel <- lm(medv ~ rm, data = Boston)
让我们看看合身的模型,
plot(rm ,medv)
abline(simpleLinearModel, col = ‘red’)
图 2:拟合训练数据的简单线性回归线;作者图片
使用 RSE,R,adjusted R,F-statistic 评估线性回归模型的准确性。
模型摘要(下图)告诉我们有关系数的信息,并有助于使用以下指标评估模型的准确性
- 剩余标准误差
- r 统计量
- 调整后的 R 平方
- f 统计量
量化模型与训练数据的吻合程度。
print(summary(simpleLinearModel))
图 3:简单线性回归模型汇总;作者图片
如何解读简单线性回归模型?
使用简单的线性回归来预测中值房价,我们可以回答以下问题:
- RM&medv 之间有关联吗?有多强?
medv 和 rm 之间的关联及其强度可以通过观察对应于汇总表中 F 统计量的 p 值来确定(图 3)。由于 p 值非常低,medv 和 rm 之间有很强的相关性。
- RM 如何影响 medv?
根据这个简单的线性回归模型,房间数量的单位增加导致中值房价增加 9.102 万美元。
- 响应变量的预测有多准确?
RSE 估计了 medv 与真实回归线的标准偏差,该值仅为 6.616,但表明误差约为 30%。另一方面,R 表明在 medv 中只有 48%的可变性是由 rm 解释的。调整后的 R & F 统计量是多元线性回归的有用度量。
- 房屋价值中位数(medv) &房屋的房间数(rm)之间存在线性关系吗?
除了使用图 1 来确定 medv 和 rm 之间的几乎线性关系外,如果不存在模式,图 3 所示的残差图有助于确定线性关系。因为有一个小的模式,它表明在关系中有一个非线性成分,尽管有点弱。
图 4:用平滑线识别趋势的残差图;作者图片
多元线性回归
多元线性回归模型试图对两个或多个预测变量和响应变量之间的线性关系进行建模。一个人想到的最重要的问题是
“如何选择有用的预测变量?”
这就是所谓的回归变量选择可以通过使用:
- 最佳子集选择
- 逐步选择—向前、向后、混合
有很多其他方法可以达到这个目的。通过使用逐步向前选择,我发现除了年龄和印度河流域以外的所有预测变量对预测 medv 都很重要。
#Variable selection using stepwise regression
nullmodel <- lm(medv ~ 1, data = Boston)
fullmodel <- lm(medv ~ ., data = Boston)#Forward Stepwise Selection
mulitpleLinearModel <- step(nullmodel, scope = list(lower = nullmodel, upper = fullmodel), direction = "forward")
如何解读多元线性回归模型?
使用简单的线性回归来预测中值房价,我们可以使用模型的摘要来回答以下问题:
图 5:多元线性回归模型汇总;作者图片
- 预测变量子集& medv 之间有关联吗?有多强?
由于与汇总表(图 5)中的 F 统计值相对应的 p 值非常低,因此预测变量子集与 medv 之间有很强的相关性。
- 各种预测变量如何影响 medv?
根据这个多元线性回归模型,每个预测变量与 medv 都有很强的相关性,可以通过使用简单的线性模型来辨别确切的贡献。
- 响应变量的预测有多准确?
调整后的 R 会对添加到模型中的其他预测变量造成不利影响,而不会对其进行改善,这与 R 相反,R 会随着添加到模型中的每个变量而增加。由于两者之间的差异不大,我们可以推断该模型比简单的线性回归模型更准确,后者只能解释 48%的 medv 变异性,而多元线性回归可以解释 74%的 medv 变异性。
线性回归模型的潜在问题
看了线性回归模型,它的类型和评估,重要的是承认它的缺点。由于线性回归模型的假设,有几个问题困扰着线性回归模型,例如:
- 共线性(如何处理多重共线性)
- 残差的相关性
- 残差的非常数方差/异方差
- 极端值
- 非线性关系
关于如何处理这些问题的文章正在编写中。
Github 上探索简单/多重/多项式线性回归、预测因子的非线性转换、逐步选择的项目:
参考
R 中的统计学习导论。
线性回归模型:机器学习
了解用于预测分析的机器学习中的线性回归模型
BY anscombe . SVG:https://commons.wikimedia.org/w/index.php?curid=9838454 史高斯(使用下标标注):Avenue — Anscombe.svg,CC BY-SA 3.0,
线性回归是机器学习中最重要的回归模型之一。在回归模型中,必须预测的输出变量应该是连续变量,例如预测一个人在一个班级中的体重。
回归模型也遵循监督学习方法,这意味着要构建模型,我们将使用带有标签的过去数据,这有助于预测未来的输出变量。
线性回归
使用线性回归模型,我们将预测两个因素/变量之间的关系。我们所期待的变量叫做因变量。
线性回归模型有两种类型:
- 简单线性回归:它只包含一个自变量,我们用一条直线来预测因变量。
- 多元线性回归,包括一个以上的独立变量。
在本文中,我们将集中讨论简单的线性回归模型。
简单线性回归
我们有一家公司的数据,其中包含营销支出金额以及与该营销预算相对应的销售额。
数据看起来像这样,
示例营销数据
从这里下载以上 excel 数据。
使用 Microsoft Excel 图表,我们可以为上述数据制作一个如下所示的散点图。
上述数据的散点图
上面的图表示根据给定数据的所有数据点的散点图。现在,我们必须通过数据点拟合一条直线,这有助于我们预测未来的销售。
我们知道直线被表示为:
y = mx + c
在这里,我们称这条线为回归线,它表示为:
Y = β0 + β1X
现在,可以有这么多的直线可以通过数据点。我们必须找出可以作为模型的最佳拟合线,以用于未来的预测。
为了在所有线中找到最佳拟合线,我们将引入一个称为残差(e)的参数。
残差是 Y 轴的实际值和基于特定 x 的直线方程的 Y 轴预测值之间的差值。
假设我们有散点图和直线,如下图所示,
作者提供的图片-使用图表计算残值
现在,使用上图,x = 2 的残值为:
Residual(e) = Actual value of Y — the predicted value of Y using the line
e = 3–4 =-1
所以,x = 2 的残差是-1。
类似地,我们对每个数据点都有一个残差值,它是实际 Y 值和预测 Y 值之间的差值。
ei = yi — y^i
所以,为了找出最佳拟合线,我们将使用一种叫做普通最小二乘法或残差平方和(RSS)法的方法。
RSS = e1²+e2²+e3²+……+en²
最佳拟合线的 RSS 值最小。
价值函数
通常,机器学习模型为特定问题定义成本函数。然后,我们试图根据我们的要求最小化或最大化成本函数。在上面的回归模型中, RSS 是成本函数;我们想降低成本,找出直线方程的β0 和β1。
现在,让我们回到 excel 表格中的营销数据集。对上面的散点图使用Trendline
中的Linear Forecast
选项,我们将直接得到散点图的最佳拟合线,无需手动计算残差值。
使用 Microsoft Excel 散点图选项的最佳拟合线
我们可以看到,
斜率(β1) = 0.0528
截距(β0) = 3.3525
让我们使用上面的直线方程计算所有数据点(X)的预测销售额(Y)。
预计销售额将会是,
使用 (y=0.0528x+3.33525) 公式预测销售额
之后,让我们也计算每个数据点的残差平方值。
残差平方=(实际 Y 值-预测 Y 值)
应用上述公式计算残差平方后,我们来看 excel 表。
计算残差平方后的数据集
现在,RSS 是上表中所有剩余平方值的总和。
RSS = 28.77190461
因为这是最佳拟合线,所以我们在这里得到的 RSS 值是最小值。
如果我们在这里观察 RSS 值,它是一个绝对量。在未来,如果我们改变以十亿而不是百万来衡量销售的问题设置,RSS 数量将会改变。
因此,我们需要定义一个相对的替代度量,而不是绝对的量。这种替代措施被称为**总平方和(TSS)。**使用 TSS,我们将计算 R 值,这将决定模型是否可行。
TSS = (Y1-Ȳ)² + (Y2-Ȳ)² + (Y3-Ȳ)² + ……. + (Yn-Ȳ)²
其中,
Y1,Y2,Y3,……,Yn 是来自数据点的值。
ȳ是 y 轴柱的平均值
现在,在计算 TSS 之后,我们将计算 R .
R² = 1-(RSS/TSS)
r 值总是介于 0 和 1 之间。
如果 R 接近 1,那么我们的模型是优秀的,我们可以用模型来预测分析。如果该值接近 0,则该模型不适合于预测分析。
现在,让我们计算 excel 数据集中的 TSS。
首先,我们将找出每个数据点的(yn-ȳ)值,ȳ(平均 y 值)是 15.564705888881
现在,数据集看起来像,
使用 Y 值和所有 Y 值的平均值计算平方和
TSS =数据集中所有平方和的总和
TSS = 297.5188235
因为我们已经计算了上面的 RSS。我们来求出 R 的值,
R = 1-(RSS/TSS) = 0.903293834。
如果我们观察散点图,上面是最佳拟合线,下面是直线方程,excel 已经计算出 R 值为 0.9033,这是我们使用所有计算得到的值。
由于 R 值大于 90%,因此强烈建议使用该模型来预测未来的分析。
结论
回归模型是机器学习中的基本模型之一。使用这个模型,我们可以预测变量的结果。如果输出变量是分类的,我们将使用另一种称为分类模型的模型。
在下一篇文章中,我们将看到如何在 Python 中使用线性回归模型。
感谢您阅读和快乐编码!!!
在这里查看我以前关于 Python 的文章
- 联接、视图和 cte:MySQL 工作台
- 数据分析使用基本命令:MySQL Workbench
- 探索性数据分析(EDA): Python
- 中心极限定理(CLT):数据科学
- 推断统计:数据分析
- Seaborn:Python
- 熊猫:蟒蛇
- Matplotlib:Python
- NumPy: Python
参考
- 用于机器学习的线性回归:https://machinelingmastery . com/Linear-Regression-for-Machine-Learning/
- 线性回归:https://ml-cheat sheet . readthedocs . io/en/latest/Linear _ Regression . html
- 实现机器学习的线性回归:https://www . edu reka . co/blog/Linear-Regression-for-Machine-Learning/
- 什么是机器学习中的线性回归:https://www . knowledge hut . com/blog/data-science/Linear-Regression-for-Machine-Learning