数据科学家必须知道的5个Python回归模块

0.介绍

回归是统计建模、数据科学和机器学习中的一个非常重要的概念,它通过使用特定的数学公式帮助建立自变量(或预测变量) x 与因变量(或简单输出)y( x ) 之间的可能关系 最小化标准。有几种类型的回归用于不同的情况,最常见的一种是线性回归。其他类型的回归包括逻辑回归、非线性回归等。

在 Python 中,有几个 库和相应的模块可用于根据遇到的特定问题及其复杂性来执行回归。在本文中,我将总结 Python 中可用于执行回归的五个最重要的模块和库,并将讨论它们的一些局限性。在这里,我假设读者了解 Python 及其一些最重要的库。

1.Numpy的polyfit

代表 Numerical Python 的 NumPy 可能是涉及数组的数值计算的最重要和最有效的 Python 库。除了用于数值计算的几个操作外,NumPy 还有一个模块可以进行简单的线性回归和多项式回归。为了使事情更清楚,最好给出一个涉及代表真实数据的 NumPy 数组的具体示例,如下所示:

import numpy as np

X = np.array([56755.7217124244178.0473777440991.808138148814.0009868143585.5119817813574.171830726175.876029717829.6983223753254.8563700917522.2301862542784.6983616436638.1849291641086.7296737318167.7737271712706.8912148952564.4291794661995.4228025835776.7951618130230.2263021334524.4698609313774.6052739114258.22933451101376.496574349616.6450056945175.2318933838615.9951849174355.5158575612578.4954734419242.366471116310.98840920881.766929935734.6336291525732.0183647551545.4836095382081.5971616211006.249736444974.8318771856839.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 值以及与回归系数相关的样本误差。

2.Scipy的线性回归

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 值、置信区间等。

数据科学家必须知道的5个Python回归模块_第1张图片
该 OLS 模块及其等价模块, OLS (我没有明确讨论有关 OLS 这篇文章模块) 有优势的 linregress 模块,因为它们可以进行多元线性回归。另一方面, ols 模块的缺点 是它没有 直接 预测新值 的选项 y 用于预测变量 x_i 的 新值 (至少我不知道)。此外,OLS 模块的另一个缺点是必须使用命令 sm.add_constant() 为线性回归显式添加常数项 。的 linear_model.OLS 模块,在另一方面,为用户提供新的预测值给出一个设计矩阵的可能性。

4.scikit-learn 的 LinearRegression

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。

5.searborn的regplot

在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 命令 直接 查看回归结果的可能性 。

6.结论

在本文中,我总结了用于线性回归的最重要的 Python 库及其模块。一个模块优于另一个模块的优势取决于用户面临的特定问题。对于简单的线性回归和多项式回归, polyfit 和 linregress 模块最容易使用且非常方便。另一方面,对于线性回归的详细统计结果, OLS 和 ols 模块可能是最好的,因为它们不难使用,并在汇总表中提供大量回归结果,并且还为用户提供了进行预测的可能性 linear_model.OLS 。 另一方面,对于统计/机器学习, scikit-learn Python 库的 LinearRegression模块是最好的 模块之一,因为它可用于进行预测,这是上面提到的大多数其他模块所不具备的功能。如果希望在没有拟合参数值信息的情况下直接绘制统计过程的结果,则 seaborn 的 regplot 模块是最好的模块之一。

在我总结的最佳 Python 回归模块中,我没有包含 Pandas 库,尽管可以明确计算线性回归的一些参数,例如 Pearson 系数 r 等。此外, NumPy的 lsqt 模块提供了进行一些回归的可能性,但 与上述部分中提到的模块相比,Pandas 库和 lsqt 模块都处于较低水平。

代码 Github

你可能感兴趣的:(python)