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 相关文章推荐
python实现判断数组是否包含指定元素的方法
Jul 15 Python
python fabric实现远程部署
Jan 05 Python
Python常用算法学习基础教程
Apr 13 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
python Tkinter版学生管理系统
Feb 20 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
Python实现检测文件的MD5值来查找重复文件案例
Mar 12 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
Python爬取12306车次信息代码详解
Aug 12 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 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防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
初步探究Python程序的执行原理
2015/04/11 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
python实现微信防撤回神器
2019/04/29 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
struct和class的区别
2015/11/20 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
团队经理竞聘书
2014/03/31 职场文书
新年团拜会主持词
2014/04/02 职场文书
捐资助学倡议书
2014/04/15 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
拉歌口号大全
2014/06/13 职场文书
工程部岗位职责范本
2015/04/11 职场文书
给下属加薪申请报告
2015/05/15 职场文书
干部培训简讯
2015/07/20 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android