来源:大数据文摘

编译:丁慧、katherine Hou、钱天培

作者:TirthajyotiSarkar

本文共1856字,建议阅读6分钟
本文为大家对比了8种用Python实现线性回归的方法哪个更高效。

说到如何用Python执行线性回归,大部分人会立刻想到用sklearn的linear_model,但事实是,Python至少有8种执行线性回归的方法,sklearn并不是最高效的。

今天,让我们来谈谈线性回归。没错,作为数据科学界元老级的模型,线性回归几乎是所有数据科学家的入门必修课抛开涉及大量数统的模型分析和检验不说,你真的就能熟练应用线性回归了么?未必!

在这篇文章中,小编将介绍8种用Python实现线性回归的方法。了解了这8种方法,就能够根据不同需求,灵活选取最为高效的方法实现线性回归。


“宝刀不老”的线性回归


时至今日,深度学习早已成为数据科学的新宠。即便往前推10年,SVM、boosting等算法也能在准确率上完爆线性回归。

为什么我们还需要线性回归呢?

一方面,线性回归所能够模拟的关系其实远不止线性关系。线性回归中的“线性”指的是系数的线性,而通过对特征的非线性变换,以及广义线性模型的推广,输出和特征之间的函数关系可以是高度非线性的。另一方面,也是更为重要的一点,线性模型的易解释性使得它在物理学、经济学、商学等领域中占据了难以取代的地位。

那么,如何用Python来实现线性回归呢?

由于机器学习库scikit-learn的广泛流行,常用的方法是从该库中调用linear_model来拟合数据。虽然这可以提供机器学习的其他流水线特征(例如:数据归一化,模型系数正则化,将线性模型传递到另一个下游模型)的其他优点,但是当一个数据分析师需要快速而简便地确定回归系数(和一些基本相关统计量)时,这通常不是最快速简便的方法。

下面,我将介绍一些更快更简洁的方法,但是它们所提供信息量和建模的灵活性不尽相同。

各种线性回归方法的完整源码都可以在文末的GitHub链接中找到。他们大多数都依赖于SciPy包

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

8种方法实现线性回归


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

这是一个最基本的最小二乘多项式拟合函数(least squares polynomial fit function),接受数据集和任何维度的多项式函数(由用户指定),并返回一组使平方误差最小的系数。这里给出函数的详细描述。对于简单的线性回归来说,可以选择1维函数。但是如果你想拟合更高维的模型,则可以从线性特征数据中构建多项式特征并拟合模型。

方法二:Stats.linregress( )


这是一个高度专业化的线性回归函数,可以在SciPy的统计模块中找到。然而因为它仅被用来优化计算两组测量数据的最小二乘回归,所以其灵活性相当受限。因此,不能使用它进行广义线性模型和多元回归拟合。但是,由于其特殊性,它是简单线性回归中最快速的方法之一。除了拟合的系数和截距项之外,它还返回基本统计量,如R2系数和标准差。

方法三:Optimize.curve_fit( )


这与Polyfit方法是一致的,但本质上更具一般性。这个强大的函数来自scipy.optimize模块,可以通过最小二乘最小化将任意的用户自定义函数拟合到数据集上。

对于简单的线性回归来说,可以只写一个线性的mx + c函数并调用这个估计函数。不言而喻,它也适用于多元回归,并返回最小二乘度量最小的函数参数数组以及协方差矩阵。

方法四:numpy.linalg.lstsq


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

该方程可能有无数解、唯一解或无解。如果a是方阵且满秩,则x(四舍五入)是方程的“精确”解。

你可以使用这个方法做一元或多元线性回归来得到计算的系数和残差。一个小诀窍是,在调用函数之前必须在x数据后加一列1来计算截距项。这被证明是更快速地解决线性回归问题的方法之一。

方法五:Statsmodels.OLS ( )


Statsmodels是一个小型的Python包,它为许多不同的统计模型估计提供了类和函数,还提供了用于统计测试和统计数据探索的类和函数。每个估计对应一个泛结果列表。可根据现有的统计包进行测试,从而确保统计结果的正确性。

对于线性回归,可以使用该包中的OLS或一般最小二乘函数来获得估计过程中的完整的统计信息。

一个需要牢记的小技巧是,必须手动给数据x添加一个常数来计算截距,否则默认情况下只会得到系数。以下是OLS模型的完整汇总结果的截图。结果中与R或Julia等统计语言一样具有丰富的内容。

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

对于条件良好的线性回归问题(其中,至少满足数据点个数>特征数量),系数求解等价于存在一个简单的闭式矩阵解,使得最小二乘最小化。由下式给出:

这里有两个选择:

  • 使用简单的乘法求矩阵的逆

  • 首先计算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种简单线性回归的方法。大多数都可以扩展到更一般化的多元和多项式回归建模中。

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

令人惊讶的是,与广泛被使用的scikit-learnlinear_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

8种方法用Python实现线性回归,为你解析最高效选择相关推荐

  1. python向上取整的方法_python 取整的两种方法,python向上取整的方法,问题简介:  要把一...

    python 取整的两种方法,python向上取整的方法,问题简介: 要把一 问题简介: 要把一个浮点数(float)整数部分提取出来.比如把"2.1"变成"2" ...

  2. 解非线性方程的两种方法与python实现

    写在开头: 非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,例如平方关系.对数关系.指数关系.三角函数关系等等.求解此类方程往往很难得到精确解,经常需要求近似解问题.本文将从一道 ...

  3. 三种方法,Python轻松提取PDF中全部图片

    有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定! 今天就跟大家系统分享几种Python提取 PDF ...

  4. 基尼系数计算的两种方法:python实现 简单高效

    使用两种方法,通过python计算基尼系数. 在sql中如何计算基尼系数,可以查看我的另一篇文章.两篇文章取数相同,可以结合去看. 文章中方法1的代码来自于:(加入了一些注释,方便理解).为精确计算. ...

  5. cv2 画多边形不填充_你不知道的4种方法:python方法绘制扇形

    1 说明: ===== 1.1 是问答中的我的一个回答. 1.1 因为问答中没有代码块的,所以我改为这里写文章,然后链接过去. 1.2 4种方法:turtle法.OpenCV法.pygame法和mat ...

  6. python 合并excel 自动更新_手把手教你4种方法用Python批量实现多Excel多Sheet合并

    一.前言 大家好,我是崔艳飞.前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Ex ...

  7. 手把手教你4种方法用Python批量实现多Excel多Sheet合并

    一个一个打开复制粘贴固然可行,但是该方法费时费力,还容易出错,几个文件还可以手动处理,要是几十个甚至上百个,你就抓瞎了,不过这问题对Python来说,so easy,一起来看看吧! 二.项目目标 用P ...

  8. 重根迭代法解方程(两种方法)(Python实现)

    简述 通过两种不同的重根迭代的来解方程. 处理的方程是 (sin(x) - x/2) ^2 = 0 代码 采用的第一种迭代重根迭代方法: xk+1=xk−mf(xk)f′(xk)xk+1=xk−mf( ...

  9. layui图片src 指定后没显示_2种方法用python调用cv2模块给图片打马赛克

    1 说明: ===== 1.1 因各种需要,给图片打马赛克,当然本人着重介绍python用cv2的方法,主要讲解python和cv2的相关编程知识. 1.2 cv2模块:是OpenCV的python调 ...

最新文章

  1. java web运行的快慢_WebAssembly执行速度真的很强悍吗?对微软Edge很无语
  2. 深入JVM锁机制2-Lock
  3. (转) Twisted :第十八部分 Deferreds 全貌
  4. 让CoreData更简单些
  5. CentosMySQL5.6安装方法
  6. 高质量C++/C编程指南 ver 1.0
  7. 学习笔记(07):Python网络编程并发编程-客户端与服务端代码bug修复
  8. monthdiff oracle_Oracle计算时间差函数
  9. python排名上升_TIOBE:2019年7月全球编程语言排行 Python热度继续上升
  10. 仿制波形驱动机器人- SAW
  11. vue zxing 实现一维码、二维码扫描可移动端h5使用代码亲测可用
  12. 一看就懂的Android APP开发入门教程
  13. php判断是否连续出现数字,php通过gbk编码判断 含有连续数字 可用于判断QQ号,手机号等。...
  14. 计算机用户无法删除文件,教你几招解决电脑上的文件夹删不掉怎么办?
  15. 存储单元,字,MAR,存储字长,存储字,存储容量
  16. 《C程序员:从校园到职场》出版预告(3):从“阳春白雪”到“下里巴人”
  17. 【Python】Windows微信清理工具
  18. python opencv灰度转rgb
  19. 伪原创文章写作格式(符合seo优化的文章规范是什么)
  20. 许知远在吴晓波《预见2019——国运70》2018年年终演讲上的精华

热门文章

  1. JavaScript深入之变量对象
  2. DDRx的关键技术介绍(下)
  3. Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
  4. 解决Jetty Maven Plugin:Please initialize the log4j system properly(转)
  5. 因为WMI配置,无法执行Sql Server 系统配置检查器的解决办法
  6. 给热爱学习的同学们推荐一些顶级的c# Blogs链接
  7. mysql中行转列,MySQL 中行转列的方法
  8. python 运算太慢怎么办_python:网络安全攻击与防御的工具
  9. linux命令grep如何使用,Linux下如何使用grep搜索文本
  10. pandas.set_index()