使用 statsmodels 的普通最小二乘法 (OLS)
在本文中,我们将使用 Python 的statsmodels模块来实现线性回归的普通最小二乘( OLS ) 方法。
介绍 :
线性回归模型将因变量 ( y ) 和至少一个自变量 ( x ) 之间的关系建立为:
在OLS方法中,我们必须选择和这样,y 的计算值和观测值之差的总平方和被最小化。
OLS 公式:
在哪里,
= 第 i 个观测值的预测值
= 第 i 个观测值的实际值
= 第 i 个观测的误差/残差
n = 观察总数
获取的值和最小化 S,我们可以对每个系数进行偏导,并将其等同于零。
使用的模块:
- statsmodels :为许多不同的统计模型的估计提供类和函数。
pip install statsmodels
- pandas:用于数据操作和分析的库。
- NumPy:数组计算的核心库。
- Matplotlib:用于创建静态和交互式图形和可视化的综合库。
方法 :
- 首先我们定义变量x和y 。在下面的示例中,变量是使用pandas从csv文件中读取的。示例中使用的文件可以在这里下载。
- 接下来,我们需要添加常量使用add_constant()方法到方程。
- statsmodels.api模块的OLS()函数用于执行 OLS 回归。它返回一个 OLS 对象。然后在该对象上调用fit()方法以将回归线拟合到数据中。
- summary()方法用于获取一个表格,该表格对回归结果进行了广泛的描述
Syntax : statsmodels.api.OLS(y, x)
Parameters :
- y : the variable which is dependent on x
- x : the independent variable
代码:
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()
输出: