📜  使用 statsmodels 的普通最小二乘法 (OLS)

📅  最后修改于: 2022-05-13 01:54:41.427000             🧑  作者: Mango

使用 statsmodels 的普通最小二乘法 (OLS)

在本文中,我们将使用 Python 的statsmodels模块来实现线性回归的普通最小二乘( OLS ) 方法。
介绍 :
线性回归模型将因变量 ( y ) 和至少一个自变量 ( x ) 之间的关系建立为:
\hat{y}=b_1x+b_0
OLS方法中,我们必须选择b_1  b_0  这样,y 的计算值和观测值之差的总平方和被最小化。
OLS 公式:
S=\sum\limits_{i=1}^n (y_i - \hat{y_i})^2 = \sum\limits_{i=1}^n (y_i - b_1x_1 - b_0)^2 = \sum\limits_{i=1}^n (\hat{\epsilon_i})^2 = min
在哪里,
\hat{y_i}  = 第 i 个观测值的预测值
y_i  = 第 i 个观测值的实际值
\epsilon_i  = 第 i 个观测的误差/残差
n = 观察总数
获取的值b_0  b_1  最小化 S,我们可以对每个系数进行偏导,并将其等同于零。
使用的模块:

  • statsmodels :为许多不同的统计模型的估计提供类和函数。
pip install statsmodels
  • pandas:用于数据操作和分析的库。
  • NumPy:数组计算的核心库。
  • Matplotlib:用于创建静态和交互式图形和可视化的综合库。

方法 :

  • 首先我们定义变量xy 。在下面的示例中,变量是使用pandascsv文件中读取的。示例中使用的文件可以在这里下载。
  • 接下来,我们需要添加常量b_0  使用add_constant()方法到方程。
  • statsmodels.api模块的OLS()函数用于执行 OLS 回归。它返回一个 OLS 对象。然后在该对象上调用fit()方法以将回归线拟合到数据中。
  • summary()方法用于获取一个表格,该表格对回归结果进行了广泛的描述

代码:

Python3
import statsmodels.api as sm
import pandas as pd
 
# reading data from the csv
data = pd.read_csv('train.csv')
 
# defining the variables
x = data['x'].tolist()
y = data['y'].tolist()
 
# adding the constant term
x = sm.add_constant(x)
 
# performing the regression
# and fitting the model
result = sm.OLS(y, x).fit()
 
# printing the summary table
print(result.summary())


Python3
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
# reading data from the csv
data = pd.read_csv('train.csv')
 
# plotting the original values
x = data['x'].tolist()
y = data['y'].tolist()
plt.scatter(x, y)
 
# finding the maximum and minimum
# values of x, to get the
# range of data
max_x = data['x'].max()
min_x = data['x'].min()
 
# range of values for plotting
# the regression line
x = np.arange(min_x, max_x, 1)
 
# the substituted equation
y = 1.0143 * x - 0.4618
 
# plotting the regression line
plt.plot(y, 'r')
plt.show()


输出 :

OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.989
Model:                            OLS   Adj. R-squared:                  0.989
Method:                 Least Squares   F-statistic:                 2.709e+04
Date:                Fri, 26 Jun 2020   Prob (F-statistic):          1.33e-294
Time:                        15:55:38   Log-Likelihood:                -757.98
No. Observations:                 300   AIC:                             1520.
Df Residuals:                     298   BIC:                             1527.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         -0.4618      0.360     -1.284      0.200      -1.169       0.246
x1             1.0143      0.006    164.598      0.000       1.002       1.026
==============================================================================
Omnibus:                        1.034   Durbin-Watson:                   2.006
Prob(Omnibus):                  0.596   Jarque-Bera (JB):                0.825
Skew:                           0.117   Prob(JB):                        0.662
Kurtosis:                       3.104   Cond. No.                         120.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

表中部分术语说明:

  • R平方决定系数。它是因变量中可预测/可解释的方差的比例
  • 调整。 R-squared 调整后的 R-squared 是 R-squared 的修改形式,针对模型中自变量的数量进行了调整。 adj的价值。当我们包含实际改进模型的额外变量时,R 平方会增加。
  • F-statistic:模型的均方误差与残差均方误差的比值。它决定了模型的整体意义。
  • coef :方程中自变量和常数项的系数。
  • t : t 统计量的值。它是参数的估计值和假设值之间的差异与标准误差的比率

预测值:
从结果表中,我们注意到 x 的系数和常数项。这些值被替换到原始方程中,并使用matplotlib绘制回归线。
代码:

Python3

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
# reading data from the csv
data = pd.read_csv('train.csv')
 
# plotting the original values
x = data['x'].tolist()
y = data['y'].tolist()
plt.scatter(x, y)
 
# finding the maximum and minimum
# values of x, to get the
# range of data
max_x = data['x'].max()
min_x = data['x'].min()
 
# range of values for plotting
# the regression line
x = np.arange(min_x, max_x, 1)
 
# the substituted equation
y = 1.0143 * x - 0.4618
 
# plotting the regression line
plt.plot(y, 'r')
plt.show()

输出: