天天看點

8種用Python實作線性回歸的方法,究竟哪個方法最高效?

說到如何用Python執行線性回歸,大部分人會立刻想到用sklearn的linear_model,但事實是,Python至少有8種執行線性回歸的方法,sklearn并不是最高效的。

今天,讓我們來談談線性回歸。沒錯,作為資料科學界元老級的模型,線性回歸幾乎是所有資料科學家的入門必修課。抛開涉及大量數統的模型分析和檢驗不說,你真的就能熟練應用線性回歸了麼?未必!

在這篇文章中,文摘菌将介紹8種用Python實作線性回歸的方法。了解了這8種方法,就能夠根據不同需求,靈活選取最為高效的方法實作線性回歸。

<b>“寶刀不老”的線性回歸</b>

時至今日,深度學習早已成為資料科學的新寵。即便往前推10年,SVM、boosting等算法也能在準确率上完爆線性回歸。

為什麼我們還需要線性回歸呢?

一方面,線性回歸所能夠模拟的關系其實遠不止線性關系。線性回歸中的“線性”指的是系數的線性,而通過對特征的非線性變換,以及廣義線性模型的推廣,輸出和特征之間的函數關系可以是高度非線性的。另一方面,也是更為重要的一點,線性模型的易解釋性使得它在實體學、經濟學、商學等領域中占據了難以取代的地位。

那麼,如何用Python來實作線性回歸呢?

由于機器學習庫scikit-learn的廣泛流行,常用的方法是從該庫中調用linear_model來拟合資料。雖然這可以提供機器學習的其他流水線特征(例如:資料歸一化,模型系數正則化,将線性模型傳遞到另一個下遊模型)的其他優點,但是當一個資料分析師需要快速而簡便地确定回歸系數(和一些基本相關統計量)時,這通常不是最快速簡便的方法。

下面,我将介紹一些更快更簡潔的方法,但是它們所提供資訊量和模組化的靈活性不盡相同。

各種線性回歸方法的完整源碼都可以在文末的GitHub連結中找到。他們大多數都依賴于SciPy包。

SciPy是基于Python的Numpy擴充建構的數學算法和函數的集合。通過為使用者提供便于操作和可視化資料的進階指令和類,為互動式Python會話增加了強大的功能。

<b>8種方法實作線性回歸</b>

方法一: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實作線性回歸的方法,究竟哪個方法最高效?

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

對于條件良好的線性回歸問題(其中,至少滿足資料點個數&gt;特征數量),系數求解等價于存在一個簡單的閉式矩陣解,使得最小二乘最小化。由下式給出:

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相比,簡單矩陣的逆求解的方案反而更加快速。

原文釋出時間為:2018-01-08

本文作者:文摘菌