8种Python线性回归实现方式及效率深度对比

山海之间
山海之间
发布时间:2026-10-13| 6人浏览过
原创

本文详细对比了Python中实现线性回归的8种主流方法,包括SciPy、NumPy、Statsmodels及Sklearn等库的具体用法。通过构建最大1000万样本的合成数据集进行压力测试,结果显示简单矩阵求逆和SciPy特定函数在速度上显著优于通用的Sklearn模型,为大数据量下的线性回归选型提供实证参考。

引言与线性回归的价值

前言

提及在Python中执行线性回归,多数开发者首先联想到的是调用sklearn库中的linear_model模块。然而实际情况是,Python环境中至少存在8种执行线性回归的途径,且sklearn并非在所有场景下都是最高效的选择。

本文旨在探讨线性回归这一数据科学领域的经典模型。作为数据科学家的入门必修课,线性回归的应用看似基础,但抛开复杂的数理统计分析与模型检验环节,许多从业者未必能熟练且高效地应用它。

本文将系统介绍8种利用Python实现线性回归的技术路径。掌握这些方法后,开发者可根据具体业务需求,灵活选择执行效率最高且最合适的实现方案。

“宝刀不老”的线性回归

尽管深度学习已成为当前数据科学的主流趋势,即便回溯至10年前,SVM、Boosting等算法在预测准确率上往往也远超线性回归。

既然如此,为何我们仍需关注线性回归?

原因有二。首先,线性回归所能模拟的关系远非字面意义上的“线性”。“线性”在此指代模型系数呈线性关系,而通过特征的非线性变换及广义线性模型的扩展,输出与特征间的函数关系可呈现高度非线性。其次,也是更为关键的一点,线性模型具备极高的可解释性,使其在物理学、经济学及商业分析等领域占据着不可替代的地位。

那么,具体应如何在Python中实现线性回归?

鉴于scikit-learn库的广泛普及,常规做法是直接调用该库中的linear_model模块进行数据拟合。尽管该方法能享受机器学习流水线带来的诸多便利(如数据归一化、模型系数正则化及将线性模型传递至下游模型等),但对于仅需快速获取回归系数及部分基础统计量的数据分析师而言,这通常并非最快捷简便的途径。

下文将介绍几种更为快速简洁的实现方式,尽管它们在信息输出量和建模灵活性上存在差异。

所有线性回归方法的完整源代码均可在文末提供的GitHub链接中获取。这些实现大多依赖于SciPy库。

SciPy是一套基于Python的Numpy扩展构建的数学算法与函数集合。它通过提供便于操作和可视化数据的高级命令及类,极大地增强了交互式Python会话的功能性。

8种Python线性回归实现方法详解

8种方法实现线性回归

方法一:Scipy.polyfit( ) 或 numpy.polyfit( )

这是一个基础的最小二乘多项式拟合函数,接收数据集及用户指定的任意维度多项式函数,并返回使平方误差最小化的系数组。关于该函数的详细文档可查阅官方资料。对于简单的线性回归,可选择1维函数;若需拟合更高维模型,则可基于线性特征数据构建多项式特征并进行拟合。

方法二:Stats.linregress( )

这是一个高度专业化的线性回归函数,位于SciPy的统计模块中。由于其设计初衷仅为优化两组测量数据的最小二乘回归计算,因此灵活性较为受限,无法用于广义线性模型或多元回归拟合。然而,得益于其专一性,它是简单线性回归中速度最快的方法之一。除拟合系数和截距外,该函数还返回R²系数及标准差等基本统计量。

方法三:Optimize.curve_fit( )

此方法与Polyfit思路一致,但通用性更强。该函数源自scipy.optimize模块,能够通过最小二乘法将任意用户自定义函数拟合至数据集。

对于简单线性回归,只需定义一个mx + c形式的线性函数并调用估计器即可。显然,该方法同样适用于多元回归,并返回使最小二乘度量最小的函数参数数组及协方差矩阵。

方法四:numpy.linalg.lstsq

这是通过矩阵分解计算线性方程组最小二乘解的基础方法,属于numpy包中便捷的线性代数模块。该方法通过求解使欧几里德2-范数||b-ax||₂最小化的向量x来求解方程ax = b。

该方程可能存在无数解、唯一解或无解。若a为方阵且满秩,则x(经四舍五入处理)即为方程的“精确”解。

你可以使用此方法执行一元或多元线性回归,以获取计算出的系数和残差。一个实用技巧是:在调用函数前,需在x数据后追加一列1以计算截距项。这被证明是解决线性回归问题的高效途径之一。

方法五:Statsmodels.OLS ( )

Statsmodels是一个轻量级Python包,为多种统计模型估计提供了类和函数,同时包含用于统计测试和数据探索的工具。每个估计过程对应一个泛结果列表,可通过现有统计包进行测试,从而确保统计结果的准确性。

针对线性回归,可使用该包中的OLS(普通最小二乘)或一般最小二乘函数,以获取估计过程中的完整统计信息。

需注意的一个细节是:必须手动为数据x添加常数项以计算截距,否则默认情况下仅返回系数。以下是OLS模型完整汇总结果的示例截图,其内容丰富程度与R或Julia等统计语言相当。

方法六和七:使用矩阵的逆求解析解

对于条件良好的线性回归问题(即数据点个数大于特征数量),系数求解等价于存在一个简单的闭式矩阵解,从而使最小二乘最小化。公式如下:

此处提供两种选择:

(a) 使用基本乘法计算矩阵的逆

(b) 首先计算x的Moore-Penrose广义伪逆矩阵,随后与y进行点积运算。由于第二种过程涉及奇异值分解(SVD),其运行速度较慢,但能更好地适用于条件不佳的数据集。

方法八:sklearn.linear_model.LinearRegression( )

这是大多数机器学习工程师和数据科学家采用的典型方法。当然,在解决现实世界问题时,它常被Lasso回归和Ridge回归等涉及交叉验证和正则化的算法所取代,但后者的高级函数核心仍基于此模型。

方法效率对比与结论

八种方法效率比拼

作为数据科学家,应始终寻求既准确又快速的数据建模方法或函数。若模型运行缓慢,将对大数据集的处理造成执行瓶颈。

评估可扩展性的有效方法是:逐步增加数据集规模,执行模型并记录所有运行时间,进而绘制趋势图。

以下是源代码及其运行结果

(https://github.com/tirthajyoti/PythonMachineLearning/blob/master/Linear_Regression_Methods.ipynb)。

得益于其简洁性,即便面对多达1000万个数据点,stats.linregress和简单的矩阵求逆依然是速度最快的方法。

8种用Python实现线性回归的方法,究竟哪个方法最高效?

简单矩阵逆求解的方案更快

作为数据科学家,我们必须不断探索多种解决方案以分析相同任务,并为特定问题选择最佳方案。

在本文中,我们讨论了8种简单线性回归的方法。其中大多数均可扩展至更通用的多元和多项式回归建模中。

本文的主要目标在于探讨这些方法的相对运行速度和计算复杂度。我们在数据量持续增加的合成数据集(最多达1000万个样本)上进行了测试,并给出了每种方法的运算时间。

令人惊讶的是,与广泛使用的scikit-learn linear_model相比,简单矩阵的逆求解方案反而更加快速。

我们还整理了项目代码,大家可以下载代码并直接运行文中提到的8种方法:

https://github.com/tirthajyoti/PythonMachineLearning/blob/master/Linear_Regression_Methods.ipynb

英文原文地址:https://medium.freecodecamp.org/data-science-with-python-8-ways-to-do-linear-regression-and-measure-their-speed-b5577d75f8b

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。