【用戶指南|監督學習】1.1-線性模型

下面是一組用於迴歸的方法,其中目標值 yy 是輸入變量 xx 的線性組合。 在數學概念中,如果 y^\hat y 是預測值。
y^(w,x)=w0+w1x1++wpxp \hat y (w, x) = w_0 + w_1x_1 + \dots + w_px_p
在整個模塊中,我們定義向量 w=(w1,,wp)w=(w_1,\dots,w_p) 作爲 coef_,定義 w0w_0 作爲 intercept_

1. 普通最小二乘法

LinearRegression 擬合一個帶有係數 w=(w1,,wp)w=(w_1,\dots,w_p) 的線性模型,使得數據集實際觀測數據和預測數據(估計值)之間的殘差平方和最小。其數學表達式爲:
minwXwy22 \min_{w} || X w - y||_2^2
在這裏插入圖片描述

LinearRegression會調用 fit 方法來擬合數組 Xy,並且將線性模型的係數 ww 存儲在其成員變量 coef_ 中:

>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, 
				 n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])

然而,對於普通最小二乘的係數估計問題,其依賴於模型各項的相互獨立性。當各項是相關的,且設計矩陣 XX 的各列近似線性相關,那麼,設計矩陣會趨向於奇異矩陣,這種特性導致最小二乘估計對於隨機誤差非常敏感,可能產生很大的方差。例如,在沒有實驗設計的情況下收集到的數據,這種多重共線性(multicollinearity)的情況可能真的會出現。

示例: 線性迴歸示例

該方法使用 XX 的奇異值分解來計算最小二乘解。如果 XX 是一個形狀爲 (n_samples, n_features) 的矩陣,設 npn \ge p,則該方法的複雜度爲 O(np2)O(np^2)

2. 嶺迴歸和分類

2.1 迴歸

Ridge 迴歸通過對係數的大小施加懲罰來解決 普通最小二乘法 的一些問題。 嶺係數最小化的是帶罰項的殘差平方和,
minwXwy22+αw22 \min_{w} \Vert X w - y \Vert_2^2 + \alpha \Vert w \Vert_2^2
其中, α0\alpha \ge 0 是控制係數收縮量的複雜性參數: $\alpha $的值越大,收縮量越大,模型對共線性的魯棒性也更強。

在這裏插入圖片描述

與其他線性模型一樣, Ridgefit 方法完成擬合,並將模型係數 ww 存儲在其 coef_ 成員中:

>>> from sklearn import linear_model
>>> reg = linear_model.Ridge (alpha = .5)
>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
 normalize=False, random_state=None, solver='auto', tol=0.001)
>>> reg.coef_
array([ 0.34545455,  0.34545455])
>>> reg.intercept_
0.13636...

2.2 分類

示例:

2.3 嶺迴歸複雜度

這種方法與 普通最小二乘法 的複雜度是相同的。

2.4 置正則化參數: 廣義交叉驗證

RidgeCV 通過內置的關於的 alpha 參數的交叉驗證來實現嶺迴歸。 該對象與 GridSearchCV 的使用方法相同,只是它默認爲廣義交叉驗證(Generalized Cross-Validation, GCV),這是一種有效的留一驗證方法(LOO-CV):

>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])       
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, 
		fit_intercept=True, scoring=None,
	 	normalize=False)
>>> reg.alpha_                                      
0.1

指定 cv 屬性的值將觸發(通過GridSearchCV的)交叉驗證。例如,cv=10 將觸發 10 折的交叉驗證,而不是廣義交叉驗證(GCV)。

參考資料 : “Notes on Regularized Least Squares”, Rifkin & Lippert (technical report, course slides).

3. Lasso

Lasso 是擬合稀疏係數的線性模型。 它在一些情況下是有用的,因爲它傾向於使用具有較少參數值的情況,有效地減少給定解決方案所依賴變量的數量。 因此,Lasso 及其變體是壓縮感知領域的基礎。 在一定條件下,它可以恢復一組非零權重的精確集(見壓縮感知_斷層重建)。

在數學公式表達上,它由一個帶有 1\ell_1 先驗的正則項的線性模型組成。 其最小化的目標函數是:
minw12nsamplesXwy22+αw1 \min_{w} { \frac{1}{2n_{\text{samples}}} \Vert X w - y\Vert_2 ^ 2 + \alpha \Vert w \Vert_1}
lasso 估計解決了加上罰項 αw1\alpha \Vert w \Vert_1 的最小二乘法的最小化,其中, α\alpha 是一個常數, w1\Vert w \Vert_1 是參數向量的 1norm\ell_1-norm 範數。

Lasso 類的實現使用了座標下降算法(coordinate descent)來擬合係數。 查看 最小角迴歸 ,這是另一種方法:

>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha=0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
      normalize=False, positive=False, precompute=False, 
      random_state=None, selection='cyclic', tol=0.0001, 
      warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])

對於較簡單的任務,同樣有用的是函數 lasso_path 。它能夠通過搜索所有可能的路徑上的值來計算係數。

示例:

注意: 使用 Lasso 進行特徵選擇,由於 Lasso 迴歸產生稀疏模型,因此可以用於執行特徵選擇,詳見 基於 L1 的特徵選取

下面兩篇參考解釋了scikit-learn座標下降算法中使用的迭代,以及用於收斂控制的對偶間隙計算的理論基礎。

參考資料

  • “Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 (Paper).
  • “An Interior-Point Method for Large-Scale L1-Regularized Least Squares,” S. J. Kim, K. Koh, M. Lustig, S. Boyd and D. Gorinevsky, in IEEE Journal of Selected Topics in Signal Processing, 2007 (Paper)

3.1 設置正則化參數

alpha 參數控制估計係數的稀疏度。

3.1.1 使用交叉驗證

scikit-learn 通過交叉驗證來公開設置 Lasso alpha 參數的對象: LassoCVLassoLarsCVLassoLarsCV 是基於下面將要提到的 最小角迴歸 算法。

對於具有許多線性迴歸的高維數據集, LassoCV 最常見。 然而,LassoLarsCV 在尋找 alpha參數值上更具有優勢,而且如果樣本數量比特徵數量少得多時,通常 LassoLarsCVLassoCV 要快。

在這裏插入圖片描述

在這裏插入圖片描述

3.1.2 基於信息標準的模型選擇

有多種選擇時,估計器 LassoLarsIC 建議使用信息判據(Akaike information criterion, AIC) 或貝葉斯信息判據(Bayes Information criterion, BIC)。 當使用 k-fold 交叉驗證時,正則化路徑只計算一次而不是 k + 1 次,所以找到 α\alpha 的最優值是一種計算上更經濟的替代方法。 然而,這樣的判據需要對解決方案的自由度進行適當的估計,它會假設模型是正確的,對大樣本(漸近結果)進行導出,即數據實際上是由該模型生成的。 當問題嚴重受限(比樣本更多的特徵)時,它們也容易崩潰。

示例: Lasso模型選擇-交叉驗證/AIC/BIC

3.1.3 與 SVM 的正則化參數的比較

alpha 和 SVM 的正則化參數 C 之間的等式關係是 alpha = 1 / C 或者 alpha = 1 / (n_samples * C) ,並依賴於估計器和模型優化的確切的目標函數。

4. 多任務 Lasso

MultiTaskLasso 是一個估計多元迴歸稀疏係數的線性模型: y 是一個形狀爲(n_samples, n_tasks) 的二維數組,其約束條件和其他迴歸問題(也稱爲任務)是一樣的,都是所選的特徵值。

下圖比較了通過使用簡單的 LassoMultiTaskLasso 得到的 W 中非零的位置。Lasso 估計產生分散的非零值,而 MultiTaskLasso 的一整列都是非零的。

在這裏插入圖片描述

在這裏插入圖片描述

擬合 time-series model (時間序列模型),強制任何活動的功能始終處於活動狀態。

示例: 多任務Lasso實現聯合特徵選擇

在數學上,它由一個線性模型組成,以混合的 12\ell_1 \ell_2 作爲正則化器進行訓練。目標函數最小化是:
minw12nsamplesXWYFro2+αW21 \min_{w} { \frac{1}{2n_{\text{samples}}} \Vert X W - Y\Vert_{\text{Fro}} ^ 2 + \alpha \Vert W \Vert_{21}}
其中 FroFro 表示 Frobenius 標準:
AFro=ijaij2 \Vert A \Vert_{\text{Fro}} = \sqrt{\sum_{ij} a_{ij}^2}
並且 12\ell_1 \ell_2 讀取爲:
A21=ijaij2. \Vert A \Vert_{2 1} = \sum_i \sqrt{\sum_j a_{ij}^2}.
MultiTaskLasso 類的實現使用了座標下降作爲擬合係數的算法。

5. 彈性網絡

彈性網絡 是一種使用 L1L2 範數作爲先驗正則項訓練的線性迴歸模型。 這種組合允許擬合到一個只有少量參數是非零稀疏的模型,就像 Lasso 一樣,但是它仍然保持了一些類似於 Ridge 的正則性質。我們可利用 l1_ratio 參數控制 L1L2 的凸組合。

彈性網絡在很多特徵互相聯繫的情況下是非常有用的。Lasso 很可能只隨機考慮這些特徵中的一個,而彈性網絡更傾向於選擇兩個。

在實踐中,LassoRidge 之間權衡的一個優勢是它允許在循環過程(Under rotate)中繼承 Ridge 的穩定性。

在這裏,最小化的目標函數是:
minw12nsamplesXwy22+αρw1+α(1ρ)2w22 \min_{w} { \frac{1}{2n_{\text{samples}}} \Vert X w - y \Vert_2 ^ 2 + \alpha \rho \Vert w \Vert_1 + \frac{\alpha(1-\rho)}{2} \Vert w \Vert_2 ^ 2}
在這裏插入圖片描述

ElasticNetCV 類可以通過交叉驗證來設置參數 alpha( α\alpha ) 和 l1_ratio (ρ\rho) 。

示例:

下面兩篇參考解釋了scikit-learn座標下降算法中使用的迭代,以及用於收斂控制的對偶間隙計算的理論基礎。

參考資料

  • “Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 (Paper).
  • “An Interior-Point Method for Large-Scale L1-Regularized Least Squares,” S. J. Kim, K. Koh, M. Lustig, S. Boyd and D. Gorinevsky, in IEEE Journal of Selected Topics in Signal Processing, 2007 (Paper)

6. 多任務彈性網絡

MultiTaskElasticNet 是一個對多回歸問題估算稀疏參數的彈性網絡: Y 是一個二維數組,形狀是 (n_samples,n_tasks)。 其限制條件是和其他迴歸問題一樣,是選擇的特徵,也稱爲 tasks 。

從數學上來說, 它包含一個混合的12\ell_1 \ell_2先驗和 2\ell_2 先驗爲正則項訓練的線性模型 目標函數就是最小化:
minW12nsamplesXWYFro2+αρW21+α(1ρ)2WFro2 \min_{W} { \frac{1}{2n_{\text{samples}}} \Vert X W - Y \Vert_{\text{Fro}}^2 + \alpha \rho \Vert W \Vert_{2 1} + \frac{\alpha(1-\rho)}{2} \Vert W \Vert_{\text{Fro}}^2}
MultiTaskElasticNet 類中的實現採用了座標下降法求解參數。在 MultiTaskElasticNetCV 中可以通過交叉驗證來設置參數 alpha (α\alpha ) 和 l1_ratio( ρ\rho) 。

7. 最小角迴歸

最小角迴歸(LARS) 是對高維數據的迴歸算法,由 Bradley Efron, Trevor Hastie, Iain Johnstone 和 Robert Tibshirani 開發完成。 LARS逐步迴歸很像。在每一步,它都尋找與響應最有關聯的預測。當有很多預測有相同的關聯時,它並不會繼續利用相同的預測,而是在這些預測中找出應該等角的方向。

LARS的優點:

  • p >> n,該算法數值運算上非常有效,(例如當維度的數目遠超點的個數)
  • 它在計算上和前向選擇一樣快,和普通最小二乘法有相同的運算複雜度。
  • 它產生了一個完整的分段線性的解決路徑,在交叉驗證或者其他相似的微調模型的方法上非常有用。
  • 如果兩個變量對響應幾乎有相等的聯繫,則它們的係數應該有相似的增長率。因此這個算法和我們直覺 上的判斷一樣,而且還更加穩定。
  • 它很容易修改併爲其他估算器生成解,比如 Lasso

LARS 的缺點:

  • 因爲 LARS 是建立在循環擬合剩餘變量上的,所以它對噪聲非常敏感。這個問題,在 2004 年統計年鑑的文章由 Weisberg 詳細討論。

LARS 模型可以在 Lars ,或者它的底層實現 lars_pathlars_path_gram中被使用。

8. LARS Lasso

LassoLars是一個使用 LARS 算法的 lasso 模型,不同於基於座標下降法的實現,它可以得到一個精確解,也就是一個關於自身參數標準化後的一個分段線性解。

在這裏插入圖片描述

>>> from sklearn import linear_model
>>> reg = linear_model.LassoLars(alpha=.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])  
LassoLars(alpha=0.1, copy_X=True, eps=..., fit_intercept=True,
     fit_path=True, max_iter=500, normalize=True, positive=False,
     precompute='auto', verbose=False)
>>> reg.coef_    
array([0.717157..., 0.        ])

示例: 使用LARS計算Lasso路徑

Lars 算法提供了一個幾乎無代價的沿着正則化參數的係數的完整路徑,因此常利用函數 lars_pathlars_path_gram來取回路徑。

8.1 數學表達式

該算法和逐步迴歸非常相似,但是它沒有在每一步包含變量,它估計的參數是根據與 其他剩餘變量的聯繫來增加的。

在 LARS 的解中,沒有給出一個向量的結果,而是給出一條曲線,顯示參數向量的 L1 範式的每個值的解。 完全的參數路徑存在 coef_path_ 下。它的 size(n_features, max_features+1)。 其中第一列通常是全 0 列。

參考資料: Original Algorithm is detailed in the paper Least Angle Regression by Hastie et al.

9. 正交匹配追蹤法(OMP)

OrthogonalMatchingPursuit (正交匹配追蹤法)和 orthogonal_mp使用了 OMP 算法近似擬合了一個帶限制的線性模型,該限制影響於模型的非 0 係數(例:L0 範數)。

就像最小角迴歸一樣,作爲一個前向特徵選擇方法,正交匹配追蹤法可以近似一個固定非 0 元素的最優向量解:
argminγyXγ22 subject to γ0nnonzero_coefs \underset{\gamma}{\operatorname{arg min }} \Vert y - X\gamma \Vert_2^2 \text{ subject to } \Vert \gamma \Vert_0 \leq n_{\text{nonzero\_coefs}}
正交匹配追蹤法也可以針對一個特殊的誤差而不是一個特殊的非零係數的個數。可以表示爲:
argminγγ0 subject to yXγ22tol \underset{\gamma}{\operatorname{arg min }} \Vert \gamma \Vert_0 \text{ subject to } \Vert y-X\gamma \Vert_2^2 \leq \text{tol}
OMP 是基於每一步的貪心算法,其每一步元素都是與當前殘差高度相關的。它跟較爲簡單的匹配追蹤(MP)很相似,但是相比 MP 更好,在每一次迭代中,可以利用正交投影到之前選擇的字典元素重新計算殘差。

示例: 正交匹配追蹤](https://scikit-learn.org/stable/auto_examples/linear_model/plot_omp.html)

參考資料:

10. 貝葉斯迴歸

貝葉斯迴歸可以用於在預估階段的參數正則化: 正則化參數的選擇不是通過人爲的選擇,而是通過手動調節數據值來實現。

上述過程可以通過引入無信息先驗到模型中的超參數來完成。 在 嶺迴歸中使用的 2\ell_{2} 正則項相當於在 ww 爲高斯先驗條件,且此先驗的精確度爲 λ1\lambda^{-1} 時,求最大後驗估計。在這裏,我們沒有手工調參數 lambda ,而是讓他作爲一個變量,通過數據中估計得到。

爲了得到一個全概率模型,輸出 yy 也被認爲是關於 XwX w 的高斯分佈。
p(yX,w,α)=N(yXw,α) p(y|X,w,\alpha) = \mathcal{N}(y|X w,\alpha)
α\alpha 在這裏也是作爲一個變量,通過數據中估計得到。

貝葉斯迴歸有如下幾個優點:

  • 它能根據已有的數據進行改變。
  • 它能在估計過程中引入正則項。

貝葉斯迴歸有如下缺點:

  • 它的推斷過程是非常耗時的。

參考資料

  • 一個對於貝葉斯方法的很好的介紹 C. Bishop: Pattern Recognition and Machine learning
  • 詳細介紹原創算法的一本書 Bayesian learning for neural networks by Radford M. Neal

10.1 貝葉斯嶺迴歸

BayesianRidge利用概率模型估算了上述的迴歸問題,其先驗參數 ww 是由以下球面高斯公式得出的:
p(wλ)=N(w0,λ1Ip) p(w|\lambda) = \mathcal{N}(w|0,\lambda^{-1}\mathbf{I}_{p})
先驗參數 α\alphaλ\lambda 一般是服從 γ\gamma 分佈 ,這個分佈與高斯成共軛先驗關係。 得到的模型一般稱爲貝葉斯嶺迴歸,並且這個與傳統的 Ridge 非常相似。

參數 wwα\alphaλ\lambda 是在模型擬合的時候一起被估算出來的,其中參數 α\alphaλ\lambda 通過最大似然估計得到。scikit-learn的實現是基於文獻(Tipping,2001)的附錄A,參數 α\alphaλ\lambda 的更新是基於文獻(MacKay,1992)。

剩下的超參數α1\alpha_1α2\alpha_2γ1\gamma_1以及 γ2\gamma_2 是關於 α\alphaλ\lambdaγ\gamma 分佈的先驗。 它們通常被選擇爲無信息先驗 。默認 α1=α2=λ1=λ2=106\alpha_1 = \alpha_2 = \lambda_1 = \lambda_2 = 10^{-6}

在這裏插入圖片描述

貝葉斯嶺迴歸用來解決迴歸問題:

>>> from sklearn import linear_model
>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
>>> Y = [0., 1., 2., 3.]
>>> reg = linear_model.BayesianRidge()
>>> reg.fit(X, Y)
BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True,
 fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300,
 normalize=False, tol=0.001, verbose=False)

在模型訓練完成後,可以用來預測新值:

>>> reg.predict ([[1, 0.]])
array([ 0.50000013])

權值 ww 可以被這樣訪問:

>>> reg.coef_
array([ 0.49999993,  0.49999993])

由於貝葉斯框架的緣故,權值與普通最小二乘法產生的不太一樣。 但是,貝葉斯嶺迴歸對病態問題(ill-posed)的魯棒性要更好。

示例: 貝葉斯嶺迴歸

參考資料

10.2 主動相關決策理論—ARD

ARDRegression(主動相關決策理論)和 Bayesian Ridge Regression 非常相似,但是會導致一個更加稀疏的權重ww

ARDRegression 提出了一個不同的 ww 的先驗假設。具體來說,就是弱化了高斯分佈爲球形的假設。

它採用 ww 分佈是與軸平行的橢圓高斯分佈。也就是說,每個權值 $w_{i} $從一箇中心在 0 點,精度爲 λi\lambda_{i} 的高斯分佈中採樣得到的。

p(wλ)=N(w0,A1) p(w|\lambda) = \mathcal{N}(w|0,A^{-1})
並且 diag  (A)=λ={λ1,...,λp}diag \; (A) = \lambda = \{\lambda_{1},...,\lambda_{p}\}.

與 Bayesian Ridge Regression 不同, 每個 $w_{i} $都有一個標準差 λi\lambda_i 。所有 λi\lambda_i的先驗分佈由超參數 λ1\lambda_1λ2\lambda_2 確定的相同的 γ\gamma 分佈確定。

在這裏插入圖片描述

ARD 也被稱爲稀疏貝葉斯學習相關向量機

示例: Automatic Relevance Determination Regression (ARD)

參考資料:

11. Logistic 迴歸

Logistic 迴歸,雖然名字裏有“迴歸”二字,但實際上是解決分類問題的一類線性模型。在某些文獻中,logistic迴歸又被稱作 logit 迴歸最大熵分類(maximum-entropy classification, MaxEnt),或對數線性分類器(log-linear classifier)。該模型利用函數 logistic function 將單次試驗(single trial) 的可能結果輸出爲概率。

scikit-learn 中 logistic 迴歸在 LogisticRegression 類中實現了二分類(binary)、一對多分類(one-vs-rest)及多項式 logistic 迴歸,並帶有可選的 L1L2 正則化。

注意 : scikit-learn 的邏輯迴歸在默認情況下使用 L2 正則化,這樣的方式在機器學習領域是常見的,在統計分析領域是不常見的。正則化的另一優勢是提升數值穩定性。scikit-learn通過將 C設置爲很大的值實現無正則化。

作爲優化問題,帶 L2 罰項的二分類 logistic 迴歸要最小化以下代價函數(cost function):
minw,c12wTw+Ci=1nlog(exp(yi(XiTw+c))+1) \underset{w, c}{min\,} \frac{1}{2}w^T w + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1)
類似地,帶 L1 正則的 logistic 迴歸解決的是如下優化問題:
minw,cw1+Ci=1nlog(exp(yi(XiTw+c))+1) \underset{w, c}{min\,} \Vert w \Vert_1 + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1)
Elastic-Net 正則化是 L1L2 的組合,來使如下代價函數最小:
minw,c1ρ2wTw+ρw1+Ci=1nlog(exp(yi(XiTw+c))+1) \min_{w, c} \frac{1 - \rho}{2}w^T w + \rho \Vert w \Vert_1 + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1)
其中 ρ\rho 控制正則化 L1與正則化 L2 的強度(對應於 l1_ratio 參數)。

注意: 在這個表示法中,假定目標 yiy_i 在測試時應屬於集合 [-1,1]。我們可以發現 Elastic-Netρ=1\rho=1 時與 L1 罰項等價,在 rho=0rho=0 時與 L2 罰項等價。

LogisticRegression 類中實現了這些優化算法: liblinearnewton-cglbfgssagsaga

  • liblinear 應用了座標下降算法(Coordinate Descent, CD),並基於 scikit-learn 內附的高性能 C++ 庫 LIBLINEAR library 實現。不過 CD 算法訓練的模型不是真正意義上的多分類模型,而是基於 one-vs-rest 思想分解了這個優化問題,爲每個類別都訓練了一個二元分類器。因爲實現在底層使用該求解器的 LogisticRegression 實例對象表面上看是一個多元分類器。 sklearn.svm.l1_min_c 可以計算使用 L1C 的下界,以避免模型爲空(即全部特徵分量的權重爲零)。

  • lbfgssagnewton-cg 求解器只支持 L2 罰項以及無罰項,對某些高維數據收斂更快。這些求解器的參數 multi_class設爲 multinomial 即可訓練一個真正的多項式 logistic 迴歸 ,其預測的概率比默認的 one-vs-rest 設定更爲準確。

  • sag 求解器基於平均隨機梯度下降算法(Stochastic Average Gradient descent)。在大數據集上的表現更快,大數據集指樣本量大且特徵數多。

  • saga 求解器是 sag 的一類變體,它支持非平滑(non-smooth)的 L1 正則選項 penalty="l1" 。因此對於稀疏多項式 logistic 迴歸 ,往往選用該求解器。saga求解器是唯一支持彈性網絡正則選項的求解器。

  • lbfgs是一種近似於Broyden–Fletcher–Goldfarb–Shanno算法的優化算法,屬於準牛頓法。lbfgs求解器推薦用於較小的數據集,對於較大的數據集,它的性能會受到影響。

總的來說,各求解器特點如下:

罰項 liblinear lbfgs newton-cg sag saga
多項式損失+L2罰項 ×
一對剩餘(One vs Rest) + L2罰項
多項式損失 + L1罰項 × × × ×
一對剩餘(One vs Rest) + L1罰項 × × ×
彈性網絡 × × × ×
無罰項 ×
表現
懲罰偏置值(差) × × × ×
大數據集上速度快 × × ×
未縮放數據集上魯棒 × ×

默認情況下,lbfgs求解器魯棒性佔優。對於大型數據集,saga求解器通常更快。對於大數據集,還可以用 SGDClassifier ,並使用對數損失(log loss) 這可能更快,但需要更多的調優。

示例

liblinear 的區別:

fit_intercept=False 擬合得到的 coef_ 或者待預測的數據爲零時,用 solver=liblinearLogisticRegressionLinearSVC 與直接使用外部 liblinear 庫預測得分會有差異。這是因爲, 對於 decision_function 爲零的樣本, LogisticRegressionLinearSVC 將預測爲負類,而 liblinear 預測爲正類。 注意: 設定了 fit_intercept=False ,又有很多樣本使得 decision_function 爲零的模型,很可能會欠擬合,其表現往往比較差。建議您設置 fit_intercept=True 並增大 intercept_scaling

注意: 利用稀疏 logistic 迴歸進行特徵選擇

L1 罰項的 logistic 迴歸 將得到稀疏模型(sparse model),相當於進行了特徵選擇(feature selection),詳情參見 基於 L1 的特徵選取

LogisticRegressionCV 對 logistic 迴歸 的實現內置了交叉驗證(cross-validation),可以找出最優的 Cl1_ratio參數 。newton-cgsagsagalbfgs 在高維數據上更快,這是因爲採用了熱啓動(warm-starting)。

參考資料

12. 隨機梯度下降—SGD

隨機梯度下降是擬合線性模型的一個簡單而高效的方法。在樣本量(和特徵數) 很大時尤爲有用。 方法 partial_fit 可用於在線學習(online learning) 或基於外存的學習(out-of-core learning)。

SGDClassifierSGDRegressor 分別用於擬合分類問題和迴歸問題的線性模型,可使用不同的(凸)損失函數,支持不同的罰項。 例如,設定 loss="log" ,則 SGDClassifier 擬合一個邏輯斯蒂迴歸模型,而 loss="hinge" 擬合線性支持向量機(SVM)。

參考資料 : 隨機梯度下降

13. 感知器—Perceptron

Perceptron 是適用於大規模學習的一種簡單算法。默認情況下:

  • 不需要設置學習率(learning rate)。
  • 不需要正則化處理。
  • 僅使用錯誤樣本更新模型。

最後一點表明使用合頁損失(hinge loss) 的感知機比 SGD 略快,所得模型更稀疏。

14. 被動攻擊算法—Passive Aggressive Algorithms

被動攻擊算法是大規模學習的一類算法。和感知機類似,它也不需要設置學習率,不過比感知機多出一個正則化參數 C

  • 對於分類問題,PassiveAggressiveClassifier 可設定 loss='hinge'(PA-I)或 loss='squared_hinge' (PA-II)。
  • 對於迴歸問題,PassiveAggressiveRegressor 可設置 loss='epsilon_insensitive' (PA-I) 或 loss='squared_epsilon_insensitive' (PA-II)。

參考資料 : Online Passive-Aggressive Algorithms K. Crammer, O. Dekel, J. Keshat, S. Shalev-Shwartz, Y. Singer - JMLR 7 (2006)

15. 穩健迴歸(Robustness regression): 處理離羣點(outliers)和模型錯誤

穩健迴歸(robust regression) 特別適用於迴歸模型包含損壞數據(corrupt data)的情況,如離羣點或模型中的錯誤。

在這裏插入圖片描述

15.1 各種使用場景與相關概念

處理包含離羣點的數據時牢記以下幾點:

1) 離羣值在 X 上還是在 y 方向上?

  • 離羣值在 y 方向上

在這裏插入圖片描述

  • 離羣值在 X 方向上

在這裏插入圖片描述

2) 離羣點的比例 VS. 錯誤的量級(amplitude)

離羣點的數量很重要,離羣程度也同樣重要。

  • 低離羣點的數量

在這裏插入圖片描述

  • 高離羣點的數量

在這裏插入圖片描述

穩健擬合(robust fitting)的一個重要概念是崩潰點(breakdown point),即擬合模型(仍準確預測)所能承受的離羣值最大比例。

注意: 在高維數據條件下(n_features大),一般而言很難完成穩健擬合,很可能完全不起作用。

尋找平衡 : 預測器的選擇

  • Scikit-learn提供了三種穩健迴歸的預測器(estimator): RANSACTheil SenHuberRegressor
  • HuberRegressor 一般快於 RANSACTheil Sen ,除非樣本數很大,即 n_samples >> n_features 。 這是因爲 RANSACTheil Sen 都是基於數據的較小子集進行擬合。但使用默認參數時,Theil SenRANSAC 可能不如 HuberRegressor 魯棒。
  • RANSACTheil Sen 更快,在樣本數量上的伸縮性(適應性)更好。
  • RANSAC 能更好地處理 y 方向的大值離羣點(通常情況下)。
  • Theil Sen 能更好地處理x方向中等大小的離羣點,但在高維情況下無法保證這一特點。 實在決定不了的話,請使用 RANSAC

15.2 RANSAC: 隨機抽樣一致性算法(RANdom SAmple Consensus)

隨機抽樣一致性算法(RANdom SAmple Consensus, RANSAC) 利用全體數據中局內點(inliers)的一個隨機子集擬合模型。

RANSAC 是一種非確定性算法,以一定概率輸出一個可能的合理結果,依賴於迭代次數(參數 max_trials)。這種算法主要解決線性或非線性迴歸問題,在計算機視覺攝影測繪領域尤爲流行

算法從全體樣本輸入中分出一個局內點集合,全體樣本可能由於測量錯誤或對數據的假設錯誤而含有噪點、離羣點。最終的模型僅從這個局內點集合中得出。

在這裏插入圖片描述

15.2.1 算法細節

每輪迭代執行以下步驟:

  1. 從原始數據中抽樣 min_samples 數量的隨機樣本,檢查數據是否合法(見 is_data_valid )。
  2. 用一個隨機子集擬合模型(base_estimator.fit )。檢查模型是否合法(見 is_model_valid )。
  3. 計算預測模型的殘差(residual),將全體數據分成局內點和離羣點(base_estimator.predict(X) - y)。絕對殘差小於 residual_threshold 的全體數據認爲是局內點。
  4. 若局內點樣本數最大,保存當前模型爲最佳模型。以免當前模型離羣點數量恰好相等(而出現未定義情況),規定僅當數值大於當前最值時認爲是最佳模型。

上述步驟或者迭代到最大次數(max_trials),或者某些終止條件滿足時停下(見 stop_n_inliersstop_score )。最終模型由之前確定的最佳模型的局內點樣本(一致性集合,consensus set) 預測。

函數 is_data_validis_model_valid 可以識別出隨機樣本子集中的退化組合(degenerate combinations) 並予以丟棄(reject)。即便不需要考慮退化情況,也會使用 is_data_valid,因爲在擬合模型之前調用它能得到更高的計算性能。

示例:

參考資料

15.3 Theil-Sen 預估器: 廣義中值估計器(generalized-median-based estimator)

TheilSenRegressor 估計器:使用中位數在多個維度泛化,對多元異常值更具有魯棒性,但問題是,隨着維數的增加,估計器的準確性在迅速下降。準確性的丟失,導致在高維上的估計值比不上普通的最小二乘法。

示例:

參考資料:

15.3.1 算法理論細節

TheilSenRegressor (普通最小二乘法,OLS)。與 OLS 不同的是,Theil-Sen 是一種非參數方法,這意味着它沒有對底層數據的分佈假設。由於 Theil-Sen 是基於中值的估計,它更適合於損壞的數據即離羣值。在單變量的設置中,Theil-Sen 在簡單的線性迴歸的情況下,其崩潰點大約 29.3% ,這意味着它可以容忍任意損壞的數據高達 29.3% 。

在這裏插入圖片描述

scikit-learn 中實現的 TheilSenRegressor是多元線性迴歸模型的推廣,利用了空間中值方法,它是多維中值的推廣 。

關於時間複雜度和空間複雜度,Theil-Sen 的尺度根據:
(nsamplesnsubsamples) \binom{n_{samples}}{n_{subsamples}}
這使得它不適用於大量樣本和特徵的問題。因此,可以選擇一個亞羣的大小來限制時間和空間複雜度,只考慮所有可能組合的隨機子集。

示例: 廣義中值估計器迴歸

參考資料:

15.4 Huber迴歸

HuberRegressorRidge 不同,因爲它對於被分爲異常值的樣本應用了一個線性損失。如果這個樣品的絕對誤差小於某一閾值,樣品就被分爲內圍值。它不同於 TheilSenRegressorRANSACRegressor,因爲它沒有忽略異常值的影響,並分配給它們較小的權重。

在這裏插入圖片描述

這個 HuberRegressor 最小化的損失函數是:
minw,σi=1n(σ+Hm(Xiwyiσ)σ)+αw22 \underset{w, \sigma}{min\,} {\sum_{i=1}^n\left(\sigma + H_m\left(\frac{X_{i}w - y_{i}}{\sigma}\right)\sigma\right) + \alpha { \Vert w \Vert_2}^2}
其中:
Hm(z)={z2,if z<ϵ2ϵzϵ2,otherwise H_m(z) = \begin{cases} z^2, & \text {if } \vert z \vert \lt \epsilon \\ 2\epsilon \vert z \vert - \epsilon^2, & \text{otherwise} \end{cases}
建議設置參數 epsilon 爲 1.35 以實現 95% 統計效率。

15.5 注意

HuberRegressor 與將損失設置爲 huberSGDRegressor 並不相同,體現在以下方面的使用方式上。

  • HuberRegressor 是標度不變性的. 一旦設置了 epsilon ,通過不同的值向上或向下縮放 Xy ,就會跟以前一樣對異常值產生同樣的魯棒性。相比 SGDRegressor 其中 epsilonXy 被縮放的時候必須再次設置。
  • HuberRegressor 應該更有效地使用在小樣本數據,同時 SGDRegressor 需要一些訓練數據的 passes 來產生一致的魯棒性。

示例: 強異常數據集上的huberregression與 Ridge

參考資料: Peter J. Huber, Elvezio M. Ronchetti: Robust Statistics, Concomitant scale estimates, pg 172

另外,這個估計是不同於 R 實現的 Robust Regression (http://www.ats.ucla.edu/stat/r/dae/rreg.htm) ,因爲 R 實現加權最小二乘,權重考慮到每個樣本並基於殘差大於某一閾值的量。

16. 多項式迴歸: 用基函數展開線性模型

機器學習中一種常見的模式,是使用線性模型訓練數據的非線性函數。這種方法保持了一般快速的線性方法的性能,同時允許它們適應更廣泛的數據範圍。

例如,可以通過構造係數的 polynomial features 來擴展一個簡單的線性迴歸。在標準線性迴歸的情況下,你可能有一個類似於二維數據的模型:
y^(w,x)=w0+w1x1+w2x2 \hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2
如果我們想把拋物面擬合成數據而不是平面,我們可以結合二階多項式的特徵,使模型看起來像這樣:
y^(w,x)=w0+w1x1+w2x2+w3x1x2+w4x12+w5x22 \hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2 + w_3 x_1 x_2 + w_4 x_1^2 + w_5 x_2^2
觀察到這還是一個線性模型(這有時候是令人驚訝的): 看到這個,想象創造一個新的變量。
z=[x1,x2,x1x2,x12,x22] z = [x_1, x_2, x_1 x_2, x_1^2, x_2^2]
有了這些重新標記的數據,我們可以將問題寫成
y^(w,x)=w0+w1z1+w2z2+w3z3+w4z4+w5z5 \hat{y}(w, x) = w_0 + w_1 z_1 + w_2 z_2 + w_3 z_3 + w_4 z_4 + w_5 z_5
我們看到,所得的 polynomial regression 與我們上文所述線性模型是同一類(即關於 ww 是線性的),因此可以用同樣的方法解決。通過用這些基函數建立的高維空間中的線性擬合,該模型具有靈活性,可以適應更廣泛的數據範圍。

這裏是一個例子,使用不同程度的多項式特徵將這個想法應用於一維數據:

在這裏插入圖片描述

這個圖是使用 PolynomialFeatures 預創建。該預處理器將輸入數據矩陣轉換爲給定度的新數據矩陣,使用方法如下:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1],
 [2, 3],
 [4, 5]])
>>> poly = PolynomialFeatures(degree=2)
>>> poly.fit_transform(X)
array([[  1.,   0.,   1.,   0.,   0.,   1.],
 [  1.,   2.,   3.,   4.,   6.,   9.],
 [  1.,   4.,   5.,  16.,  20.,  25.]])

X 的特徵已經從 [x1,x2][x_1, x_2] 轉換到 [1,x1,x2,x12,x1x2,x22][1, x_1, x_2, x_1^2, x_1 x_2, x_2^2], 並且現在可以用在任何線性模型。

這種預處理可以通過 Pipeline 工具進行簡化。可以創建一個表示簡單多項式迴歸的單個對象,使用方法如下所示:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.pipeline import Pipeline
>>> import numpy as np
>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),
...                   ('linear', LinearRegression(fit_intercept=False))])
>>> # fit to an order-3 polynomial data
>>> x = np.arange(5)
>>> y = 3 - 2 * x + x ** 2 - x ** 3
>>> model = model.fit(x[:, np.newaxis], y)
>>> model.named_steps['linear'].coef_
array([ 3., -2.,  1., -1.])

利用多項式特徵訓練的線性模型能夠準確地恢復輸入多項式係數。

在某些情況下,沒有必要包含任何單個特徵的更高的冪,只需要相乘最多 dd 個不同的特徵即可,所謂 交互特徵(interaction features) 。這些可通過設定 PolynomialFeaturesinteraction_only=True 得到。

例如,當處理布爾屬性,對於所有 xin=xix_i^n = x_i,因此是無用的;但 xixjx_i x_j 代表兩布爾結合。這樣我們就可以用線性分類器解決異或問題:

>>> from sklearn.linear_model import Perceptron
>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
>>> y = X[:, 0] ^ X[:, 1]
>>> y
array([0, 1, 1, 0])
>>> X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)
>>> X
array([[1, 0, 0, 0],
 [1, 0, 1, 0],
 [1, 1, 0, 0],
 [1, 1, 1, 1]])
>>> clf = Perceptron(fit_intercept=False, max_iter=10, tol=None,
...                  shuffle=False).fit(X, y)

分類器的 predictions 是完美的:

>>> clf.predict(X)
array([0, 1, 1, 0])
>>> clf.score(X, y)
1.0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章