概括
理解多重线性回归的应用 , 潜在问题和评估模型拟合的方法 , 是更复杂机器学习方法的核心
学习了如何在Python中构建多元线性回归模型,这实际上与您在简单线性回归的上一课中所做的非常类似。
学习了如何编码虚拟变量,并解释附加到每个变量的系数。
了解了更高阶项,以及它如何影响您解释系数的能力。
学习了如何识别在多元线性回归模型中需要交互的含义,以及如何识别其他更高阶项。但同样,这些确实使得解释系数不再是优先考虑的事情,而是将模型转向一个更倾向于以解释为代价进行预测的模型。
了解了模型假设,我们仔细研究了多重共线性。您了解了方差膨胀因子,以及多重共线性如何影响模型系数和标准误差。
1 简介
上节课你学习了如何在简单线性回归中 , 使用单个解释变量预测反应变量
In this lesson, you will be extending your knowledge of simple linear regression, where you were predicting a quantitative response variable using a quantitative explanatory variable. That is, you were using an equation that looked like this:
在这节课中你将继续学习这一内容 , 你将学习如何利用多个输入预测反应变量 , 其中包括定量变量和分类变量
In this lesson, you will learn about multiple linear regression. In these cases, you will be using both quantitative and categorical x-variables to predict a quantitative response. That is, you will be creating equations that like this to predict your response:
此外,您将学习如何评估多元线性回归中可能发生的问题,如何解决这些问题,以及如何评估模型的执行情况。事实证明,Rsquared可以使用,但可能会产生误导。并且,遗憾的是,相关系数只是两个定量变量之间线性关系的度量,因此在多元线性回归的情况下它不会非常有用。
这里有一个很好的额外资源:统计学习简介全文。这是一本非常壮观的机器学习入门书。
具体来说,第3章讨论了本课程中的许多想法。文本中执行的编程在R中,但我们将继续在本课程中使用Python。
2 多元线性回归
假设你正打算投资买房 , 特别是想购买一栋 , 你认为物超所值的房屋 , 我们收集了近期满足你需求的在售房屋信息
这是你收集到信息的表格 房屋价格 , 三类社区 A B 和 C , 房屋建筑面积 , 卧室数量 , 卫生间数量和风格 , 包括平房 维多利亚式别墅和林间小屋
在上节课中 , 你学会如何使用 , 其中一项定量内容 预测房屋价格 , 但是如果我们想要使用所有这些内容会如何呢? , 如果是这些列呢? , 使用斜率 7 乘以街区 A , 或者维多利亚风格 这意味着什么?
实际上 我们使用线性代数 , 同时使用所有这些输入预测 y 值 , 这样做可以创建一个输入矩阵
所以利用这里的值我们可以创建想要预测的响应矢量 , 这个矩阵通常用符号表示为大写 X , 响应矢量用 Y 表示 , 为了区分之前看到的符号 , 这些符号都用黑体表示
为了真正掌握 , 多重线性回归的所有内容和原理 , 你需要了解这些矢量和矩阵如何共同运行.
如果您需要线性代数复习,请在下面列出另外两个资源!
可汗学院的线性代数免费课程,以便您需要复习。
本课程中课外教材中的线性代数和NumPy进修课程。
3
实际上你可以熟练进行拟合 , 多重线性回归模型和解释这些模型的结果 , 我们来看一个例子 , 这是个类似的数据集 , 上节课你见到的房屋数据集 可以从资源中获取 , 在接下来的概念中还会继续使用
现在我已经写出合适的库和数据集 , 现在为了拟合线性模型 , 我们首先创建一个截距 , 然后再次使用上节课的 statsmodels , 但是我们需要把所有变量加入的 X 部分列表中 , 所以这里增加截距 , 我们想要预测价格 , 在右侧这里 , 我们需要增加所有定量变量 , 如果要增加分类变量 , 你会注意到 , 存储为 LM 表示线性回归 , 我们可以拟合模型
如何在多元线性回归中找到“正确”系数
在简单线性回归部分中,了解了我们对如何使每个实际数据点与模型中预测值之间的平方距离进行最小化感兴趣。
但在多元线性回归中,我们实际上所处理的数据点不仅仅是二维空间的点。
For a full derivation of how this works, this article provides a break down of the steps.
5
我们可以将每个系数解释为解释变量中每一个单位增加的响应的预测增加,使模型中的所有其他变量保持不变。
但是,通常,系数可能是正数或负数。因此,每个系数是解释变量中每一个单位增加的响应的预测变化,使模型中的所有其他变量保持不变。
这种解释非常类似于您在上一课中看到的简单添加短语“保持所有其他变量不变”,这意味着只有附加到系数的变量会发生变化,而所有其他变量保持不变。
6 虚拟变量
所以你发现把分类解释变量添加到 X 矩阵 , 无法像添加定量变量一样顺利 , 除了把这样的列添加到 X 矩阵中 , 这些列包含值 街区 A B C 等 , 我们最后要创建所谓的虚拟变量 , 编码虚拟变量可以采用多种方式 , 但是最常见的是编码为 0 和 1
原理:
我们为这一列每个值创建一列 , 对于每一列 , 如果列中存在值 则为 1 否则是 0 , 所以我们可以为 A 值创建这样一列
然后我们为 B 值创建的一列 , 可以像是这样 , 最后一列是这样的 , 你要对添加到数据集中的每个分类变量 , 采用这种方法 , 由于最后一列是根据前两列推算出来的 , 并且值 1 只存在于 , 列中不包含 1 的行
也就是说其中任意一列与其他两列有相关性, 可以用其他两列表示.
我们实际上最终要舍弃这一列 , 舍弃哪一列实际上并没有太大影响 ,
总结:
我们在多元线性回归模型中添加分类变量的方法是使用虚拟变量(dummy variable)。添加虚拟变量的最常见方式是通过1,0编码。在此编码方法中,您为类别的每个级别(在本例中为A,B或C)创建新列。然后我们的新列保持1或0,具体取决于原始列中是否存在级别。
当我们将这些虚拟变量添加到我们的多元线性回归模型时,我们总是丢弃其中一列。您删除的列称为基线(baseline)。从多元线性回归模型的输出中获得的系数则表明编码水平与基线水平(水平下降)的比较。
Text: Dummy Variables
The Math Behind Dummy Variables
In the last video, you were introduced to the idea the way that categorical variables will be changed to dummy variables in order to be added to your linear models.
Then, you will need to drop one of the dummy columns in order to make your matrices full rank.
If you do not drop one of the columns when creating the dummy variables, your solution is unstable and results from python are unreliable. You will see an example of what happens if you do not drop one of the dummy columns in the next concept.
The takeaway is...when you create dummy variables using 0, 1 encodings, you always need to drop one of the columns to make sure your matrices are full rank (and that your solutions are reliable from python).
The reason for this is linear algebra. Specifically, in order to invert matrices, a matrix must be full rank (that is all the columns need to be linearly independent). Therefore, you need to drop one of the dummy columns, to create linearly independent columns (and a full rank matrix).
quiz
对于其他变量,您将获得截距加上4个虚拟变量,总共5个系数。
7
现在我们练习一下把虚拟变量添加到线性模型中
首先我们加载必要的库和数据 , 为了创建虚拟变量 , Pandas 提供了一种实用方法 叫做 get_dummy
, 通过谷歌快速搜索可以得到这个文档
如果传递街区(neighborhood)一列
你会发现得到 A , B 和 C 其中这里有三个 B , 发现这里有三个 1 然后这有一个 A , 所以我们看到这个 1 表示 A , 其他 0 表示其余这些列 , 我们存储为输出结果 A , B C
正如你在之前练习所见 , 只使用线性模型中的分类列无法起作用 , 我们来看一下 , 使用虚拟变量和线性回归模型能不能更成功 , 这里我已经创建了街区
然后采用相同方式创建风格 , 分类变量总是以字母顺序呈现 , 按照字母顺序首先出现的 , 也会首先返回到列中 , 所以在你看到这个前 我们不能直接把这些虚拟变量传递到线性回归模型中 , 我们再次尝试使用这些虚拟变量
记住你总是要舍弃其中一列 , 你舍弃的这列称为基准类别 , 我们来舍弃维多利亚一列 只使用另外两列 , 这样我们舍弃这一列 使用这两列 , 同样我们创建基准为 A B 和 C , 添加到线性模型时舍弃其中一个
解释
You can look at the p-values to compare to neighborhood A. In order to compare neighborhood B to neighborhood C, you can compare the confidence intervals. Since the confidence intervals for B and C do not overlap, we have have evidence they differ as well.
为了创建只使用房屋的线性模型 我们可以这样做 , 我们将要预测价格 , 增加一个截距 , 然后是在模型中 , 我得到这个截距 , 所以这里你看到我们成功几率更大 , 这里我们拟合模型 , 最终可以看到包含摘要指令的结果
这个截距表明如果房屋是维多利亚风格 , 预测价格为 1,046,000 美元 , 林间小屋的价格比维多利亚房屋低 741,000 美元
同样 平房的价格比维多利亚房屋低471,000 美元 , 这些与基准类别形成对比 , 可以得出对基准类别的估算
quiz
解释
8
不过 还有一种编码虚拟变量的方法 , 也在编程语言中非常常见 称为 SAS , 在 SAS 中编码默认值是 1 0 和 -1 , SAS 是健康等相关领域中非常流行的编程语言 , 值得注意的最大不同点在于 它可以改变 , 你从模型中得到的系数 , 和对这些系数的解释方式 , 使用 0 和 1 编码时 , 对比系数和基准分类 进行解释 , 不过如果使用 0 1 和 -1, 你的系数是与平均数做对比 而不是整体
9
构建多重线性回归模型时 , 会出现许多问题 , 但是发现哪些方面成为问题 , 取决于你模型的用途
你将要利用模型了解变量 x 和 y 如何具有相关性吗? , 你将要利用模型较好地预测反应变量吗? , 还是想要发现 , 哪个变量对预测反应变量有用处呢? , 每个问题都可能存在一些相应的问题 , 根据你最感兴趣的方面 , 这有利于决定哪些问题是你想要解决的
在《统计学习导论》中 , 提到了下列问题
- 第一反应变量和预测变量之间可能不存在线性关系
- 第二 可能具有相关性误差
- 第三 可能不具有误差的常数方差
- 第四 可能具有破坏模型的离群值或杠杆点
- 最后可能存在更多的线性度
附加材料
模型假设以及如何解决每个问题
以下是在统计学习导论中提到的前一个视频中提到的五个假设:
- 反应变量 - 预测变量关系的非线性
- 误差项的相关性
- 非常数方差和正态分布误差
- 异常值/高杠杆点
- 共线性
本文概述了如何识别这些问题是否存在,以及如何解决这些问题。在即将到来的概念中,我们将更加密切地关注我认为应该得到更多关注的特定点,但在下面您将看到对每个主题的更详尽的介绍。让我们仔细看看这些项目。
线性
线性假设是线性模型是您的响应和预测变量之间真正存在的关系。如果不是这样,那么您的预测将不会非常准确。此外,与系数相关的线性关系实际上也没有用。
在本页底部的图像中,这些被认为是偏向模型。理想情况下,我们希望看到点的随机散布,如图像中的左上角残差图。
误差相关性
当我们的数据随着时间的推移收集时(例如预测股票价格或未来的利率)或数据在空间上相关(如预测洪水或干旱地区),经常会出现误差相关。我们通常可以通过使用过去数据点(时间)或附近点(空间)的信息来改进我们的预测。
不考虑相关误差的主要问题是,您通常可以利用此相关性来更好地预测未来事件或事件在空间上彼此接近。
识别是否存在相关误差的最常用方法之一是基于收集数据的域。如果您不确定,有一项称为Durbin-Watson测试的测试,通常用于评估误差的相关性是否是一个问题。然后通常实施ARIMA或ARMA模型以使用该相关性来做出更好的预测。
非常数方差和正态分布误差
非常数方差是指预测值的差异取决于您尝试预测的值。就预测而言,这不是一个大问题。但是,它确实会导致置信区间和p值不准确。系数的置信区间对于实际值更接近预测值的区域而言太宽,但对于实际值更接近预测值的区域而言太窄。
通常,日志(或响应变量的一些其他变换)是为了“摆脱”非常数方差。为了选择转换,通常使用Box-Cox。
可以使用残差图通过预测值再次评估非恒定方差。在页面底部的图像中,非常数方差被标记为异方差。理想情况下,我们需要一个具有同方差残差的无偏模型(在整个值范围内保持一致)。
虽然文本没有讨论残差的正态性,但如果您有兴趣创建可靠的置信区间,这是回归的一个重要假设。此处提供了有关此主题的更多信息。
异常值/杠杆点数
异常值和杠杆点是远离数据常规趋势的点。这些要点会对您的解决方案产生很大影响。在实践中,这些点甚至可能是拼写错误。如果要汇总来自多个源的数据,则可能是某些数据值未正确传输或未正确聚合。
其他时候异常值是准确和真实的数据点,不一定是测量或数据输入错误。在这些情况下,“固定”更主观。通常,使用这些要点的策略取决于分析的目标。特别地,使用普通最小二乘的线性模型不是非常稳健。也就是说,大的异常值可能会大大改变我们的结果。有一些技术可以解决这个问题 - 主要称为正规化技术。这些超出了本课程的范围,但在机器学习的免费课程中会很快讨论它们。
共线性(多重共线性)
多重共线性是指变量之间彼此相关的预测变量。多重共线性的一个主要问题是它可能导致系数从我们期望的简单线性回归方向翻转。
识别多重共线性的最常见方法之一是使用双变量图或使用方差膨胀因子(或VIF)。这是我们将在下一个概念中深入探讨的主题,因此我们不会在此花费太多时间。
10 多重线性回归模型与方差膨胀因子(或VIF)
多重线性回归模型的主要假设之一 , 是我们的预测变量彼此不相关
我们希望预测变量与反应变量相关 , 而不是彼此之间具有相关性
在这个例子中 我们要观察房屋的特点, 你可以假设房屋大小 , 卧室数量 , 卫生间数量都存在相关性
我们可能认为房屋越大 拥有越多的卧室和卫生间 , 我们使用 seaborn 快速观察一下 , 每对变量之间的关系 , 这里你可以看到我读取 seaborn
为 sb
,
Seaborn 包含的 pairplot
, 可以让我们观察每个变量之间的关系 , 这里我想要观察这三个 x 变量之间的关系 , 即面积 卧室和卫生间
可以看到这些关系 , 彼此之间具有极强的正相关 , 所以你可以发现卫生间和 , 面积具有很强的正相关 , 面积和卧室之间 , 卧室和卫生间之间也是如此
现在我们使用者三个系数 , 试着拟合多重线性回归模型 , 首先我们通常要创建截距 , 我运行 statsmodels
简写为 sm
, 那么我将要这样拟合 sm.OLS
所以我们要预测的内容 , 是“价格” 使用截距 , 和所有这些 x 变量 , 然后我们把它存储在线性模型中
有意思的是 , 虽然我们希望面积 , 卧室和卫生间与反应变量存在相同的关系 , 即随着它们增加 反应变量也应该增加 , 但卧室与反应变量存在负系数
如上图虽然价格和卧室与其他变量存在正相关 , 但是在多重线性回归模型中 两者呈现负相关 , 对这一系数的解释与我们直觉上认为的是相反的, 在双变量例子中实际上为真 , 这是模型中多重共线性的一个潜在副作用 , 即这与你认为是正确的系数恰好相反
另一个常见的方式是辨别预测值之间是否具有相关性 , 除了我们看到的散点图 , 还有方差膨胀因子 简写为 VIF
这里的dmatrices
矩阵是我们从 patsy
中读取的 , 可以让我们创建 x 和 y 的方程式 , 方程式可以得到矩阵
从 statsmodels
中 我们计算得出每个 x 变量的方差膨胀因子 , 然后我们传递到方差膨胀因子函数中 , 方差膨胀因子可以写入 statsmodels , 利用截距得到价格 , 以及面积 卧室和卫生间
我们可以看到每个变量的方差膨胀因子 , 都可以从我创建的方差膨胀因子DataFrame中获取 , 我们想要删除两个变量中的至少一个 , 因为两者方差膨胀因子都大于 10 , 在接下来将继续讨论这一话题
11 多重共线性和VIF
在前面的例子中你见到 , X 变量之间具有相关性 , 这会导致回归系数与预期关系的反转 , 和不准确的假设检验结果 , 我们希望 X 变量与 Y 相关
但是 X 变量之间具有相关性时 这些结果具有误导性
发现多重线性的两种方式
分别是散点图矩阵和方差膨胀因子 , 或简写为 VIF
快速检查是否具有较大的方差膨胀因子 , 一般规则是如果方差膨胀因子大于 10** , 那么你的模型就会出现多重线性 ,
特定变量的方差膨胀因子可以通过下面的公式得到
其中 R 的平方通过 , 所有其他 X 变量预测出的 X 变量 R 的平方计算得到 , 所以如果 X 与其他变量高度相关 那么这部分增加 , 就会减少整个分母 增加其方差膨胀因子
你可以认为模型中很少发现只有一个较大的方差膨胀因子 , 因为两个或以上 X 变量之间彼此相关 , 你会认为这些变量具有较高的方差膨胀因子 , 解决回归中彼此相关的变量, 最常见的方法是 删除最小兴趣的变量
如果删除浴室列
R平方值并没有发生变化
重新计算VIF值后
结论
去除浴室的数量并没有损害模型的预测能力,并且仍然提高了系数的可解释性。
总结
我们希望x变量与响应相关,但不要彼此相关。 当我们的x变量彼此相关时,这被称为多重共线性。多重共线性有两个潜在的负面影响。
当存在多重共线性时,x变量和响应之间的预期关系可能不成立。也就是说,可能期望解释变量和响应之间存在正相关关系(基于双变量关系),但在多元线性回归情况下,它会将关系视为负数。
我们的假设检验结果可能不可靠。事实证明,具有相关的解释变量意味着我们的系数估计值不太稳定。也就是说,与回归系数相关的标准偏差(通常称为标准误差)非常大。因此,特定变量可能对预测响应很有用,但由于它与其他x变量的关系,将不再看到此关联。
我们还研究了识别多重共线性的两种不同方法:
我们可以看一下每个解释变量与每个其他解释变量的相关性(用图或相关系数)。
我们可以查看每个变量的VIF
当VIF大于10
时,这表明多重共线性肯定是模型中的一个问题。一些专家甚至认为大于5
的VIF可能会有问题。在大多数情况下,不仅一个VIF很高,而且很多VIF都很高,因为它们是相关变量如何相互作用的度量。
在多元线性回归模型中使用相关解释变量的最常用方法是简单地删除与其他变量最相关的变量之一。选择一个您不感兴趣或对您不重要的解释变量是一种常见的选择。
12高阶项
要想拟合类似于非线性模型的模型 , 可以通过在模型中增加高阶项 如交叉项 , 二次式 三次多项式和高阶值
虽然这些高阶项可以让你较好地预测反应变量 , 我一般避免使用这类条目 , 除非在数据中明确观察到存在关系 , 增加这些项会使解释数据的结果更加复杂 , 对低阶项的解释 , 如建筑面积的斜率 , 或者分类变量水平的斜率 , 如果这些项为高阶项时 解释起来不那么简单
如何识别高阶项?
In a model with no higher order terms, you might have an equation like:
Then we might decide the linear model can be improved with higher order terms. The equation might change to:
In general, these terms can help you fit more complex relationships in your data. However, they also takeaway from the ease of interpreting coefficients, as we have seen so far. You might be wondering: "How do identify if I need one of these higher order terms?"
当创建具有二次,三次或甚至更高阶变量的模型时,我们基本上在查看解释变量和响应变量之间的关系中有多少条曲线。
如果有一条曲线,如下图所示,那么您将需要添加二次曲线。显然,我们可以看到一条线不适合这种关系。
然后,如果我们想要添加一个三次关系,那是因为我们在解释变量和响应变量之间的关系中看到两条曲线。下图显示了这方面的一个例子。
13
我们试着把一些高阶项添加到你的模型中 , 现在你可以发现他们如何起作用 以及确定何时使用
有时我们会拟合模型 , 即使反应变量与解释变量并没有线性相关性 , 我们可以使用所谓的高阶项完成 , 高阶项包括二项式 , 三项式 交叉项和其他许多关系 , 为了把这些项添加到线性模型中 , 我们只需要把列乘以另一列
这里我们创建了卧室数量的二次关系 , 通过卧室所有值的平方 , 或列乘以列 , 我们存储为卧室的平方 , 我们把这些高阶项添加到模型中 , 也需要加入低阶项, 我们来使用卧室和卧室的平方来预测价格
这里我们可以观察到结果 , 注意 添加二项式表明我们不会采取之前相同的方式解释卧室相关的系数 , 即系数并不是随着卧室增多所预测的价格也发生变化 , 因为改变bedrooms
和这一项, 也表明二项式bedrooms_squared
中发生变化 , 所以价格改变取决于卧室的初始和最终数量 , 卧室数量从 3 个变为 4 个时价格的变化 , 与从 5 个变为 6 个时价格的变化不一样 , 所以无法简单解释这些项
我们也可以向数据集中添加这样的三项式 , 这里我命名为bedrooms_cubed
卧室的立方 , 然后像这样添加到模型中, 然后我们得到立方后的结果
然后我们来观察下结果 , 这里你会发现 R 平方实际上只增加了一点 , 不过加入卧室的立方值并不是很大的数字 , 认为卧室的立方值与价格具有相关性 , 并不恰当
另外下面每个系数都不能很好地得到解释 , 现在我们来看一下交叉项 , 交叉项是通过两个变量相乘得到的
我们来创建面积和卧室数量之间的交互项 , 然后把它添加到这个数据集的DataFrame中 , 现在为了把交叉项添加到模型中 , 我们应该再次添加低阶项 , 这意味着把面积和卧室数量都添加到线性模型中 , 既然卧室数量已经包含在模型中 , 我这里添加面积和交叉项
14
每次把高阶项或交叉项添加到模型中 , 你应该确保添加各自的低阶项
在我们观察反应变量和解释变量之间关系的曲线时 , 你又如何认识到应该添加交叉项呢? 为什么我们要向模型中添加这样的内容呢?
添加交叉项 , 就是这些斜率非常接近一致的问题 , 如果斜率接近一致 , 我们不需要添加交叉项 , 不过如果斜率不相同 , 表明我们需要向模型中添加交叉项
交互项
在数学上,通过将两个变量相互相乘并将该项添加到我们的线性回归模型来创建交互。
The example from the previous video used area (x1) and the neighborhood (x2) of a home (either A or B) to predict the home price (y).
此示例不涉及交互项,如果变量的关系类似于下图中的关系,则此模型是合适的。
b1是我们估计面积和价格之间关系的方式,在这个模型中我们认为无论neighborhood
邻域如何都是相同的。
然后b2是价格的差异取决于你所在的neighborhood社区,这是两条线之间的垂直距离:
Notice, here the way that area is related to price is the same regardless of neighborhood.
AND
The difference in price for the different neighborhoods is the same regardless of the area.
When these statements are true, we do not need an interaction term in our model. However, we need an interaction when the way that area is related to price is different depending on the neighborhood.
在数学上,当区域与价格相关的方式取决于neighborhood邻域时,这表明我们应该添加交互。通过添加交互,我们允许每个neighborhood邻域的线的斜率不同,如下图所示。在这里,我们添加了交互,你可以看到这允许这两个斜率的差异。
These lines might even cross or grow apart quickly. Either of these would suggest an interaction is present between area and neighborhood in the way they related to the price.
概括
理解多重线性回归的应用 , 潜在问题和评估模型拟合的方法 , 是更复杂机器学习方法的核心
学习了如何在Python中构建多元线性回归模型,这实际上与您在简单线性回归的上一课中所做的非常类似。
学习了如何编码虚拟变量,并解释附加到每个变量的系数。
了解了更高阶项,以及它如何影响您解释系数的能力。
学习了如何识别在多元线性回归模型中需要交互的含义,以及如何识别其他更高阶项。但同样,这些确实使得解释系数不再是优先考虑的事情,而是将模型转向一个更倾向于以解释为代价进行预测的模型。
了解了模型假设,我们仔细研究了多重共线性。您了解了方差膨胀因子,以及多重共线性如何影响模型系数和标准误差。