線性迴歸算法梳理


我想從一個鏈進行講述:

一. 機器學習:

因爲我們是把我們人類的“經驗”以數據的形式來存儲,所以我們想着能不能讓機器從這些數據進行學習,歸納中我們人類中的經驗來進行推理。簡稱機器學習。
工程化定義:假設用P來評估計算機程序在某任務類T上的性能,若一個程序通過利用經驗E在T中任務上獲得了性能改善,則我們就說關於T和P,該程序對E進行了學習。
人話就是:我們想讓機器從我們這些人類的經驗進行學習來幫我們解決一些任務,解決這些問題都會有一個評價指標,作爲機器完成這個任務的好壞。
其中機器學習所研究的主要內容,是關於在計算機上從數據中產生“模型”的算法,也就是學習“算法”。也就是說我們研究這些算法如何讓機器更好地從數據中進行學習。

監督學習、無監督學習的定義:
工程化定義:上面的經驗數據是否有任務對應的標記信息,有標記信息的是監督學習、沒有是無監督學習。
人話就是:就是上面的數據,是有否任務對應的正確答案,例如一個與世隔絕的人在你面前,他一點都沒見過這個世界,你想訓練他適應社會,你想讓他把你班同學分男、女兩類。如果你和他說哪些是男同學哪些是女同學就是監督學習;如果沒有和他說,讓他憑自己的看到的感覺來分,那就是無監督學習。

泛化能力,過擬合,欠擬合:
工程化定義:學得模型適用於新樣本的能力,成爲“泛化”能力。如果學得的能力在訓練集的效果很好,測試集很差,是過擬合。如果學到的能力連在訓練集的效果都很差的,是欠擬合
人話就是:接上面的例子,就是那個人學習完你和他說的男女分類任務之後,分辨不是你班同學的其他人的性別的能力,如果發現他分辨出你班同學的性別的能力很好,但是分辨其他人性別的能力,那就是過擬合;如果發現連你們同學性別都分辨不出來,那就是欠擬合

偏差:所有可能的訓練數據集訓練出的所有模型的輸出的平均值與真實模型的輸出值之間的差異,即刻畫了學習算法本身的擬合能力;
方差:不同的訓練數據集訓練出的模型輸出值之間的差異,即刻畫了數據擾動所造成的影響。

偏差、方差與過擬合、欠擬合的關係:
欠擬合:模型不能適配訓練樣本,有一個很大的偏差。
過擬合:模型很好的適配訓練樣本,但在測試集上表現很糟,有一個很大的方差。

過擬合的解決方法:增加數據;簡化模型(選擇更加簡單的算法、減少使用的參數或特徵數量、對模型正則化);減少訓練數據中的噪聲。也就是減少方差
欠擬合的解決方法:尋找更好的具有代表性的特徵;使用更多的的特徵。也就是減少偏差。

在機器學習裏,通常我們不能將所有的訓練數據放到模型裏面,否則我將沒有多餘的數據來評估這個模型的好壞。
有幾種解決方法:

  • 設置驗證集,這是最常見的做法。就是把模型分成訓練集和測試集,一般按照7:3來劃分。我們用訓練集來訓練,用測試集來評估模型。
    可是存在兩個弊端,
    1.最終模型與參數的選取將極大程度依賴於你對訓練集和測試集的劃分方法。爲啥,我們可以看這一張圖:
    在這裏插入圖片描述
    右邊是十種不同的訓練集和測試集劃分方法得到的test MSE曲線,可以看到在不同的劃分方法下,test MSE的變動是很大的,而且對應的最有degree也不一樣。所以如果我們的訓練集和測試集的劃分方法不夠好,很有可能無法選擇到最好的模型與參數。
    2.只用了部分數據進行模型的訓練,無法充分利用數據。

所以提出了交叉驗證
其中有一個K-fold Cross Validation,就是用多個數據作爲測試集,其他的數據都作爲訓練集,具體的數目由K來決定。比如,如果K=5,那麼我們利用五折交叉驗證步驟就是:

  1. 將所有數據集分成五分
  2. 2.不重複地每次取一份做測試集,用其他四份做訓練集來訓練模型,之後計算該模型在測試集上MSEiMSE_i
  3. 將5次的MSEiMSE_i取平均值得到最後的MSE
    通過交叉驗證技術,可以不需要單獨的驗證集實現模型比較(用於模型選擇和調整超參數),節省寶貴的訓練數據。

二.線性迴歸的原理

按照維基百科的定義:
線性迴歸是利用稱爲線性迴歸方程的最小平方函數對一個或多個自變量和因變量之間關係進行建模的一種迴歸分析。這種函數是一個或多個稱爲迴歸係數的模型參數的線性組合。只有一個自變量的情況成爲簡單迴歸,大於一個自變量情況的叫做多元迴歸。

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

損失函數公式:
L(θ)=yif(xi)L(\theta) = |y_i - f(x_i)|一般針對單個樣本 i
線性迴歸的損失函數:
(wi,bi)=argmin(yiwxib)2(w^*_i, b^*_i) = argmin(y_i - wx_i - b)^2

代價函數公式:L(θ)=1/Ni=1Nyif(xi)L(\theta)=1/N *\sum_{i=1}^N|y_i - f(x_i)|一般針對總體
線性迴歸的代價函數:(w,b)=argmin(1/(2N)i=1N(yiwxib))(w^*, b^*) = argmin(1/(2*N) *\sum_{i=1}^N(y_i - wx_i -b))

目標函數公式:L(θ)=1/Ni=1Nyif(xi)+L(\theta)=1/N *\sum_{i=1}^N|y_i - f(x_i)| + 正則化項
線性迴歸目標函數公式:(w,b)=1/(2N)i=1N(yif(xi))2+λi=1N(θj2)(w^*, b^*) = 1/(2*N) *\sum_{i=1}^N(y_i - f(x_i))^2 + \lambda\sum_{i=1}^N(\theta_j^2)
可能會奇怪正式的式子是絕對值,線性迴歸會用上平方和常數1/2,爲了方便偏微分計算所以進行了優化,而且不影響我們找到模型的最佳w和b。

四優化方法:

1.梯度下降法
目標函數L(θ)L(\theta)關於參數θ\theta的梯度將是目標函數上升最快的方向。對於最小化優化問題,只需要將參數沿着梯度相反的方向邁一步,就可以實現目標函數的下降,其中有一個學習率α\alpha,他決定了我們沿着能讓代價函數下降程度最大的方向向下邁出的步子有多大。
公式:
θ=θα1NθL(θ)\theta = \theta - \alpha \frac{1}{N} \nabla _{\theta}L(\theta)
θL(θ)=df(θ)θ\nabla _{\theta}L(\theta) = \frac{df(\theta)}{\theta}
通過這樣不斷優化得到最佳的w和b。

2.牛頓法
牛頓法不僅可以用來求解函數的極值問題,還可以用來求解方程的根,二者在本質上是一個問題,因爲求解函數極值的思路是尋找導數爲0的點。
和梯度下降法一樣,牛頓法也是尋找導數爲0的點,同樣是一種迭代法,核心思想是在某點處用二次函數來近似目標函數,得到導數爲0的方程,求解該方程,從而得到下一個迭代的點,通過這樣反覆迭代,直到達到導數爲0的點處(因爲是用二次函數近似,因此可能會有誤差)。
我們先進一元函數的情況,然後推廣到多元函數。
一元函數的情況
根據一元函數的泰勒展開公式,我們對目標函數在x0x_0(隨機選取或者某種方法確定)點處做泰勒展開,有:
f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)2+...+1n!fn(x0)(xx0)n...f(x) = f(x_0) +f^{\prime}(x_0)(x-x_0) + \frac{1}{2}f^{\prime \prime}(x_0)(x-x_0)^2 +...+\frac{1}{n!}f^{n}(x_0)(x-x_0)^n...
忽略2次以上的項則有:
f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)2f(x) = f(x_0) +f^{\prime}(x_0)(x-x_0) + \frac{1}{2}f^{\prime \prime}(x_0)(x-x_0)^2
然後我們在x0x_0點處,要以它爲基礎,找到導數爲0的點,即導數爲0。對上面等式兩邊同時求導,並令導數爲0,可以得到下面的方程:
f(x)=f(x0)+f(x0)(xx0)=0f^{\prime}(x) = f^{\prime}(x_0) +f^{\prime \prime}(x_0)(x-x_0) =0
可以解得:
x=x0f(x0)f(x0)x = x_0 - \frac{f^{\prime}(x_0) }{f^{\prime \prime}(x_0) }
這樣我們就得到了下一點的位置,從而走到x1x_1.。接下來重複這個過程,直到到達導數爲0的點,由此得到牛頓法的迭代公式:
xt+1=xtf(xt)f(xt)x_{t+1} = x_t - \frac{f^{\prime}(x_t) }{f^{\prime \prime}(x_t) }
總結:初始迭代點x0x_0,反覆用上面的公式進行迭代,直到達到導數爲0的點或者達到最佳迭代次數。

二元函數的情況
下面的講解需要對Hessian的概念有着先驗的瞭解。
根據多元函數的泰勒展開公式,我們對目標函數在x0x_0點處做泰勒展開,有:
f(x)=f(x0)+f(x0)T(xx0)+12(xx0)T2f(x0)(xx0)+ο((xx0)2)f(x) = f(x_0) + \nabla f(x_0)^T(x-x_0) + \frac{1}{2}(x-x_0)^T \nabla ^2f(x_0)(x - x_0) + \omicron((x-x_0)^2)
忽略二次及以上的項,並對上式兩邊同時求梯度,得到函數的導數(梯度向量)爲:
(x)=f(x0)+2f(x0)(xx0)\nabla (x) = \nabla f(x_0) + \nabla ^2f(x_0)(x-x_0)
其中2f(x0)\nabla ^2f(x_0)即爲Hessian矩陣,在後面我們寫成H。令函數梯度爲0,則有:
f(x0)+2f(x0)(xx0)=0x=x0(2f(x0))1f(x0)\nabla f(x_0) + \nabla ^2f(x_0)(x-x_0) = 0 \Longrightarrow x=x_0-(\nabla ^2 f(x_0))^{-1}\nabla f(x_0)
這是一個線性方程組的解。如果將梯度向量簡寫爲g,上面的公式可以簡寫爲:
x=x0H1gx = x_0-H^{-1}g
從初始點x0x_0開始,反覆計算函數在x0x_0處的Hessian矩陣和梯度向量,然後用下述公式進行迭代:
xk+1=xkHk1gkx_{k+1} = x_k-H^{-1}_kg_k
最終會到達函數的駐點處。其中H1g-H^{-1}g稱爲牛頓方向。迭代終止的條件是梯度的模接近於0,然後函數值下降小於指定閾值。

2.擬牛頓法
牛頓法在每次迭代時需要計算出Hessian矩陣,然後求解一個以該矩陣爲係數矩陣的線性方程組,這非常耗時,另外Hessian矩陣可能不可逆。爲此提出了一些改進的方法,典型的代表是擬牛頓法(Quasi-Newton).
擬牛頓法的思想是不計算目標函數的Hessian矩陣然後求逆矩陣,而是通過其他手段得到Hessian矩陣或其逆矩陣的近似矩陣。具體做法是構造一個近似Hessian矩陣或其逆矩陣的正定對稱矩陣,用該矩陣進行牛頓法的迭代。將函數在xk+1x_{k+1}點出進行泰勒展開,忽略二次以上的項,有:
f(x) f(xk+1)+f(xk+1)T(xxk+1)+12(xxk+1)T2f(xk+1)(xxk+1)f(x) \approx\ f(x_{k+1})+\nabla f(x_{k+1})^{T}(x-x_{k+1}) +\frac{1}{2}(x-x_{k+1})^T \nabla ^2f(x_{k+1})(x-x_{k+1})
對上式兩邊同時去梯度,有:
f(x) f(xk+1)+2f(xk+1)(xxk+1)\nabla f(x) \approx\ \nabla f(x_{k+1})+\nabla ^2f(x_{k+1})(x-x_{k+1})
X=XkX = X_k,有:
f(xk+1)f(xk) 2f(xk+1)(xk+1xk)\nabla f(x_{k+1}) - \nabla f(x_{k}) \approx\ \nabla ^2f(x_{k+1})(x_{k+1}-x_{k})
這可以簡寫爲:
gk+1gk Hk+1(xk+1xk)g_{k+1} - g_{k} \approx\ H_{k+1}(x_{k+1} - x_{k})
如果令:
sk=xk+1xks_k = x_{k+1} - x_{k}
yk=gk+1gky_k = g_{k+1} - g_{k}
上式可以簡寫爲:
yk=Hk+1sky_k = H_{k+1}s_k
即:
sk Hk+11yks_k \approx\ H^{-1}_{k+1} y_{k}
根據此條件,構造出了多種擬牛頓法,典型的有DFP算法、BFGS算法、L-BFGS算法等,在這裏我們重點介紹BFGS算法。下圖列出了常用的擬牛頓法的迭代公式:
在這裏插入圖片描述
BFGS算法是它的四個發明人Broyden,Fletcher,Goldfarb和Shanno名字首字母的簡寫。算法的思想是構造Hessian矩陣的近似矩陣:
Bk HkB_k \approx\ H_k
並迭代更新這個矩陣:
Bk+1=Bk+ΔBkB_{k+1} = B_{k} + \Delta B_k
該矩陣的初始值B0B_0爲單位陣l。這樣,要解決的問題就是每次的修正矩陣ΔBk\Delta B_k的構造。其計算公式爲:
ΔBk=αuuT+βvvT\Delta B_{k} = \alpha uu^T+ \beta vv^{T}
其中:
u=yku = y_k
v=Bkskv = B_k s_k
α=1ykTsk\alpha = \frac{1}{y_k^T s_k}
β=1skTBksk\beta = - \frac{1}{s_k^T B_k s_k}
因此有
ΔBk=ykykTykTskBkskskTBkskTBksk\Delta B_k = \frac{y_k y_k^T}{y_k^T s_k} - \frac{B_ks_ks_k^TB_k}{s^T_kB_ks_k}
因此算的的完整流程爲:
1.給定的優化變量的初始值x0x_0和精度閾值ε\varepsilon,令B0=I,K=0B_0 = I, K=0
2.確定搜索方向dk=Bk1gkd_k = -B_k^{-1}g_k
3.搜索得到步長λk\lambda _k,令Sk=λkdk,Xk+1=Xk+SkS_k = \lambda _kd_k, X_{k+1} = X_{k} + S_k
4.如果gk+1<ε||g_{k+1}|| < \varepsilon,則迭代結束
5.計算Yk=gk+1gkY_k = g_{k+1} - g_{k}
6.計算Bk+1=Bk+YkykTYkYSkBkSkSkTBkSkTBkxSkB_{k+1} = B_{k} + \frac{Y_ky_k^T}{Y_k^YS_k}-\frac{B_kS_kS_k^TB_k}{S_k^TB_kxS_k}
7.令K=K+1,返回步驟2
每一步迭代需要計算nxn的矩陣DkD_k,當n很大時,存儲改矩陣非常損耗內存。爲此提出了改進方法L-BFGS,其思想是不存完整的矩陣DkD_k,只存儲向量SkS_kYkY_k

五 線性迴歸的評估指標:

對模型的泛化性能進行評估,不僅需要有效可行的實驗估計方法,還需要衡量模型泛化能力的評價標準,這就是評估指標。我們需要根據任務的需求來確定評價標準。
在預測任務中,給定樣例集D={(x1,y1),(x2,y2),...,(xm,ym)(x_1,y_1),(x_2,y_2),...,(x_m,y_m)},其中yiy_i是示例xix_i的真實標記。要評估模型f的性能,就要把學習期預測結果f(x)與真實標記y進行比較。
迴歸任務最常用的性能度量是“均方誤差”(mean squared error)
E(f;D)=1mi=1n(f(xi)yi)2E(f;D) = \frac{1}{m}\sum_{i=1}^n (f(x_i)-y_i)^2
更一般的,對於數據分佈D和概率密度函數p( )p(\cdot\ ),均方誤差課描述爲:
E(f;D)=xD(f(x)y)2p(x)dxE(f;D) = \quad \int_{x \in D} (f(x)-y)^2p(x)dx
線性迴歸基本用上面的評估指標

六 sklearn參數詳解:

一般我們通過這個方法來調度
sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
參數解析:
fit_intercept:boolean,optional,default True
是否計算此模型的截距。如果設置爲False,則不會在計算中使用截距(例如,預計數據已經居中)。
normalize : boolean, optional, default False
當fit_intercept設置爲False時,將忽略此參數。如果爲True,則迴歸量X將在迴歸之前通過減去平均值併除以l2範數來歸一化。如果您希望標準化,請在使用normalize = False的估算器調用fit之前使用sklearn.preprocessing.StandardScaler。
copy_X : boolean, optional, default True
如果爲True,則將複製X;否則,它可能會被覆蓋。
n_jobs : int or None, optional (default=None)
用於計算的內核數。這隻會爲n_targets> 1和足夠大的問題提供加速。除非在joblib.parallel_backend上下文中,否則表示1。 -1表示使用所有處理器。有關詳細信息,請參閱詞彙表。(這個是谷歌翻譯,具體的意思個人認爲是選擇計算機的幾核來加速)

屬性:
coef_ : array, shape (n_features, ) or (n_targets, n_features)
線性迴歸問題的估計係數。如果在擬合(y 2D)期間傳遞多個目標,則這是二維數組的維度(n_targets,n_features),而如果僅傳遞一個目標,則這是長度n_features的一維數組。

方法:
fit(X, y[, sample_weight]) 擬合線性模型.
get_params([deep]) 爲估算其器獲得參數.
predict(X) 使用線性模型預測
score(X, y[, sample_weight]) 返回預測的確定係數R2R^2
set_params(**params) 設置估算器的參數。
參數:
X : 數組或稀疏矩陣,維度(n_samples,n_features);訓練的時候是訓練數據,預測的時候是預測數據
y:數組,維度(n_samples,n_targets) 標籤值。如有必要,將被轉換爲X的dtype
sample_weight:numpy數組維度[n_samples] 每個樣品的單獨權重。
deep :boolean, optional 如果爲True,將返回此估計器的參數幷包含作爲估算器的子對象

參考文獻:
https://zhuanlan.zhihu.com/p/24825503
https://zhuanlan.zhihu.com/p/38853908
《機器學習》(西瓜書)
《Hands-on Machine Learning with Scikit-Learn & Tensorflow》
2014年吳恩達機器學習課程
https://blog.csdn.net/u013709270/article/details/78667531
https://zhuanlan.zhihu.com/p/37588590
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression

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