1. 程式人生 > >通俗得說線性迴歸演算法(二)線性迴歸實戰

通俗得說線性迴歸演算法(二)線性迴歸實戰

前情提要:
通俗得說線性迴歸演算法(一)線性迴歸初步介紹

一.sklearn線性迴歸詳解

1.1 線性迴歸引數

介紹完線性迴歸,那麼我們來看看如何運用sklearn來呼叫線性迴歸模型,進行訓練和預測。

def LinearRegression(fit_intercept=True,
                       normalize=False,
                       copy_X=True,
                       n_jobs=None
                       )
                                        
- fit_intercept:預設為true,引數意思是說要不要計算此模型的截距。 如果設定為False,則不會在計算中使用截距。
- normalize:正則化,預設是false。
- copy_X:預設是true,會複製一份x,否則會覆蓋掉原有的x。
        
- n_jobs:指定多少個CPU進行運算,預設是None,表示1。如果設定為-1則表示使用全部cpu。

1.2 線性迴歸例子

import numpy as np
from sklearn.linear_model import LinearRegression
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# y = 1 * x_0 + 2 * x_1 + 3
y = np.dot(X, np.array([1, 2])) + 3
reg = LinearRegression().fit(X, y)
reg.score(X, y)
#列印線性迴歸的相關係數,在二維空間中,就是斜率k
print(reg.coef_)
#打線性迴歸中的獨立項,二維空間中的,b
print(reg.intercept_)

pre = reg.predict(np.array([[3, 5]]))
print(pre)

這個例子取自sklearn官網,先是生成一個二維的x向量,然後對每個向量,根據公式生成y值。公式是

y = x11 + x22 + 3

得到y值後,拿去訓練一個模型,由於公式已知,那結果自然也就知道了。訓練好模型後,可以直接檢視係數和獨立項,也就是k和b。最後可以拿來預測資料了。

各位小夥伴可以執行一下自然就知道結果了。

二.其他迴歸模型介紹

迴歸分析是統計學中常見的一種分析方法,在之前也有講過線性迴歸分析和梯度下降相關內容線性迴歸。那麼這次,就來說說除了線性迴歸外,還有哪些迴歸分析方法。

2.1 樹迴歸

以前有介紹過ID3決策樹演算法,不過ID3決策是不適合用作迴歸分析的,但如果用C4.5,那麼就可以來進行迴歸分析。

我們都知道如果是離散值,那麼可以直接選擇某個類別作為分支。比如說有房,沒房這種。但如果是連續的值呢?比如身上的現金,有人有10塊錢,有人有11.5元,這種如果選擇分支呢?

答案是通過遍歷,遍歷全部或部分連續值,嘗試劃分,計算損失函式(損失函式就不貼了,有興趣可以百度詳細的資料),然後選擇一個最合適的劃分(大於或小於這個值)。比如說,選5個人,這5個人身上的現金有[500,20,40,800,3000],那麼遍歷這5個值,最終選到一個損失函式最小的值。比如取到800,那麼就是[大於800]和[小於800]著兩個區間。通過這種方式可以讓決策樹也實現迴歸分析,當然,分析結果和線性迴歸就不大相同了。

我在網上找了兩個圖,一看就知道樹迴歸和線性迴歸的區別了。

左邊的圖就是樹迴歸,右邊是線性迴歸。樹迴歸按段來劃分,所以看起來像一棵樹橫著放。而線性迴歸基本上總是處理成一條直線來擬合。

迴歸樹的主要優點,是能夠對複雜的資料,以及非線性的資料進行建模。但如果是線性資料,一般線性迴歸會比迴歸樹的效果好。

2.2 Stepwise Regression逐步迴歸

說到這個,就得先解釋一下多重共線性這個問題了。

多重共線性:指多個自變數之間有高度相似或高關聯性的現象。比如以房價預測為例,房屋面積和房間個數就是相關的,將這兩個自變數一同作為特徵,就容易出現多重共線性問題。

為解決多重共線性,就有了逐步迴歸的解決方法。逐步迴歸一個常見做法,就是先只有一個變數。逐漸加入其他特徵,看看模型的效果會不會變好,如果變好了,就讓這個特徵加入模型中,否則不加。

這一過程不斷迭代,直到沒有其他特徵。

當然限於篇幅,這裡只是比較粗淺的介紹,有興趣的小夥伴可以自己上網瞭解更多。

2.3 Ridge Regression嶺迴歸和Lasso Regression套索迴歸

嶺迴歸和套索迴歸也是為了解決多重共線性的問題,但和逐步迴歸從特徵上動手腳不一樣的是,嶺迴歸和套索迴歸是從計算過程來嘗試解決問題的。

這裡引用一下脊迴歸(Ridge Regression)這篇博文中的介紹:

當設計矩陣XX存在多重共線性的時候(數學上稱為病態矩陣),最小二乘法求得的引數ww在數值上會非常的大,而一般的線性迴歸其模型是 y=wTxy=wTx ,顯然,就是因為ww在數值上非常的大,所以,如果輸入變數xx有一個微小的變動,其反應在輸出結果上也會變得非常大,這就是對輸入變數總的噪聲非常敏感的原因。

如果能限制引數ww的增長,使ww不會變得特別大,那麼模型對輸入ww中噪聲的敏感度就會降低。這就是脊迴歸和套索迴歸(Ridge Regression and Lasso Regrission)的基本思想。

為了限制模型引數ww的數值大小,就在模型原來的目標函式上加上一個懲罰項,這個過程叫做正則化(Regularization)。

如果懲罰項是引數的l2l2範數,就是脊迴歸(Ridge Regression)

如果懲罰項是引數的l1l1範數,就是套索迴歸(Lasso Regrission)

小結

今天主要介紹了sklearn中線性迴歸的引數,以及使用sklearn來訓練線性迴歸模型。然後介紹了其他各個線性迴歸模型及主要作用和優缺點。

以上~


推薦閱讀:
Windows上IDEA搭建最新Spark2.4.3原始碼閱讀及除錯的開發環境
Scala 函數語言程式設計指南(一) 函式式思想介紹
通俗地說決策樹演算法(二)例項解析
大資料儲存的進化史 --從 RAID 到 Hadoop Hdfs
C,java,Python,這些名字背後的江湖