99网
您的当前位置:首页8种用Python实现线性回归的方法对比详解

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

来源:99网
8种⽤Python实现线性回归的⽅法对⽐详解

说到如何⽤Python执⾏线性回归,⼤部分⼈会⽴刻想到⽤sklearn的linear_model,但事实是,Python⾄少有8种执⾏线性回归的⽅法,sklearn并不是最⾼效的。

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

在这篇⽂章中,⽂摘菌将介绍8种⽤Python实现线性回归的⽅法。了解了这8种⽅法,就能够根据不同需求,灵活选取最为⾼效的⽅法实现线性回归。

时⾄今⽇,深度学习早已成为数据科学的新宠。即便往前推10年,SVM、boosting等算法也能在准确率上完爆线性回归。为什么我们还需要线性回归呢?

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

由于机器学习库scikit-learn的⼴泛流⾏,常⽤的⽅法是从该库中调⽤linear_model来拟合数据。虽然这可以提供机器学习的其他流⽔线特征(例如:数据归⼀化,模型系数正则化,将线性模型传递到另⼀个下游模型)的其他优点,但是当⼀个数据分析师需要快速⽽简便地确定回归系数(和⼀些基本相关统计量)时,这通常不是最快速简便的⽅法。下⾯,我将介绍⼀些更快更简洁的⽅法,但是它们所提供信息量和建模的灵活性不尽相同。各种线性回归⽅法的完整源码都可以在⽂末的GitHub链接中找到。他们⼤多数都依赖于SciPy包。

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

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

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

这与Polyfit⽅法是⼀致的,但本质上更具⼀般性。这个强⼤的函数来⾃scipy.optimize模块,可以通过最⼩⼆乘最⼩化将任意的⽤户⾃定义函数拟合到数据集上。

对于简单的线性回归来说,可以只写⼀个线性的mx + c函数并调⽤这个估计函数。不⾔⽽喻,它也适⽤于多元回归,并返回最⼩⼆乘度量最⼩的函数参数数组以及协⽅差矩阵。

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

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

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

Statsmodels是⼀个⼩型的Python包,它为许多不同的统计模型估计提供了类和函数,还提供了⽤于统计测试和统计数据探索的类和函数。每个估计对应⼀个泛结果列表。可根据现有的统计包进⾏测试,从⽽确保统计结果的正确性。对于线性回归,可以使⽤该包中的OLS或⼀般最⼩⼆乘函数来获得估计过程中的完整的统计信息。

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

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

这⾥有两个选择:

(a)使⽤简单的乘法求矩阵的逆

(b)⾸先计算x的Moore-Penrose⼴义伪逆矩阵,然后与y取点积。由于第⼆个过程涉及奇异值分解(SVD),所以它⽐较慢,但是它可以很好地适⽤于没有良好条件的数据集。

这是⼤多数机器学习⼯程师和数据科学家使⽤的典型⽅法。当然,对于现实世界中的问题,它可能被交叉验证和正则化的算法如Lasso回归和Ridge回归所取代,⽽不被过多使⽤,但是这些⾼级函数的核⼼正是这个模型本⾝。

作为⼀名数据科学家,应该⼀直寻找准确且快速的⽅法或函数来完成数据建模⼯作。如果模型本来就很慢,那么会对⼤数据集造成执⾏瓶颈。

⼀个可以⽤来确定可扩展性的好办法是不断增加数据集的⼤⼩,执⾏模型并取所有的运⾏时间绘制成趋势图。下⾯是源代码及其运⾏结果

由于其简单,即使多达1000万个数据点,stats.linregress和简单的矩阵求逆还是最快速的⽅法。8种⽤Python实现线性回归的⽅法,究竟哪个⽅法最⾼效?

作为数据科学家,我们必须⼀直探索多种解决⽅案来对相同的任务进⾏分析和建模,并为特定问题选择最佳⽅案。在本⽂中,我们讨论了8种简单线性回归的⽅法。⼤多数都可以扩展到更⼀般化的多元和多项式回归建模中。

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

令⼈惊讶的是,与⼴泛被使⽤的scikit-learnlinear_model相⽐,简单矩阵的逆求解的⽅案反⽽更加快速。我们还收集了项⽬代码,⼤家可以到这⾥下载代码并直接运⾏⽂中提到的8种⽅法喔:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容