1.線性迴歸算法梳理

一.機器學習的一些概念

1.監督學習

簡單來說就是訓練集的每個數據都是一組(特徵值, 標籤值), 也就是每個數據有對應明確的標籤值.舉個例子垃圾郵件分類的例子:
我們手上有一百封有標籤的垃圾郵件, 也就是說對於裏面每一封郵件我們都被告知了是否爲垃圾郵件.然後我們用這個100個訓練集數據對我們的算法進行訓練, 最終用訓練好的算法來預測沒有標籤值的郵件, 也就是最終訓練完成的算法需要對任意一封郵件進行判斷,這封郵件是否爲垃圾郵件.
簡而言之,就是有標籤的訓練集就是監督學習.

2.非監督學習

跟上面的概念相反,也就是訓練集不帶標籤.
比如你開個服裝店,你想根據客人的身高,體重,這兩個特徵值,來劃分衣服S,M,L三個型號.現在你手上有100個客戶資料(即身高,體重),然後你告訴你的算法要對這個100個訓練集分3個類,然後算法就會根據每個客戶已有的特徵值,自動學習,自己找出這些特徵間的規律,然後劃出3個區間.最終我們會用這個新算法,對新客戶進行預測,他將落入哪個區間.
以上就是非監督學習的例子.

3.泛化能力

也就是訓練好的算法,對新樣本的適應能力.拿準確率指標舉個例子,假設我們已經設計好了一個算法,這個算法對訓練集的數據已經能夠達到95%的準確率(我們認爲這個算法對訓練集的準確率已經達到了較高的水平), 現在我們要用這個算法對新樣本進行預測.假設100個新樣本,我們對其也能夠達到 90% 的準確率,那麼我們就認爲這個新算法的泛化能力較 . 但是如果我們對這100個新樣本的預測,只能夠達到 **60%**的準確率,那麼我們就認爲這個模型算法的泛化能力較 , 需要對算法進行改進.

4.過擬合 及對應解決方法

通過泛化能力的瞭解, 我們對訓練集達到95%準確率(假設瞎蒙只能達到50%的準確率),而對新樣本集只能達到60%的準確率的這情況 稱爲過擬合, 也就是模型在訓練集上表現的很好, 但是推廣效果不好.
舉個過擬合的圖形化例子:
過擬合上圖來自 吳恩達-機器學習課程講義:
其中紅X表示訓練集上的每個數據, 藍色的線段表示模型擬合出來的曲線.很明顯,這個曲線能夠完美的符合訓練集上的每個數據,但是我們會預感到,對於新樣本上的數據,很有可能完全不在這個曲線上,並且離曲線的距離較遠.也就是說我們用了過於複雜的模型去擬合這個數據的走向.比如假設數據坐落在x關於y的二次方程上,我們卻用了x關於y的三次,四次甚至是十次方程去擬合,從而導致泛化能力很差.

解決方法:
1.簡化模型,選擇一個參數更少的模型(比如用線性模型, 而不是高階多項式模型), 減少訓練數據的特徵數量或限制模型
2.收集更多的訓練數據,也就是增大訓練集
3.減小訓練數據的噪聲(比如,修改錯誤數據和去除異常值)

限制模型,降低過擬合風險的辦法我們成爲正則化(regularization).也就是在算法中增加參數用以降低(懲罰)W,b兩個參數對算法的影響水平.這個新增的參數若設定的大,那麼就是對(W,b)的懲罰大,也就是大幅降低他們本身對算法的影響,使得模型的斜率幾乎接近於0.如果設置的太低,那麼就幾乎對模型沒有影響,模型還是原本的過擬合情況.

5.欠擬合 及對應解決方法

根據上面我們可以推測出,欠擬合就是跟過擬合相反,也就是用了過於簡單的模型去擬合數據集.比如假設數據坐落在x關於y的二次方程上,我們卻用了x關於y的一次方程去擬合,從而導致泛化能力很差.也就是說我們對訓練集只能達到60%的準確率(假設瞎蒙只能達到50%的準確率),這情況 稱爲欠擬合,對訓練集表現也不好.
舉個欠擬合的圖形化例子:

欠擬合上圖來自 吳恩達-機器學習課程講義:

解決方法:
1.選擇一個更強大的模型,帶有更多參數
2.用更好的特徵訓練學習算法,就是尋找到跟模型相關度高的特徵(比如要找衣服的尺寸SML, 那麼人的身高就是一個高度相關特徵,而今天的天氣就是一個低相關度特徵)
3.減小對模型的限制(比如,減小正則化參數)

6.交叉驗證

爲了避免模型的泛化能力較差,我們會使用交叉驗證的方法.也就是先在訓練集上內部測試,評估通過再用到測試集上,若內部測試結果較差,就調整參數再行驗證.具體方法如下:
我們將訓練集分成k個互補的子集,一般來說爲了使得子集相似,用分層抽樣的方法劃分子集,然後每次用k-1個子集進行訓練,用剩下的那個子集進行測試,重複k次,最終使用k次測試集結果的平均值作爲訓練集的評估結果.
在這裏插入圖片描述 上圖來自 周志華-西瓜書:

二.線性迴歸原理

對於給定的訓練集{(x1, y1), (x2, y2), (x3, y3)…(xn, yn)}, 試圖通過學習,找到最佳w, b的取值, 使得訓練集上的數據能夠符合或者近似方程Y = WX +b(這個就是我們的模型).

三.線性迴歸的損失函數,代價函數,目標函數

Yi(Yi = Wxi + b)表示第i個樣本通過Y = Wx + b 算出來的值, yi表示第i個樣本的標籤值, N表示樣本的總個數.

1.損失函數

即loss function, ( Yi - yi) ^ 2 ,一般是針對單個樣本 i, 這個函數的意思就是在x = xi的情況下(即對於數據xi), 計算出模型推到出的預測值和實際標籤值的差值的平方.如果完美預測,我們可以知道Yi = yi, 則( Yi - yi) ^ 2 = 0.所以我們可以得出, 如果 損失函數 值越大, 那麼就表示第i個數據的預測值和標籤實際值差距越大,也就是擬合誤差越大,反之,如果 損失函數 值越小, 那麼 第i個數據的預測值和標籤實際值就越接近,擬合誤差越小.

2.代價函數

即cost function, 1/N * SUM(( Yi - yi) ^ 2) ,一般是針對總體, 即爲求全部損失函數加總後的均值.

3.目標函數

即Object function, 1/N * SUM(( Yi - yi) ^ 2) + 正則化項
這個也就是我們最終要求優化的函數, 一般來說也就是通過求使得目標函數達到最小的(W, b)組合,來得到我們需要的線性迴歸方程.
其中添加的正則化項是爲了避免過擬合的情況,如果單單使用代價函數求解,會使得最終的模型十分貼近訓練集上的每個數據點,導致泛化能力較差,需要通過添加正則化項,加強泛化能力.

四.線性迴歸函數的優化方法(梯度下降法,牛頓法,擬牛頓法)

爲了求得使目標函數達到最小的(W, b)組合, 也就是說對目標函數取其 最小值,一般而言我們的目標函數是 凸函數,所以即爲對目標函數求導, 求(W,b) 使得其導數爲0. 下面優化方法就是針對如何求得(W, b),也就是(W,b)關於目標函數的方程求解(變量不再是x).以下方法均建立在 凸函數 基礎上,求全局最優

(PS:我自己學的時候會想爲什麼不直接解方程求導數爲0的點,而是用一步一步迭代這麼麻煩.後來瞭解到程序上直接用解方程求解代價比較大,面對高維的時候求解時間比較慢,還是逐步迭代求解來的快)

1.梯度下降法

在目標函數上隨機取一個點a,算出此時的f’(a), 若導數大於0表明函數在該點沿着x軸的正方向趨於增加;反之,表明函數在該點沿着x軸的正方向趨於減小.我們需要每次增加一個步長即a+r, 使得函數趨於減小, 也就是沿着負導數的發現增加步長.通過迭代N次,使得最終函數達到導數爲0的點.如下圖:
在這裏插入圖片描述上圖來自 吳恩達-機器學習課程講義:

數學表達:
1.隨機取一a點 y = f(xa)
2.算出這一點的導數f’(xa)
3.若f’(xa) = 0, 則爲極值點, 由於是凸函數,此極值點就是函數的最值點(全局最優),(W,b)得解.
若f’(xa) > 0 , 則這不是極值點,需要更新a點使得a點往極值點逼近,也就是增加一點步長,並且我們需要沿負導數方向增加,所以更新xa = xa - f’(xa) * r
若f’(xa) < 0 , 則這不是極值點,需要更新a點使得a點往極值點逼近,也就是增加一點步長,並且我們需要沿負導數方向增加,所以更新xa = xa + f’(xa) * r
4.算出更新後a的導數 即f’(xa + r),看導數符號,重複步驟3,直到導數逼近或者等於0,求得(W,b )

2.牛頓法

在這裏插入圖片描述
牛頓法一般是用來求解 方程 f(x) = 0 的解.比如用牛頓法求上圖f(x) = 0的解, 首先我們在座標軸上隨機取一點A, 在A做曲線切線, 與x軸相交於B點, 此時再取點 (B, f(b)) 做曲線切線, 再次與x軸相交,重複上述步驟N次(即迭代N次), 將會得到或是無限逼近 f(x) = 0的點,即解得方程.
數學表達式爲:

  1. A點的切線方程爲:y = f(XA)+f’(XA) * (x-XA)
  2. B點座標: f(XA)+f’(XA) * (x-XA) = 0 推出 XB = XA - f(XA) / f’(XA)
  3. B點切線方程: y = f(XB)+f’(XB) * (x-XB)
  4. n點座標 xn = x(n-1) - f(n-1) / f’(n-1)

現在我們將牛頓法用於求解極值問題,也就是相當於對目標函數的導數求0點.這裏就不再贅述, 注意是先寫出目標函數導數,在運用牛頓法求解.

3.擬牛頓法

牛頓法在每輪迭代中涉及海森矩陣的求逆,計算複雜度相當高,尤其在高維問題中幾乎不可行。若能以較低的計算代價尋求海森矩陣的近似逆矩陣,則可以顯著降低計算的時間,這就是擬牛頓法。

五.評估指標

線性迴歸的評價指標有四種:

均方誤差
在這裏插入圖片描述
值越小越好.受異常值影響較大,可解釋性差

均方根誤差
在這裏插入圖片描述
值越小越好.受異常值影響較大,較爲常用,是用來衡量預測值同實際值之間的偏差

平均絕對值誤差

在這裏插入圖片描述
值越小越好.比於RMSE,受異常值影響較小,是用來衡量預測值同實際值之間的偏差,
但是你並不知道這個值代表模型擬合是優還是劣,只有通過對比才能達到效果.

R2 Score
R2 score
將預測值跟只使用均值的情況下相比,看能好多少。其區間通常在(0,1)之間.0表示還不如什麼都不預測,直接取均值的情況,而1表示所有預測跟真實結果完美匹配的情況.越大越好.

六.sklearn.linear_model.LinearRegression 參數詳解

sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

參數解釋:

fit_intercept: 參數只可設置爲True或False, 默認爲True. 就是是否要爲此模型計算截距(即b). 如果設置爲False, 那麼就默認b=0(也就是說默認數據集已經中心化過了,即過原點,無需b)

normalize :參數只可設置爲True或False, 默認爲False.當 fit_intercept=False的時候,這個參數會被自動忽略.如果設置爲True, 數據集X會在模型調試前自動正則化. 即X = (X - X均值) / l2範數. 如果你希望標準化數據集, 那麼在使用估計器(並將估計器normalize參數設置爲False)前使用sklearn.preprocessing.StandardScaler這個函數.

copy_X : 參數只可設置爲True或False, 默認爲True. 如果爲True, 數據集X將會被複制,估計器在運行的時候使用X的副本,並不會直接在原始數據上進行修改.若爲False, 原始數據會被覆蓋.

n_jobs: int型數值 或者 None , 默認爲None.意思是程序運行的時候使用幾個CPU的核.只有當問題足夠大並且n_targets > 1 (個人認爲這個應該是n_jobs>1)的時候,這個才能起到加速作用. 除非是在joblib.parallel_backend 的環境下,否則None意味着只使用一個核進行計算. -1 意味着使用所有CPU核進行計算. 更多解釋詳見 Glossary.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章