選自Mediumhtml
做者:Tirthajyoti Sarkarpython
機器之心編譯git
參與:晏奇、劉曉坤github
本文中,做者討論了 8 種在 Python 環境下進行簡單線性迴歸計算的算法,不過沒有討論其性能的好壞,而是對比了其相對計算複雜度的度量。
GitHub 地址:github.com/tirthajyoti…算法
對於大多數數據科學家而言,線性迴歸方法是他們進行統計學建模和預測分析任務的起點。但咱們不可誇大線性模型(快速且準確地)擬合大型數據集的重要性。如本文所示,在線性迴歸模型中,「線性」一詞指的是迴歸係數,而不是特徵的 degree。編程
特徵(或稱獨立變量)能夠是任何的 degree,甚至是超越函數(transcendental function),好比指數函數、對數函數、正弦函數。所以,不少天然現象能夠經過這些變換和線性模型來近似模擬,即便當輸出與特徵的函數關係是高度非線性的也沒問題。數組
另外一方面,因爲 Python 正在快速發展爲數據科學家的首選編程語言,因此可以意識到存在不少方法用線性模型擬合大型數據集,就顯得尤其重要。一樣重要的一點是,數據科學家須要從模型獲得的結果中來評估與每一個特徵相關的重要性。機器學習
然而,在 Python 中是否只有一種方法來執行線性迴歸分析呢?若是有多種方法,那咱們應該如何選擇最有效的那個呢?
因爲在機器學習中,Scikit-learn 是一個十分流行的 Python 庫,所以,人們常常會從這個庫調用線性模型來擬合數據。除此以外,咱們還可使用該庫的 pipeline 與 FeatureUnion 功能(如:數據歸一化、模型迴歸係數正則化、將線性模型傳遞給下游模型),可是通常來看,若是一個數據分析師僅須要一個又快又簡單的方法來肯定迴歸係數(或是一些相關的統計學基本結果),那麼這並非最快或最簡潔的方法。編程語言
雖然還存在其餘更快更簡潔的方法,可是它們都不能提供一樣的信息量與模型靈活性。函數
請繼續閱讀。
有關各類線性迴歸方法的代碼能夠參閱筆者的 GitHub。其中大部分都基於 SciPy 包
SciPy 基於 Numpy 創建,集合了數學算法與方便易用的函數。經過爲用戶提供高級命令,以及用於操做和可視化數據的類,SciPy 顯著加強了 Python 的交互式會話。
如下對各類方法進行簡要討論。
方法 1:Scipy.polyfit( ) 或 numpy.polyfit( )
這是一個很是通常的最小二乘多項式擬合函數,它適用於任何 degree 的數據集與多項式函數(具體由用戶來指定),其返回值是一個(最小化方差)迴歸係數的數組。
對於簡單的線性迴歸而言,你能夠把 degree 設爲 1。若是你想擬合一個 degree 更高的模型,你也能夠經過從線性特徵數據中創建多項式特徵來完成。
詳細描述參考:docs.scipy.org/doc/numpy-1…。
方法 2:stats.linregress( )
這是 Scipy 中的統計模塊中的一個高度專門化的線性迴歸函數。其靈活性至關受限,由於它只對計算兩組測量值的最小二乘迴歸進行優化。所以,你不能用它擬合通常的線性模型,或者是用它來進行多變量回歸分析。可是,因爲該函數的目的是爲了執行專門的任務,因此當咱們遇到簡單的線性迴歸分析時,這是最快速的方法之一。除了已擬合的係數和截距項(intercept term)外,它還會返回基本的統計學值如 R² 係數與標準差。
詳細描述參考:blog.minitab.com/blog/advent…
方法 3:optimize.curve_fit( )
這個方法與 Polyfit 方法相似,可是從根原本講更爲廣泛。經過進行最小二乘極小化,這個來自 scipy.optimize 模塊的強大函數能夠經過最小二乘方法將用戶定義的任何函數擬合到數據集上。
對於簡單的線性迴歸任務,咱們能夠寫一個線性函數:mx+c,咱們將它稱爲估計器。它也適用於多變量回歸。它會返回一個由函數參數組成的數列,這些參數是使最小二乘值最小化的參數,以及相關協方差矩陣的參數。
詳細描述參考:docs.scipy.org/doc/scipy/r…
方法 4:numpy.linalg.lstsq
這是用矩陣因式分解來計算線性方程組的最小二乘解的根本方法。它來自 numpy 包中的線性代數模塊。經過求解一個 x 向量(它將|| b—a x ||²的歐幾里得 2-範數最小化),它能夠解方程 ax=b。
該方程可能會欠定、肯定或超定(即,a 中線性獨立的行少於、等於或大於其線性獨立的列數)。若是 a 是既是一個方陣也是一個滿秩矩陣,那麼向量 x(若是沒有舍入偏差)正是方程的解。
藉助這個方法,你既能夠進行簡單變量回歸又能夠進行多變量回歸。你能夠返回計算的係數與殘差。一個小竅門是,在調用這個函數以前,你必需要在 x 數據上附加一列 1,才能計算截距項。結果顯示,這是處理線性迴歸問題最快速的方法之一。
詳細描述參考:docs.scipy.org/doc/numpy-1…
方法 5: Statsmodels.OLS ( )
statsmodel 是一個很不錯的 Python 包,它爲人們提供了各類類與函數,用於進行不少不一樣統計模型的估計、統計試驗,以及統計數據研究。每一個估計器會有一個收集了大量統計數據結果的列表。其中會對結果用已有的統計包進行對比試驗,以保證準確性。
對於線性迴歸,人們能夠從這個包調用 OLS 或者是 Ordinary least squares 函數來得出估計過程的最終統計數據。
須要記住的一個小竅門是,你必需要手動爲數據 x 添加一個常數,以用於計算截距。不然,只會默認輸出迴歸係數。下方表格彙總了 OLS 模型所有的結果。它和任何函數統計語言(如 R 和 Julia)同樣豐富。
詳細描述參考:www.statsmodels.org/dev/index.h…
方法 六、7:使用矩陣求逆方法的解析解
對於一個良態(well-conditioned)線性迴歸問題(至少是對於數據點、特徵),迴歸係數的計算存在一個封閉型的矩陣解(它保證了最小二乘的最小化)。它由下面方程給出:
在這裏,咱們有兩個選擇:
方法 6:使用簡單矩陣求逆乘法。
方法 7:首先計算數據 x 的廣義 Moore-Penrose 僞逆矩陣,而後將結果與 y 進行點積。因爲這裏第二個步驟涉及到奇異值分解(SVD),因此它在處理非良態數據集的時候雖然速度慢,可是結果不錯。(參考:開發者必讀:計算機科學中的線性代數)
詳細描述參考:en.wikipedia.org/wiki/Linear…
方法 8: sklearn.linear_model.LinearRegression( )
這個方法常常被大部分機器學習工程師與數據科學家使用。然而,對於真實世界的問題,它的使用範圍可能沒那麼廣,咱們能夠用交叉驗證與正則化算法好比 Lasso 迴歸和 Ridge 迴歸來代替它。可是要知道,那些高級函數的本質核心仍是從屬於這個模型。
詳細描述參考:scikit-learn.org/stable/modu…
以上方法的速度與時間複雜度測量
做爲一個數據科學家,他的工做常常要求他又快又精確地完成數據建模。若是使用的方法原本就很慢,那麼在面對大型數據集的時候便會出現執行的瓶頸問題。
一個判斷算法能力可擴展性的好辦法,是用不斷擴大的數據集來測試數據,而後提取全部試驗的執行時間,畫出趨勢圖。
能夠在 GitHub 查看這個方法的代碼。下方給出了最終的結果。因爲模型的簡單性,stats.linregress 和簡單矩陣求逆乘法的速度最快,甚至達到了 1 千萬個數據點。
總結
做爲一個數據科學家,你必需要常常進行研究,去發現多種處理相同的分析或建模任務的方法,而後針對不一樣問題對症下藥。
在本文中,咱們討論了 8 種進行簡單線性迴歸的方法。其中大部分方法均可以延伸到更通常的多變量和多項式迴歸問題上。咱們沒有列出這些方法的 R² 係數擬合,由於它們都很是接近 1。
對於(有百萬人工生成的數據點的)單變量回歸,迴歸係數的估計結果很是不錯。
這篇文章首要目標是討論上述 8 種方法相關的速度/計算複雜度。咱們經過在一個合成的規模逐漸增大的數據集(最大到 1 千萬個樣本)上進行實驗,咱們測出了每種方法的計算複雜度。使人驚訝的是,簡單矩陣求逆乘法的解析解居然比經常使用的 scikit-learn 線性模型要快得多。