普通最小二乘法
因为这种方法求最小平方和,所以也称为普通最小二乘法(OLS)。在Python中,有两种主要的方法来实现OLS算法。
SciKit Learn:只需从Sklearn包中导入线性回归模块并将模型与数据匹配即可。这个方法非常简单,您可以在下面看到如何使用它。
from sklearn.linear_model import LinearRegressionmodel = LinearRegression() model.fit(data.drop('sales', axis=1), data.sales)
StatsModels:另一种方法是使用StatsModels包来实现OLS。Statsmodels是一个Python包,允许对数据执行各种统计测试。我们将在这里使用它,以便您可以了解这个很棒的Python库,因为它将在后面的部分中对我们有帮助。
建立模型并解释系数
# Importing required libraries import pandas as pd import statsmodels.formula.api as sm# Loading data - You can give the complete path to your data here ad = pd.read_csv("Advertising.csv")# Fitting the OLS on data model = sm.ols('sales ~ TV + radio + newspaper', ad).fit() print(model.params) 输出 Intercept 2.938889 TV 0.045765 radio 0.188530 newspaper -0.001037
Scikit Learn运行回归模型是最简单的方式,并且可以使用模型找到上面的参数。coef_ & model.intercept_。
现在我们有了这些值,如何解释它们呢?
- 如果我们确定电视和报纸的预算,那么增加1000美元的广播预算将导致销售增加189个单位(0.189*1000)。
- 同样地,通过固定广播和报纸,我们推断电视预算每增加1000美元,产品大约增加46个单位。
- 然而,对于报纸预算来说,由于系数几乎可以忽略不计(接近于零),很明显报纸并没有影响销售。事实上,它在0的负的一边(-0.001),如果幅度足够大,可能意味着这个代理是导致销售下降。但我们不能以如此微不足道的价值做出这种推断。
如果我们仅使用报纸预算与销售进行简单的线性回归,我们将观察到系数值约为0.055,这与我们上面看到的相比是非常显著的。为什么会这样呢?
共线性
ad.corr()
让我们用热图把这些数字形象化。
import matplotlib.pyplot as plt %matplotlib inline> plt.imshow(ad.corr(), cmap=plt.cm.GnBu, interpolation='nearest',data=True) > plt.colorbar() > tick_marks = [i for i in range(len(ad.columns))] > plt.xticks(tick_marks, data.columns, rotation=45) > plt.yticks(tick_marks, data.columns, rotation=45)
这里黑色的方块表示相关性很强(接近于1),而较亮的方块表示相关性较弱(接近于0)。这就是为什么所有的对角线都是深蓝色的,因为一个变量与它自己是完全相关的。
值得注意的是报纸和广播的相关性是0。35。这表明报纸和广播预算之间的关系是公平的。因此,可以推断出→当产品的广播预算增加时,在报纸上的花费也有增加的趋势。
这称为共线性,指的是两个或多个输入变量是线性相关的情况。
因此,尽管多元回归模型对报纸的销售没有影响,但是由于这种多重共线性和其他输入变量的缺失,简单回归模型仍然对报纸的销售有影响。
我们理解了线性回归,我们建立了模型,甚至解释了结果。到目前为止我们学的是线性回归的基础。然而,在处理实际问题时,我们通常会超越这一点,统计分析我们的模型,并在需要时进行必要的更改。
预测因子的假设检验
在运行多元线性回归时应该回答的一个基本问题是,至少有一个预测器在预测输出时是否有用。
我们发现,电视、广播和报纸这三个预测因子与销售额之间存在不同程度的线性关系。但是,如果这种关系只是偶然发生的,并且没有因为任何预测因素而对销售产生实际影响呢?
该模型只能给我们数字,以在响应变量和预测因子之间建立足够紧密的线性关系。然而,它无法证明这些关系的可信性。
我们从统计数据中获得帮助,并做一些被称为假设检验的事情。我们首先建立一个零假设和一个相应的备择假设。
因为我们的目标是找到至少一个预测器在预测输出时是否有用,所以我们在某种程度上希望至少有一个系数(不是截距)是非零的,这不仅仅是由于随机的机会,而是由于实际原因。为此,我们首先形成一个零假设:所有系数都等于零。
多元线性回归的一般零假设
广告数据的零假设
因此,备择假设是:至少有一个系数不为零。通过发现有力的统计证据来拒绝原假设,从而证明了这一点
假设检验采用F-statistic进行。这个统计数据的公式包含残差平方和(RSS)和总平方和(TSS),我们不需要担心这一点,因为Statsmodels包会处理这个问题。我们在上面拟合的OLS模型的总结包含了所有这些统计数据的总结,可以用这行简单的代码得到:
print(model.summary2())
如果F-statistic的值等于或非常接近1,那么结果是支持零假设的,我们不能拒绝它。
但是我们可以看到,F-statistic比1大很多倍,因此为零假设(所有系数都为零)提供了有力的证据。因此,我们拒绝原假设,并相信至少有一个预测器在预测输出时是有用的。
注意,当预测因子(p)的数量很大,或者p大于数据样本的数量(n)时,f统计量是不合适的。
因此,我们可以说,在这三家广告代理商中,至少有一家在预测销售额方面是有用的。
但是哪一个或哪两个是重要的呢?它们都重要吗?为了找到这一点,我们将执行特征选择或变量选择。一种方法是尝试所有可能的组合。
- Only TV
- Only radio
- Only newspaper
- TV & radio
- TV & newspaper
- radio & newspaper
- TV, radio & newspaper
在这里,尝试所有7种组合仍然是可行的,但是如果有更多的预测因子,组合的数量将呈指数增长。例如,通过在我们的案例研究中再增加一个预测因子,总组合数将变为15。想象一下有一打预测器。因此,我们需要更有效的方法来执行特性选择。
特征选择
做特征选择的两种最流行的方法是:
正向选择:我们从一个没有任何预测器的模型开始,只使用截距项。然后,我们对每个预测器执行简单的线性回归,以找到最佳执行器(最低RSS)。然后我们添加另一个变量,并再次通过计算最低的RSS(残差平方和)来检查最佳的2变量组合。然后选择最佳的3变量组合,以此类推。当满足某种停止规则时,停止该方法。
逆向选择:我们从模型中的所有变量开始,然后删除统计意义最小的变量(更大的p值:检查上面的模型摘要,找到变量的p值)。重复此操作,直到达到停止规则为止。例如,我们可以在模型分数没有进一步提高的时候停止。
在这篇文章中,我将介绍向前选择方法。首先,让我们了解如何选择或拒绝添加的变量。
我们要使用2种方法来评估我们的新模型:RSS和R²。
我们已经熟悉RSS,它是残差平方和,通过将实际输出和预测结果之间的差平方来计算。它应该是模型表现良好的最小值。R²方差的程度的测量数据是用模型来解释。
数学上,它是实际结果和预测结果之间相关性的平方。R²接近1表明模型是好的和解释方差数据。接近于零的值表示模型很差。
# Defining a function to evaluate a model def evaluateModel(model): print("RSS = ", ((ad.sales - model.predict())**2).sum()) print("R2 = ", model.rsquared) 让我们首先使用单个预测器逐个评估
模型,从TV开始。
# For TV model_TV = sm.ols('sales ~ TV', ad).fit() evaluateModel(model_TV)
RSS = 2102.5305831313512
R^2 = 0.611875050850071
# For radio model_radio = sm.ols('sales ~ radio', ad).fit() evaluateModel(model_radio)
RSS = 3618.479549025088
R^2 = 0.33203245544529525
# For newspaper model_newspaper = sm.ols('sales ~ newspaper', ad).fit() evaluateModel(model_newspaper)
RSS = 5134.804544111939
R^2 = 0.05212044544430516
我们观察到model_TV, RSS和R²最小值是最在所有的模型。因此,我们选择model_TV作为向前基础模型。现在,我们将逐个添加广播和报纸,并检查新值。
# For TV & radio model_TV_radio = sm.ols('sales ~ TV + radio', ad).fit() evaluateModel(model_TV_radio)
RSS = 556.9139800676184
R^2 = 0.8971942610828957
正如我们所看到的,我们的价值观有了巨大的进步。RSS下降和R²进一步增加,model_TV相比。这是个好兆头。现在我们来看看电视和报纸。
# For TV & newspaper model_TV_radio = sm.ols('sales ~ TV + newspaper', ad).fit() evaluateModel(model_TV_newspaper)
RSS = 1918.5618118968275R^2 = 0.6458354938293271
报纸的加入也提高了报纸的价值,但不如广播的价值高。因此,在这一步,我们将继续电视和广播模型,并将观察当我们添加报纸到这个模型的差异
# For TV, radio & newspaper model_all = sm.ols('sales ~ TV + radio + newspaper', ad).fit() evaluateModel(model_all)
RSS = 556.8252629021872
R^2 = 0.8972106381789522
这些值没有任何显著的改进。因此,有必要不添加报纸,并最终确定模型与电视和广播作为选定的功能。所以我们最终的模型可以表示为:
在3D图形中绘制变量TV、radio和sales,我们可以可视化我们的模型如何将回归平面与数据匹配。