本文中,作者讨论了 8 种在 Python 环境下进行简单线性回归计算的算法,不过没有讨论其性能的好坏,而是对比了其相对计算复杂度的度量。
GitHub 地址:https://github.com/tirthajyoti/PythonMachineLearning/blob/master/Linear_Regression_Methods.ipynb
对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点。但我们不可夸大线性模型(快速且准确地)拟合大型数据集的重要性。如本文所示,在线性回归模型中,「线性」一词指的是回归系数,而不是特征的 degree。
特征(或称独立变量)可以是任何的 degree,甚至是超越函数(transcendental function),比如指数函数、对数函数、正弦函数。因此,很多自然现象可以通过这些变换和线性模型来近似模拟,即使当输出与特征的函数关系是高度非线性的也没问题。
另一方面,由于 Python 正在快速发展为数据科学家的首选编程语言,所以能够意识到存在很多方法用线性模型拟合大型数据集,就显得尤为重要。同样重要的一点是,数据科学家需要从模型得到的结果中来评估与每个特征相关的重要性。
然而,在 Python 中是否只有一种方法来执行线性回归分析呢?如果有多种方法,那我们应该如何选择最有效的那个呢?
由于在机器学习中,Scikit-learn 是一个十分流行的 Python 库,因此,人们经常会从这个库调用线性模型来拟合数据。除此之外,我们还可以使用该库的 pipeline 与 FeatureUnion 功能(如:数据归一化、模型回归系数正则化、将线性模型传递给下游模型),但是一般来看,如果一个数据分析师仅需要一个又快又简单的方法来确定回归系数(或是一些相关的统计学基本结果),那么这并不是最快或最简洁的方法。
虽然还存在其他更快更简洁的方法,但是它们都不能提供同样的信息量与模型灵活性。
请继
有关各种线性回归方法的代码可以参阅笔者的 GitHub。其中大部分都基于 SciPy 包
SciPy 基于 Numpy 建立,集合了数学算法与方便易用的函数。通过为用户提供高级命令,以及用于操作和可视化数据的类,SciPy 显著增强了 Python 的交互式会话。
以下对各种方法进行简要讨论。
方法 1:Scipy.polyfit( ) 或 numpy.polyfit( )
这是一个非常一般的最小二乘多项式拟合函数,它适用于任何 degree 的数据集与多项式函数(具体由用户来指定),其返回值是一个(最小化方差)回归系数的数组。
对于简单的线性回归而言,你可以把 degree 设为 1。如果你想拟合一个 degree 更高的模型,你也可以通过从线性特征数据中建立多项式特征来完成。
详细描述参考:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.polyfit.html。
方法 2:stats.linregress( )
这是 Scipy 中的统计模块中的一个高度专门化的线性回归函数。其灵活性相当受限,因为它只对计算两组测量值的最小二乘回归进行优化。因此,你不能用它拟合一般的线性模型,或者是用它来进行多变量回归分析。但是,由于该函数的目的是为了执行专门的任务,所以当我们遇到简单的线性回归分析时,这是最快速的方法之一。除了已拟合的系数和截距项(intercept term)外,它还会返回基本的统计学值如 R² 系数与标准差。
详细描述参考:http://blog.minitab.com/blog/adventures-in-statistics-2/regression-analysis-how-do-i-interpret-r-squared-and-assess-the-goodness-of-fit
方法 3:optimize.curve_fit( )
这个方法与 Polyfit 方法类似,但是从根本来讲更为普遍。通过进行最小二乘极小化,这个来自 scipy.optimize 模块的强大函数可以通过最小二乘方法将用户定义的任何函数拟合到数据集上。
对于简单的线性回归任务,我们可以写一个线性函数:mx+c,我们将它称为估计器。它也适用于多变量回归。它会返回一个由函数参数组成的数列,这些参数是使最小二乘值最小化的参数,以及相关协方差矩阵的参数。
详细描述参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
方法 4:numpy.linalg.lstsq
这是用矩阵因式分解来计算线性方程组的最小二乘解的根本方法。它来自 numpy 包中的线性代数模块。通过求解一个 x 向量(它将|| b—a x ||²的欧几里得 2-范数最小化),它可以解方程 ax=b。
该方程可能会欠定、确定或超定(即,a 中线性独立的行少于、等于或大于其线性独立的列数)。如果 a 是既是一个方阵也是一个满秩矩阵,那么向量 x(如果没有舍入误差)正是方程的解。
借助这个方法,你既可以进行简单变量回归又可以进行多变量回归。你可以返回计算的系数与残差。一个小窍门是,在调用这个函数之前,你必须要在 x 数据上附加一列 1,才能计算截距项。结果显示,这是处理线性回归问题最快速的方法之一。
详细描述参考:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.lstsq.html#numpy.linalg.lstsq
方法 5: Statsmodels.OLS ( )
statsmodel 是一个很不错的 Python 包,它为人们提供了各种类与函数,用于进行很多不同统计模型的估计、统计试验,以及统计数据研究。每个估计器会有一个收集了大量统计数据结果的列表。其中会对结果用已有的统计包进行对比试验,以保证准确性。
对于线性回归,人们可以从这个包调用 OLS 或者是 Ordinary least squares 函数来得出估计过程的最终统计数据。
需要记住的一个小窍门是,你必须要手动为数据 x 添加一个常数,以用于计算截距。否则,只会默认输出回归系数。下方表格汇总了 OLS 模型全部的结果。它和任何函数统计语言(如 R 和 Julia)一样丰富。
详细描述参考:http://www.statsmodels.org/dev/index.html
方法6、7:使用矩阵求逆方法的解析解
对于一个良态(well-conditioned)线性回归问题(至少是对于数据点、特征),回归系数的计算存在一个封闭型的矩阵解(它保证了最小二乘的最小化)。它由下面方程给出:
在这里,我们有两个选择:
方法 6:使用简单矩阵求逆乘法。
方法 7:首先计算数据 x 的广义 Moore-Penrose 伪逆矩阵,然后将结果与 y 进行点积。由于这里第二个步骤涉及到奇异值分解(SVD),所以它在处理非良态数据集的时候虽然速度慢,但是结果不错。(参考:开发者必读:计算机科学中的线性代数)
详细描述参考:https://en.wikipedia.org/wiki/Linear_least_squares_%28mathematics%29
方法 8: sklearn.linear_model.LinearRegression( )
这个方法经常被大部分机器学习工程师与数据科学家使用。然而,对于真实世界的问题,它的使用范围可能没那么广,我们可以用交叉验证与正则化算法比如 Lasso 回归和 Ridge 回归来代替它。但是要知道,那些高级函数的本质核心还是从属于这个模型。
详细描述参考:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
以上方法的速度与时间复杂度测量
作为一个数据科学家,他的工作经常要求他又快又精确地完成数据建模。如果使用的方法本来就很慢,那么在面对大型数据集的时候便会出现执行的瓶颈问题。
一个判断算法能力可扩展性的好办法,是用不断扩大的数据集来测试数据,然后提取所有试验的执行时间,画出趋势图。
可以在 GitHub 查看这个方法的代码。下方给出了最终的结果。由于模型的简单性,stats.linregress 和简单矩阵求逆乘法的速度最快,甚至达到了 1 千万个数据点。
总结
作为一个数据科学家,你必须要经常进行研究,去发现多种处理相同的分析或建模任务的方法,然后针对不同问题对症下药。
在本文中,我们讨论了 8 种进行简单线性回归的方法。其中大部分方法都可以延伸到更一般的多变量和多项式回归问题上。我们没有列出这些方法的 R² 系数拟合,因为它们都非常接近 1。
对于(有百万人工生成的数据点的)单变量回归,回归系数的估计结果非常不错。
这篇文章首要目标是讨论上述 8 种方法相关的速度/计算复杂度。我们通过在一个合成的规模逐渐增大的数据集(最大到 1 千万个样本)上进行实验,我们测出了每种方法的计算复杂度。令人惊讶的是,简单矩阵求逆乘法的解析解竟然比常用的 scikit-learn 线性模型要快得多。
数据分析咨询请扫描二维码
数据分析师的工作内容涉及多个方面,主要包括数据的收集、整理、分析和可视化,以支持商业决策和问题解决。以下是数据分析师的一 ...
2024-11-21数据分析师必须掌握的技能可以从多个方面进行归纳和总结。以下是数据分析师需要具备的主要技能: 统计学基础:数据分析师需要 ...
2024-11-21数据分析入门的难易程度因人而异,总体来看,入门并不算特别困难,但需要一定的学习和实践积累。 入门难度:数据分析入门相对 ...
2024-11-21数据分析是一项通过收集、整理和解释数据来发现有用信息的过程,它在现代社会中具有广泛的应用和重要性。数据分析能够帮助人们更 ...
2024-11-21数据分析行业正在迅速发展,随着技术的不断进步和数据量的爆炸式增长,企业对数据分析人才的需求也与日俱增。本文将探讨数据分析 ...
2024-11-21数据分析的常用方法包括多种技术,每种方法都有其特定的应用场景和优势。以下是几种常见的数据分析方法: 对比分析法:通过比 ...
2024-11-21企业数字化转型是指企业利用数字技术对其业务进行改造和升级,以实现提高效率、降低成本、创新业务模式等目标的过程。这一过程不 ...
2024-11-21数据分析作为一个备受追捧的职业领域,吸引着越来越多的女性加入其中。对于女生而言,在选择成为一名数据分析师时,行业选择至关 ...
2024-11-21大数据技术专业主要学习计算机科学、数学、统计学和信息技术等领域的基础理论和技能,旨在培养具备大数据处理、分析和应用能力的 ...
2024-11-21《Python数据分析极简入门》 第2节 3 Pandas数据查看 这里我们创建一个DataFrame命名为df: importnumpyasnpi ...
2024-11-21越老越吃香的行业主要集中在需要长时间经验积累和专业知识的领域。这些行业通常知识更新换代较慢,因此随着年龄的增长,从业者能 ...
2024-11-20数据导入 使用pandas库的read_csv()函数读取CSV文件或使用read_excel()函数读取Excel文件。 支持处理不同格式数据,可指定分隔 ...
2024-11-20大数据与会计专业是一门结合了大数据分析技术和会计财务理论知识的新型复合型学科,旨在培养能够适应现代会计业务新特征的高层次 ...
2024-11-20要成为一名数据分析师,需要掌握一系列硬技能和软技能。以下是成为数据分析师所需的关键技能: 统计学基础 理解基本的统计概念 ...
2024-11-20是的,Python可以用于数据分析。Python在数据分析领域非常流行,因为它拥有丰富的库和工具,能够高效地处理从数据清洗到可视化的 ...
2024-11-20在这个数据驱动的时代,数据分析师的角色变得愈发不可或缺。他们承担着帮助企业从数据中提取有价值信息的责任,而这些信息可以大 ...
2024-11-20数据分析作为现代信息时代的支柱之一,已经成为各行业不可或缺的工具。无论是在商业、科研还是日常决策中,数据分析都扮演着至关 ...
2024-11-20数字化转型已成为当今商业世界的热点话题。它不仅代表着技术的提升,还涉及企业业务流程、组织结构和文化的深层次变革。理解数字 ...
2024-11-20在现代社会的快速变迁中,选择一个具有长期增长潜力的行业显得至关重要。了解未来发展前景好的行业不仅能帮助我们进行职业选择, ...
2024-11-20统计学专业的就业方向和前景非常广泛且充满机遇。随着大数据、人工智能等技术的快速发展,统计学的重要性进一步凸显,相关人才的 ...
2024-11-20