8种用Python实现线性回归的方法对比详解


Posted in Python onJuly 10, 2019

前言

说到如何用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( )

8种用Python实现线性回归的方法对比详解

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

方法二:Stats.linregress( )

8种用Python实现线性回归的方法对比详解

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

方法三:Optimize.curve_fit( )

8种用Python实现线性回归的方法对比详解

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

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

方法四:numpy.linalg.lstsq

8种用Python实现线性回归的方法对比详解

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

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

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

方法五:Statsmodels.OLS ( )

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

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

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

8种用Python实现线性回归的方法对比详解

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

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

8种用Python实现线性回归的方法对比详解

这里有两个选择:

(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-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

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

Python 相关文章推荐
kNN算法python实现和简单数字识别的方法
Nov 18 Python
python比较2个xml内容的方法
May 11 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
Python使用filetype精确判断文件类型
Jul 02 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Python中包的用法及安装
Feb 11 Python
python对Excel的读取的示例代码
Feb 14 Python
pandas 数据类型转换的实现
Dec 29 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 Python
总结Pyinstaller打包的高级用法
Jun 28 Python
Python实现计算对象的内存大小示例
Jul 10 #Python
Python画图高斯分布的示例
Jul 10 #Python
使用Python实现跳一跳自动跳跃功能
Jul 10 #Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 #Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 #Python
Python 占位符的使用方法详解
Jul 10 #Python
Python寻找路径和查找文件路径的示例
Jul 10 #Python
You might like
php中的实现trim函数代码
2007/03/19 PHP
PHP操作xml代码
2010/06/17 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
vue实现选中效果
2020/10/07 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
分析python服务器拒绝服务攻击代码
2014/01/16 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
医师定期考核实施方案
2014/05/07 职场文书
英文辞职信范文
2015/05/13 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL