在 Python 中,有几个 库和相应的模块可用于根据遇到的特定问题及其复杂性来执行回归。在本文中,我将总结 Python 中可用于执行回归的五个最重要的模块和库,并将讨论它们的一些局限性。在这里,我假设读者了解 Python 及其一些最重要的库。
代表 Numerical Python 的 NumPy 可能是涉及数组的数值计算的最重要和最有效的 Python 库。除了用于数值计算的几个操作外,NumPy 还有一个模块可以进行简单的线性回归和多项式回归。为了使事情更清楚,最好给出一个涉及代表真实数据的 NumPy 数组的具体示例,如下所示:
import numpy as np
X = np.array([56755.72171242,44178.04737774,40991.80813814,8814.00098681,43585.51198178,13574.17183072,6175.8760297,17829.69832237,53254.85637009,17522.23018625,42784.69836164,36638.18492916,41086.72967373,18167.77372717,12706.89121489,52564.42917946,61995.42280258,35776.79516181,30230.22630213,34524.46986093,13774.60527391,14258.22933451 ,101376.49657434,9616.64500569,45175.23189338,38615.99518491,74355.51585756,12578.49547344,19242.3664711,16310.988409,20881.76692993,5734.63362915,25732.01836475,51545.48360953,82081.59716162,11006.2497364,44974.83187718,56839.38177423])
y = np.array([7.3, 7.1, 6.9, 6.4, 7.4, 6.5, 6.3, 6.7, 7.6, 5.7, 7.6, 6.5, 7.0, 5.4, 5.6, 7.5, 7.0, .9, 7.5, 9.5 , 6.9, 6.5, 7.4, 7.3, 7.6, 6.1, 5.4, 6.2, 5.9, 4.7, 6.3, 7.3, 7.5, 5.5, 6.8, 6.9])
Numpy 数组 x 表示给定国家的人均 GDP(美元),数组 y 表示给定国家人民的生活满意度值。生活满意度值在 [0, 10] 范围内,其中 10 值对应于最大满意度,而 0 值则表示完全没有满足感。可以在 我的 GitHub 页面 上找到几个国家的生活满意度与人均 GDP 之间关系的详细信息 。
如上所述,NumPy 库有一个选项,通过使用最小二乘法作为最小化标准,为用户提供执行线性回归(简单和多项式)的可能性。执行此回归的模块是 polyfit: np.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False) 。 x 数组的形状为 (M, ),而 y 数组的形状为 (M, K),其中 M 和 K 是正自然数。此外, np.polyfit() 提供了使用“ deg = n ”,还可以计算 协方差矩阵 ,该 矩阵 提供有关多项式回归系数的重要信息。 polyfit ,使用最小二乘法拟合数据,并在内部记住拟合过程中发现的线性回归系数。要绘制线性回归函数,需要通过函数 np.poly1d()将已经找到的多项式系数转换为多项式函数 。
例如,现在我使用 np.polyfit() 函数对 上面的 x 和 y 数组执行简单的线性回归 ( n = 1 ) 并绘制结果。我使用以下 Python 代码:
from matplotlib.pyplot as plt
p=np.poly1d(np.polyfit(x, y, 1))
x_line = np.linspace(np.amin(x), np. amax(x), 200)
plt.scatter(x, y)
plt.plot(x_line, p(x_line))
plt.show()
print(p)
# 输出
# 2.4e-05 x + 5.742
因此,使用 np.polyfit() 进行线性回归的结果是一条线性回归线 ( y(x) = a + bx ) 具有截距 a =5.741(精确值)和斜率 b =2.39e-05(精确值)。
所述 polyfit 模块是用于装配简单线性回归和度n的多项式回归非常有用的。但是,它没有给用户使用具有多个预测变量的线性回归的可能性,即多元回归。因此,不能将 np.polyfit() 用于 混合交互项,而只能用于自交互项。此外,它没有给用户 直接 计算的可能性 :决定系数 R² 评估拟合优度、Pearson 相关系数 r、 假设检验 的 p 值以及与回归系数相关的样本误差。
SciPy 是一个 Python 库,代表 Scientific Python 。它是学术界和科学行业中最重要的科学计算库。该库包含几个用于特定目的的模块。在这些模块中, scipy.stats() 模块是一般统计建模中最重要的模块。所述 scipy.stats() 模块具有完全专用于线性回归子模块,其语法下云: scipy.stats.linregress() 并使用最小二乘法作为最小化标准。
现在要查看 linregress 的运行 情况,我再次使用数组 x 和 y 如上所述,并使用以下 Python 代码:
import scipy as sp
reqr_results = sp.stats.linregress(x, y)
print(regr_results)
# 输出
# LinregressResult(斜率= 2.3996299825729513e-05,截距= 5.741754353755326,右值= 0.720287195322656,p值= 3.4265564700646986e-07,标准错误= 3.851624914535862e-06,intercept_stderr = 0.15853194959552008)
从上面的 Python 代码可以看出, linregress 模块将线性回归的结果作为输出,其中截距值为 a = 5.741,斜率为 b = 2.39e-05。 a 和 b 的 这些值 与在上一节中 使用NumPy的 polyfit 模块找到的值 相同 。此外, 线性回归 计算 Pearson 相关系数 r (rvalue = 0.72)、p 值(pvalue = 3.42e-06)、斜率 b 的标准偏差 (stderr = 3.85e-06)以及截距项 a (intercept_stderr = 0.15)。
所述 linregress 模块给出了线性回归的额外结果向 polyfit 模块如上图。 linregress 唯一的缺点 是不支持多元回归。它只支持简单的线性回归。此外,它没有为用户提供 直接 预测最小二乘法(如 scikit-learn 库)中未使用的特征的新值的选项。
3.statsmodel的OLS
statsmodel 库/模块是的延伸 scipy.stats 模块主要用于一个模型拟合到一个给定的数据集。这个模块可能是关于一般回归,特别是线性回归的最完整的模块。该模块非常灵活,它为用户提供了多种选项来执行特定的统计计算。
正如我在第 2 节和第 3 节中所做的那样,我使用 statsmodel 通过使用上述 x 和 y 数组并使用最小二乘法作为 OLS 模块的最小化标准来执行简单的线性回归 。我使用以下 Python 代码:
import statsmodels.api as sm
x = sm.add_constant(x) # 在简单线性回归公式中添加截距项
lin_model = sm.OLS(y, x)
regr_results = lin_model.fit()
print((regr_results.results)
# 输出
# [5.74175435e+00 2.39962998e-05]
使用上述代码打印结果后,我得到了 x 和 y 数组上简单线性回归的截距 a = 5.741 和斜率 b = 2.39e-05的以下值 。的 OLS 模块隐式使用,用于计算回归系数的最小二乘法极小化方法。可以注意到 a 和 b 的值 与先前在第 1 节和第 2 节中使用其他方法发现的值 一致。
更详细的回归结果描述可以用python命令 print(regr_results.summary())得到 ,结果表如图2所示。 如你所见,汇总表给出了线性回归的详细信息结果包括:决定系数 R² 、截距 a 的值 及其标准差、斜率 b 的值及其标准差、 t 的值 分数、p 值、置信区间等。
该 OLS 模块及其等价模块, OLS (我没有明确讨论有关 OLS 这篇文章模块) 有优势的 linregress 模块,因为它们可以进行多元线性回归。另一方面, ols 模块的缺点 是它没有 直接 预测新值 的选项 y 用于预测变量 x_i 的 新值 (至少我不知道)。此外,OLS 模块的另一个缺点是必须使用命令 sm.add_constant() 为线性回归显式添加常数项 。的 linear_model.OLS 模块,在另一方面,为用户提供新的预测值给出一个设计矩阵的可能性。
scikit-learn 是用于机器学习的最佳 Python 库之一,适用于拟合和预测。它为用户提供了不同的数值计算和统计建模选项。它最重要的线性回归子模块是 LinearRegression 。 它使用最小二乘法作为最小化标准来寻找线性回归的参数。
正如我在前几节中所做的那样,我使用上述数组 x 和 y 进行简单的线性回归。我使用以下 Python 代码:
from sklearn import linear_model
linmodel = linear_model.LinearRegression(fit_intercept=True)
linmodel.fit(x.reshape(-1, 1), y)
(slope, intercept) = (model_1.coef_[0], model_1.intercept_)
print(slope, intercept)
# 输出
# 2.3996299825729496e-05 5.741754353755327
如您所见, LinearRegression 模块给出了与 之前使用其他方法找到的截距 a 和斜率 b 相同的值 。此外,还可以 使用 Python 命令 计算确定系数 R² : print(linmodel.score(x.reshape(-1, 1), y)) 给出 R² 的值 = 0.518,这与使用statsmodel 的 OLS 模块结果给出的结果相同 。
LinearRegression 模块 的优势 在于它使用户可以 使用 linmodel.predict() 命令 直接 预测新数据的新值 。此函数使 LinearRegression 模块对统计/机器学习非常有吸引力。作为 OLS 模块, LinearRegression 如果需要,模块还可以执行多元线性回归。 LinearRegression 模块的缺点 是它没有像 OLS 模块那样的回归结果汇总表, 它迫使用户显式地编写新命令来获取重要的统计信息。此外,使用 LinearRegression 模块进行多项式回归可能非常麻烦, 因为 在获得回归结果之前需要计算设计矩阵 X。
在Seaborn Python库是用于统计结果的可视化一个非常重要的图书馆。从技术上讲,它不是一个可用于计算回归参数的库,如我在前几节中所展示的,但它可用于以图形方式可视化图中的回归线。例如,如果我想绘制在前几节中获得的简单线性回归线,则需要运行以下 Python 代码:
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
sns.regplot(x = x, y = y, ci=95, order=1,line_kws={'label': 'Linear regression line: $Y(X)=5.74+2.39\cdot 10^{-5} X$', 'color': 'm'}, seed=1,truncate=False, label="Original data")
ax.set_xlabel("GDP per capita 2015 (USD)")
ax.set_ylabel("Life Satisfaction Value")
ax.set_xticks([1000, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000])
ax.set_yticks(np.arange(3.0, 10.5, 0.5))
ax.legend(loc="upper left")
上述代码的结果与本文顶部所示的图 1 完全相同。所述 regplot seaborn的模块内部计算的线性回归参数的值,并将其绘制与所述线性回归参数的95%置信区(I设定在上述代码中的参数“CI = 95”)的线性回归线。此外, regplot 模块可以执行多元线性回归和逻辑回归的图形可视化,因为该模块强烈基于 statsmodel 图书馆。总的来说,seaborn 的唯一缺点是它没有给用户 提供使用特定 Python 命令 直接 查看回归结果的可能性 。
在本文中,我总结了用于线性回归的最重要的 Python 库及其模块。一个模块优于另一个模块的优势取决于用户面临的特定问题。对于简单的线性回归和多项式回归, polyfit 和 linregress 模块最容易使用且非常方便。另一方面,对于线性回归的详细统计结果, OLS 和 ols 模块可能是最好的,因为它们不难使用,并在汇总表中提供大量回归结果,并且还为用户提供了进行预测的可能性 linear_model.OLS 。 另一方面,对于统计/机器学习, scikit-learn Python 库的 LinearRegression模块是最好的 模块之一,因为它可用于进行预测,这是上面提到的大多数其他模块所不具备的功能。如果希望在没有拟合参数值信息的情况下直接绘制统计过程的结果,则 seaborn 的 regplot 模块是最好的模块之一。
在我总结的最佳 Python 回归模块中,我没有包含 Pandas 库,尽管可以明确计算线性回归的一些参数,例如 Pearson 系数 r 等。此外, NumPy的 lsqt 模块提供了进行一些回归的可能性,但 与上述部分中提到的模块相比,Pandas 库和 lsqt 模块都处于较低水平。
代码 Github