四行代码搞定多元回归分析,教你预测未来
全文共6200字,预计学习时长30分钟或更长
有没有想过拥有预测未来的能力?
也许你想要根据偶然获得的信息来评估股票的表现如何。或者你想要得知洗澡频次、养猫的数量多少和你的寿命长短是否存在关联。
你还有可能想要弄清一天之内给母亲打电话超过三次的人是谁,一个对他人称呼为“哥们”的人和一个从未自己做过家务的人与高于平均离婚率之间是否有联系。
![](http://n4.ikafan.com/assetsj/blank.gif)
如果你确实想要得知这些问题,那么多元回归分析正可以帮助到你。
多元回归分析由于分析多种信息之间存在的联系而十分有趣。它不只是简单地分析事物和另外一件事物的关联——就像简单线性回归那样,而是可以帮助你处理许多不同事物和你想要预测事物之间的关系。
线性回归模型是一种数据模型,经常适用于数据科学,也是机器学习中的一个基础构建块。多元回归分析(MLR)是一种数据技术,可以使用一些变量来预测不同变量的结果。其旨在建造自变量和因变量之间的线性关系。它展现了多种自变量如何与一种因变量相关联。
简单线性回归用于只有一个自变量和一个因变量的情况下。而多元回归分析适用于具有多种不同的自变量的情况。
多元回归分析有以下三大主要用途:
· 查看自变量对因变量的影响强度。
· 检测当自变量发生变化时因变量会发生何种程度的改变。
· 推测趋势和未来值。
让我们先来做一个试验吧。
我们将把事物极度简化以便理解多元线性回归存在意义。当然真实世界中情况可能会更加复杂。
![](http://n4.ikafan.com/assetsj/blank.gif)
如何开始?
假设你正在为风险投资家工作。
若现在你拥有五十家公司的信息数据库和五列数据,其中包含了公司在管理、研发、市场、各公司所在的州位置和今年利润的有关信息。由于数据库是匿名的,我们无法从中得知这些公司的名称以及其它识别信息。
而你需要去分析这些数据并且建立模型,告知老板哪家公司最值得在未来进行投资。简而言之,老板需要根据公司去年的利润来做出决策。也就是说,利润是因变量,其他的因素就是自变量。
所以你需要根据现有的其他数据去研究因变量(利润)。
然而老板并不是真正想要投资这些公司。事实上,他想要把数据库中包含的信息作为样本,在含有相同信息前提下,来帮助理解哪家公司在未来会表现更佳。
他是想要在研发上投资呢还是在市场上投资?他想要投资位于伊利诺斯州的公司吗?你的职责是帮助他建立一套指南,让他可以说出类似于以下的话:“我有兴趣投资纽约州的那家公司,因为它在管理上的开销很少,而在研发上的开销则比较大。”
你需要建立一个模型,从而让他可以评估在哪里投资哪些公司可以最大化其利润。
需要记住的是,因果关系和相关性不可混为一谈。不能说一方引起了另一方的发生,而是自变量和因变量息息相关。
以下假定都必须验证正确:
· 自变量和因变量之间存在线性关系。
· 自变量之间联系不紧密。
· 因变量的观察是独立且任意的。
· 回归残差通常是分布的。
在运行建立模型之前,你需要查看这些假定是否正确。我们完全跳过了这一步。但是在现实世界中请确保这样做,不要盲目地跟随本教程。建立回归时,这些假定要正确。
![](http://n4.ikafan.com/assetsj/blank.gif)
虚拟变量
如果你对虚拟变量的概念不甚了解,请查看有关数据清理和数据预处理的文章。其中含有的代码比较简单,我们可以进行复制粘贴操作。
之前已经确定因变量(y)是“利润”,而其他影响因素都成为了自变量(X)。同时,我们需要搭建一个线性回归模型。那么如何处理状态列呢?“状态”是分类变量,而不是数值变量,而我们需要的是数值变量绝非是一些单词。如何处理这些情况呢?
![](http://n4.ikafan.com/assetsj/blank.gif)
创建虚拟变量吧!
查看位置栏中的信息,你可能会发现所有检视的公司都处于两种状态。为了解释得更加清楚,我们可以说数据库中的所有公司不是位于纽约就是在明尼苏达州。也就是说我们需要把这一栏信息分成分别含有许多1和许多0的两列信息。
那么该如何自动添加这些数据栏呢?一般来说,我们会将每一个状态变为其自身的栏。如果一个公司坐落于纽约,它就会在“纽约“这栏上有一个1,而在”明尼苏达州”这栏填写0。如果你使用了更多种状态,你会在“纽约”这栏有一个1,而在“加利福尼亚州”、“伊利诺斯州”、“阿肯色州“ 等其它州所在栏里标注为0。我们不会再使用原来的”地址“栏,因为我们不会再需要它了。
这些1和0就像灯的开关:1意味着“开“或者”好“;0意味着“关”或者“不好”。
留心虚拟变量陷阱
你永远不会希望在同一时间包括这两种变量。
为什么呢?
你会复制变量。第一个变量(d1)等于1减去第二变量(d2)。(d1=1-d2)当用一个变量去预测另一个变量时,就叫做多重共线性。结果就是你搭建起来的模型不会区分d1和d2分析所得结果。你不可能同时得到常量和两个虚拟变量。如果你有九个变量,请包含八个变量。(如果你有两组虚拟变量,你需要为每一组变量做这样的操作。)
![](http://n4.ikafan.com/assetsj/blank.gif)
什么是假定值(P-value)?
熟知假定值的概念是迟早的事。
假定值就是在原假设为真的前提下,得到与数据相同或者更为极端的可能性的值。假定值为含有奇怪的数据的样本的提供了了价值。如果你有一个很大的假定值,也许不会产生和原假定不同的想法。如果假设为真,那么一个很大的假定值也就意味着得到像你这样的样本就不足为奇了。当假定值开始变小,你需要扪心自问,重新思考自己的想法甚至否定原假设。
原假设是对于处于试验中假设的一个官方称号。它处于默认位置,与测试组之间没有联系。在每一个实验中,你都在寻找测试组间的效果。不幸的是,这些组之间总有可能没有效果(或者说没有不同)。而没有不同点就被叫做原假设。
这就像你在试验一种无效的药物一样。在试验中,服用该药物的人和其他人群所差无几,那么将没有差异。
你总是假设原假设为真,直到你有证据证明它不是。
让我们继续!
我们需要找出想要保留和想要丢弃的列。如果你只是把一些数据胡乱塞进模型,这样做不太好。这也不值得信赖!
![](http://n4.ikafan.com/assetsj/blank.gif)
多元线性回归
以下是建立多元线性回归模型的五个方法:
1. 利用所有数据建模,并期待得到最佳结果。
2. 后向消除。
3. 向前选择变量法。
4. 双向消除。
5. 成绩比较。
你一定也有听说过回归分析。回归分析常是双向消除(方法四)的另一种说法。有时人们也用它来指代方法二、三、四的结合体。(这也是双向消除的深层意思)
方法一(投掷数据法):
这当然不是官方给定的方法名(但应该可以这么说。)有时候你需要搭建一个模型用于投掷所有变量。你可能有一些先验经验,也有可能有需要使用的特定模型。你可能是被老板指派这样做的,也有可能只是为后向消除做铺垫。这的确是一个选择, 所以我将它囊括于此。
方法二(后向消除):
基本步骤:
1. 首先,你需要为数据设置一个显著水平,比如说你可能会想要设定一个5%的显著性水平(SL=0.05)。这很重要,并且会带来真实的影响,因此设置时需要慎重思考。
2. 然后,使用所有可能的预测变量来拟合整个模型。
3. 你需要考虑最高假定值的预测变量。如果最高假定值大于显著性水平,转至第四步。否则,结束预测。
4. 移出所有最高假定值的预测变量。
5. 在没有预测变量的情况下拟合模型。如果只删除了变量,你需要重新构建和拟合模型。系数和常数不尽相同,当你删除其中一个则会影响其他变量。
6. 回到步骤3,重复执行此操作直到最高假定值小于SL。此时,模型完成。所有剩余变量都小于显著性水平.
(在我们理解完这些概念后,本文将介绍一个向后消除的例子,从而方便你们看到其实际效果!这的确令人感到困惑,但如果你切身看到其发生,你就会明白。)
方法三(向前选择变量法):
这比起简单反向消除更为复杂。
1. 选择你的显著性水平。(SL=0.05)
2. 拟合所有可能的简单回归模型,并且选择最低假定值模型。
3. 保持此变量并拟合所有可能模型,在已有模型中添加一个额外预测变量。如果我们选择一个带有一个变量的简单线性回归量,现在我们需要选择带有两个变量的。也就是所有可能的两种变量线性回归。
4. 找到具有最低假定值的预测变量。如果P<SL,回到第三步。如果没有,那就结束。
当P不再小于SL,或者没有更多的假定值小于显著性水平时,我们可以停止。因为这意味着该变量不再显著。我们不需要保留当前的模型,而是保留前一个,因为在最终模型中,变量无关紧要。
方法四(双向消除):
这一方法是前面两种的结合!
1.选择输入的显著性水平和保留的显著性水平。(SLENTER=0.05, SLSTAY=0.05)
2. 在添加新变量的位置执行向前选择变量法的下一步。需要让假定值小于SLENTER。
3. 现在执行反向消除的所有步骤。变量必须具有小于SLSTAY的假定值才能保持不变。
4. 现在回到第二步,然后继续前进到第3步,依此类推,直到没有可以输入的新变量,并且没有新变量输出。
任务完成。
方法五(得分比较):
下面我们分析所有可能的方法,并对他们的得分进行比较,这绝对是最费资源的方法!
1. 选择衡量拟合优良性的标准(例如,赤池信息量准则)
2. 建立所有可能的回归模型
3. 选择拟合优良性最好的那一个
一个有趣的事实:如果有10列数据,你将会有1023个模型。如果要继续下去,你最好全身心投入!
如果你刚开始机器学习、统计或者数据科学的学习,那这似乎需要编写大量的代码。但其实不是!
你需要完成的很多事情都会由机器学习模型中的那些神奇的库来实现。你只需要完成那些困难的部分,其中包括决定哪些是重要信息以及你想使用的模型是什么。你还需要解释产生的结果,并与他人交流你的成果。然而,代码本身是非常可行的。
向后消元法是最快也是最好的方法,本文将展示建立了快速简单的多元线性回归模型之后的成果。
首先,准备好数据集。假设有一个叫做“startups.csv”的CSV文件,里面包含了之前谈到的信息。总共有50个公司,列名有研发支出、行政支出、营销支出以及公司所在的州(比如纽约州、明尼苏达州和加利福尼亚州),还有一列是去年的利润。
导入库是很好的选择。
毫无疑问,我们想把数据集的名字改成自己的。把它命名为'startups.csv’,还将调整一些其他的小细节。利润(y)仍是最后一列,所以将继续用[:,:-1]删除这一列的利润。我们将做一些调整,用[:,4]获取自变量。现在有一个因变量(y)的向量和一个自变量矩阵,它包含除了利润(X)之外的所有信息。我们想看看这两者之间是否存在线性依赖关系!
dataset = pd.read_csv('startups.csv')X = dataset.iloc[:, :-1].valuesy = dataset.iloc[:, 4].values
现在我们需要对分类变量进行编码。可以使用标签编码器和一个热编码器来创建虚拟变量。你将再次在[:,3]和[:,3]两个位置更改列的指数,并在热编码器中替换指数。
完成了!之前的一列信息现在变成了三列,每一列对应一个州!
如何避免虚拟变量陷阱?实际上,有了我们的库,你不需要这样做。我们选择使用的库会为你解决。如果你想要或需要运行该代码,也很简单,在对数据进行编码之后,用一行代码便可实现。
X=X[:, 1:]
这是用来干什么的?它可以从X中移除第一列。1意味着我们要选取从指数1开始到末尾的所有列。你不会选第一列。对于某些库,需要手动删除一列,以确保数据集不会包含冗余。
现在我们可以将数据分成训练数据和测试数据。最常见的分割方法是80/20分割,即80%的数据用于训练模型,20%的数据用于测试。让我们开始吧!
如何进行特征缩放呢?
在这里不需要进行特征缩放,库会为我们解决。
![](http://n4.ikafan.com/assetsj/blank.gif)
多元线性回归时间!
从Scikit-Learn中输入线性回归。
from sklearn.linear_model import LinearRegression
现在要引入回归量。创建一个类别为LinearRegression的对象,并将该对象与训练集相匹配。我们想要把它应用到X_train和y_train中。
现在来测试多元线性回归量的表现吧!
(在这里不会绘制图表,因为我们需要五个维度来进行绘制。如果你对用一个简单线性回归量绘制图表感兴趣,可阅读这篇关于构建一个简单线性回归量的文章。)
创建预测向量(y_pred),可以使用回归量和预测方法来预测测试集(X_test)的观测值。
y_pred = regressor.predict(X_test)
完成了!四行代码便构建了一个多元线性回归量!
现在可以看到十个预测的利润!只需要输入print(y_pred)就可以随时打印它们。通过观察预测值,并将它们与实际结果进行比较,可以很容易地比较它们。仔细观察会发现有些预测极其准确,其余的也相当不错。做得很好!
因变量和自变量之间肯定存在某种线性关系。这两者之间有很强的线性关系也显而易见。
恭喜!现在你知道如何用Python构建一个多元线性回归量了!
想继续吗?
事情将变得更具挑战性!
有些变量对因变量有很大影响,而如果有些变量造成的影响在统计上不显著呢?我们可以确定哪些变量对因变量的影响最大。我们要找一组有明显影响的变量,无论影响是正面的还是负面的。
让我们使用向后消元法吧!
![](http://n4.ikafan.com/assetsj/blank.gif)
向后消元法
我们需要为向后消元法做一些特定的准备。我们想要一个库统计模型,因此输入statsmodel .formula.api。这有点长,必须多次输入,所以使用简写sm。
我们需要在自变量的特征矩阵中加上一列1,这是因为它和常数之间的作用方式。(模型需要考虑常数b0。大多数库都包含它,但使用的统计模型中没有。我们将添加一列1,以便统计模型正确理解公式。)
这很简单。我们将使用.append。
有特征矩阵X。多值参数对我们来说是完美的,因为它是一个数组。我们将输入一个由50行和1列组成的矩阵,其中1列是1。可以用Numpy的np.ones创建它。我们需要指定想要的行数和列数(50,1)。为此需要将数组转换为整数类型,因此使用.astype(int)。然后需要决定是添加一行还是一列(line = 0, column = 1),因此在一列中写入axis = 1 !
若希望这一列位于数据集的开头,要如何实现呢?把矩阵X加到有50个1的列上,而不是反过来。可以用values= X来做到。
X = np.append(arr = np.ones((50, 1)).astype(int), values = X, axis = 1)
一起来做吧!
我们想要创建一个最佳特征的新矩阵(X_opt)。这些特征在统计上是显著的,并且对利润有很大影响。这个矩阵将包含一组最佳特征,且特征对利润影响很大。
对矩阵进行初始化,将统计上不显著的变量逐一剔除。我们将通过在每一步删除指数来做到这一点。首先取X中所有列的指数,用逗号分隔[0,1,2,3,4,5]。
回顾前面的方法,你将知道首先需要选择前面谈到的显著性级别。然后需要符合模型。
我们不打算用自己构建的回归量,正在使用一个新的库,所以现在我们需要符合未来的最优矩阵。创建一个新的回归量(最后一个来自线性回归库)。新类别将是普通最小二乘法(OLS)。我们需要调用该类别并指定一些参数。(你可以在这里查看官方文件。)对于参数,我们需要一个endog(我们的因变量)和一个exog(我们的X_opt,它只是带有截距的特征矩阵(X),默认情况下不包括它)。为了符合矩阵,我们将使用.fit().
现在我们完成了X_opt的初始化。
现在来看看P值!如何寻找P值最高的预测指标?将使用回归量对象并调用.summary()函数。
regressor_OLS.summary()
我们可以看到一个表,其中包含一些与模型相关的有用信息!可以看到调整后的R平方值和P值。P值越低,自变量相对于因变量来说就越重要。这里,要找的是P值最高的。这很容易找到。
![](http://n4.ikafan.com/assetsj/blank.gif)
现在要删除它!
可以从上面复制粘贴代码并删除指数2。就像这样:
重复操作,直到没有任何P值高于你选择的SL值为止。要记得你总想查看原始矩阵,以便选择正确的指数!你使用的是原始矩阵(X)中的列,而不是X_opt中的列。
你可能会得到一个P值,它非常接近你选择的SL值。例如,我们选择的是0.050,这里的P值是0.060。
![](http://n4.ikafan.com/assetsj/blank.gif)
这是一个艰难的情况,因为你选择的值可以是任何值。如果你想完全遵循准则,你需要删除该指数。但是,还有其他度量标准可以帮助我们更好地理解是否想这样做。我们可以添加其他度量标准,来帮助我们决定是否真的想做出那个选择。这的总结中也还有很多信息,例如R平方值可以帮助我们做决定。
![](http://n4.ikafan.com/assetsj/blank.gif)
可以说我们一直向后消元,最后只剩下研发支出列的指数。
X_opt = X[:, [0, 1, 3, 4, 5]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()regressor_OLS.summary()X_opt = X[:, [0, 1, 3, 5]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()regressor_OLS.summary()X_opt = X[:, [0, 3, 5]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()regressor_OLS.summary()X_opt = X[:, [0, 3]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()regressor_OLS.summary()
如果我们一直认真地遵循模型,现在就会知道,研发支出是因变量的一个重要预测指标!结论是,数据中能够预测利润且影响最大的只有一类:研发支出。
![](http://n4.ikafan.com/assetsj/blank.gif)
你做到了!你使用了多元线性回归和向后消元,你可以发现,研究开发支出会让你更好地预测一家公司的利润。
![](http://n4.ikafan.com/assetsj/blank.gif)