【Scikit-Learn 中文文檔】廣義線性模型 - 監督學習 - 用戶指南 | ApacheCN

中文文檔: http://sklearn.apachecn.org/cn/0.19.0/tutorial/basic/tutorial.html

英文文檔: http://sklearn.apachecn.org/en/0.19.0/tutorial/basic/tutorial.html

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

1.1. 廣義線性模型

下面是一組用於迴歸的方法,其中目標期望值 y是輸入變量 x 的線性組合。 在數學概念中,如果 \hat{y} 是預測值 value.

\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p

在整個模塊中,我們定義向量 w = (w_1,..., w_p) 作爲 coef_ 定義 w_0 作爲 intercept_.

如果需要使用廣義線性模型進行分類,請參閱 logistic 迴歸 . logistic 迴歸.

1.1.1. 普通最小二乘法

LinearRegression 適合一個帶有係數 w = (w_1, ..., w_p) 的線性模型,使得數據集實際觀測數據和預測數據(估計值)之間的殘差平方和最小。其數學表達式爲:

\underset{w}{min\,} {|| X w - y||_2}^2

../_images/sphx_glr_plot_ols_0011.png

LinearRegression 會調用 fit 方法來擬合數組 X, y,並且將線性模型的係數 w 存儲在其成員變量 ``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])

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

1.1.1.1. 普通最小二乘法複雜度

該方法使用 X 的奇異值分解來計算最小二乘解。如果 X 是一個 size 爲 (n, p) 的矩陣,設 n \geq p ,則該方法花費的成本爲 O(n p^2)

1.1.2. 嶺迴歸

Ridge 迴歸通過對係數的大小施加懲罰來解決 普通最小二乘法 (普通最小二乘)的一些問題。 嶺係數最小化一個帶罰項的殘差平方和,

\underset{w}{min\,} {{|| X w - y||_2}^2 + \alpha {||w||_2}^2}

其中, \alpha \geq 0 是控制收縮量複雜性的參數: \alpha, 的值越大,收縮量越大,因此係數對共線性變得更加魯棒。

../_images/sphx_glr_plot_ridge_path_0011.png

與其他線性模型一樣, Ridge 採用 fit 將採用其 w 存儲在其 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...

舉例:

  • :ref:`sphx_glr_auto_examples_linear_model_plot_ridge_path.py`( 作爲正則化的函數,繪製嶺係數 )
  • :ref:`sphx_glr_auto_examples_text_document_classification_20newsgroups.py`( 使用稀疏特徵的文本文檔分類 )

1.1.2.1. 嶺迴歸的複雜度

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

1.1.2.2. 設置正則化參數:廣義交叉驗證

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

參考

1.1.3. Lasso

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

在數學上,它由一個線性模型組成,以 \ell_1 爲準。 其目標函數的最小化是:

\underset{w}{min\,} { \frac{1}{2n_{samples}} ||X w - y||_2 ^ 2 + \alpha ||w||_1}

lasso estimate 解決了加上罰項 \alpha ||w||_1 的最小二乘法的最小化,其中, \alpha 是一個常數, ||w||_1 是參數向量的 \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])

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

舉例:

Note

   

Feature selection with Lasso(使用 Lasso 進行 Feature 的選擇)

由於 Lasso 迴歸產生稀疏模型,因此可以用於執行特徵選擇,詳見 基於 L1 的特徵選取 (基於L1的特徵選擇).

1.1.3.1. 設置正則化參數

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

1.1.3.1.1. 使用交叉驗證

scikit-learn 通過交叉驗證來公開設置 Lasso alpha 參數的對象: LassoCV and LassoLarsCV。 LassoLarsCV 是基於下面解釋的 :ref:`least_angle_regression`(最小角度迴歸)算法。

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

lasso_cv_1 lasso_cv_2

1.1.3.1.2. 基於信息標準的模型選擇

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

../_images/sphx_glr_plot_lasso_model_selection_0011.png

舉例:

  • :ref:`sphx_glr_auto_examples_linear_model_plot_lasso_model_selection.py`(Lasso 型號選擇:交叉驗證/AIC/BIC)

1.1.3.1.3. 與 SVM 的正則化參數的比較

根據估計器和模型優化的精確目標函數,在 alpha 和 SVM 的正則化參數之間是等值的,其中 C 是通過 alpha = 1 / C 或者 alpha = 1 / (n_samples * C) 得到的。

1.1.4. 多任務 Lasso

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

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

multi_task_lasso_1 multi_task_lasso_2

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

舉例:

在數學上,它由一個線性模型組成,以混合的 \ell_1 \ell_2 作爲正則化器進行訓練。目標函數最小化是:

\underset{w}{min\,} { \frac{1}{2n_{samples}} ||X W - Y||_{Fro} ^ 2 + \alpha ||W||_{21}}

其中 Fro 表示 Frobenius 標準:

||A||_{Fro} = \sqrt{\sum_{ij} a_{ij}^2}

並且 \ell_1 \ell_2 讀取爲:

||A||_{2 1} = \sum_i \sqrt{\sum_j a_{ij}^2}

MultiTaskLasso 類中的實現使用了座標下降作爲擬合係數的算法。

1.1.5. 彈性網絡

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

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

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

在這裏,最小化的目標函數是

\underset{w}{min\,} { \frac{1}{2n_{samples}} ||X w - y||_2 ^ 2 + \alpha \rho ||w||_1 +\frac{\alpha(1-\rho)}{2} ||w||_2 ^ 2}

ElasticNetCV 類可以通過交叉驗證來設置參數

alpha (\alpha) 和 l1_ratio (\rho) 。

1.1.6. 多任務彈性網絡

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

從數學上來說, 它包含一個用 \ell_1 \ell_2 先驗 and \ell_2 先驗爲正則項訓練的線性模型 目標函數就是最小化:

\underset{W}{min\,} { \frac{1}{2n_{samples}} ||X W - Y||_{Fro}^2 + \alpha \rho ||W||_{2 1} +\frac{\alpha(1-\rho)}{2} ||W||_{Fro}^2}

在 MultiTaskElasticNet 類中的實現採用了座標下降法求解參數。

在 MultiTaskElasticNetCV 中可以通過交叉驗證來設置參數 alpha (\alpha) 和 l1_ratio (\rho) 。

1.1.7. 最小角迴歸

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

LARS的優點:

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

LARS的缺點:

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

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

1.1.8. LARS Lasso

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

../_images/sphx_glr_plot_lasso_lars_0011.png
>>>
>>> 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算法提供了一個可以幾乎無代價的給出正則化係數的完整路徑,因此常利用函數 lars_path 來取回路徑。

1.1.8.1. 數學表達式

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

該算法沒有給出一個向量的結果,而是在LARS的解中,對每一個變量進行總體變量的L1正則化後顯示的一條曲線。 完全的參數路徑存在``coef_path_``下。它的尺寸是 (n_features, max_features+1)。 其中第一列通常是全0列。

參考文獻:

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

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

就像最小角迴歸一樣,作爲一個前向特徵選擇方法,正交匹配追蹤法可以近似一個固定非0元素的最優 向量解:

\text{arg\,min\,} ||y - X\gamma||_2^2 \text{ subject to } \||\gamma||_0 \leq n_{nonzero\_coefs}

正交匹配追蹤法也可以不用特定的非0參數元素個數做限制,而是利用別的特定函數定義其損失函數。 這個可以表示爲:

\text{arg\,min\,} ||\gamma||_0 \text{ subject to } ||y-X\gamma||_2^2 \\leq \text{tol}

OMP是基於每一步的貪心算法,其每一步元素都是與當前殘差高度相關的。它跟較爲簡單的匹配追蹤 (MP)很相似,但是相比MP更好,在每一次迭代中,可以利用正交投影到之前選擇的字典元素重新計算殘差。

1.1.10. 貝葉斯迴歸

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

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

爲了得到一個全概率模型,輸出 y 也被認爲是關於 X w:的高斯分佈。

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

1.1.10.1. 貝葉斯嶺迴歸

貝葉斯嶺迴歸 利用概率模型估算了上述的迴歸問題,其先驗參數 w 是由以下球面高斯公式得出的:

p(w|\lambda) =\mathcal{N}(w|0,\lambda^{-1}\bold{I_{p}})

先驗參數 \alpha 和 \lambda 一般是服從 gamma 分佈 <https://en.wikipedia.org/wiki/Gamma_distribution> , 這個分佈與高斯成共軛先驗關係。

得到的模型一般稱爲 貝葉斯嶺迴歸, 並且這個與傳統的 Ridge 非常相似。參數 w\alpha 和 \lambda 是在模型擬合的時候一起被估算出來的。 剩下的超參數就是 gamma 分佈的先驗了。 \alpha 和 \lambda 。 它們通常被選擇爲 沒有信息量 。模型參數的估計一般利用 最大似然對數估計法 。

默認 \alpha_1 = \alpha_2 =  \lambda_1 = \lambda_2 = 10^{-6}.

../_images/sphx_glr_plot_bayesian_ridge_0011.png

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

>>>
>>> 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])

權值 w 可以被這樣訪問:

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

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

參考文獻

1.1.10.2. 主動相關決策理論 - ARD

主動相關決策理論 和 貝葉斯嶺迴歸 非常相似,

但是會導致一個更加稀疏的權重 w [1] [2]。 主動相關決策理論 提出了一個不同於 w 的先驗假設。具體來說,就是弱化了高斯分佈爲球形的假設。 它採用的是關於 w 軸平行的橢圓高斯分佈。

也就是說,每個權值 w_{i} 精確度來自於一箇中心在0點,精度爲 \lambda_{i} 的分佈中採樣得到的。

p(w|\lambda) = \mathcal{N}(w|0,A^{-1})

並且 diag \; (A) = \lambda = \{\lambda_{1},...,\lambda_{p}\}.

與 貝葉斯嶺迴歸 不同, 每個 w_{i} 都有一個標準差 \lambda_i 。所有的關於方差的係數 \lambda_i 和由給定的超參數 \lambda_1 、 \lambda_2 由相同的gamma分佈。

../_images/sphx_glr_plot_ard_0011.png

ARD 也被稱爲 稀疏貝葉斯學習 或 相關向量機 [3] [4].

參考文獻:

[1] Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 7.2.1
[2] David Wipf and Srikantan Nagarajan: A new view of automatic relevance determination
[3] Michael E. Tipping: Sparse Bayesian Learning and the Relevance Vector Machine
[4] Tristan Fletcher: Relevance Vector Machines explained

1.1.11. logistic 迴歸

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

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

若視爲一優化問題,帶 L2 罰項的二分類 logistic 迴歸要最小化以下代價函數(cost function):

\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 迴歸需要求解下式:

\underset{w, c}{min\,} \|w\|_1 + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1) .

在 LogisticRegression 類中實現了這些求解器: “liblinear”, “newton-cg”, “lbfgs”, “sag” 和 “saga”。

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

“lbfgs”, “sag” 和 “newton-cg” solvers (求解器)只支持 L2 罰項,對某些高維數據收斂更快。這些求解器的參數 `multi_class`設爲 “multinomial” 即可訓練一個真正的多元 logistic 迴歸 [5],其預測的概率比默認的 “one-vs-rest” 設定更爲準確。

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

“saga” solver [7] 是 “sag” 的一類變體,它支持非平滑(non-smooth)的 L1 正則選項 penalty="l1" 。因此對於稀疏多元 logistic 迴歸 ,往往選用該求解器。

一言以蔽之,選用求解器可遵循如下規則:

Case Solver
L1正則 “liblinear” or “saga”
多元損失(multinomial loss) “lbfgs”, “sag”, “saga” or “newton-cg”
大數據集(n_samples “sag” or “saga”

“saga” 一般都是最佳的選擇,但出於一些歷史遺留原因默認的是 “liblinear”。

對於大數據集,還可以用 SGDClassifier ,並使用對數損失(’log’ loss)

與 liblinear 的區別:

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

Note

   

利用稀疏 logistic 迴歸(sparse logisitic regression)進行特徵選擇

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

LogisticRegressionCV 對 logistic 迴歸 的實現內置了交叉驗證(cross-validation),可以找出最優的參數 C。”newton-cg”, “sag”, “saga” 和 “lbfgs” 在高維數據上更快,因爲採用了熱啓動(warm-starting)。在多分類設定下,若 multi_class 設爲”ovr”,會爲每類求一個最佳的C值;若 multi_class 設爲”multinomial”,會通過交叉熵損失(cross-entropy loss)求出一個最佳 C 值。

參考文獻:

[5] Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 4.3.4
[6] Mark Schmidt, Nicolas Le Roux, and Francis Bach: Minimizing Finite Sums with the Stochastic Average Gradient.
[7] Aaron Defazio, Francis Bach, Simon Lacoste-Julien: SAGA: A Fast Incremental Gradient Method With Support for Non-Strongly Convex Composite Objectives.

1.1.12. 隨機梯度下降, SGD

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

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

參考文獻

1.1.13. Perceptron(感知器)

Perceptron 是適用於 large scale learning(大規模學習)的一種簡單算法。默認地,

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

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

1.1.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).

參考文獻:

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

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

../_images/sphx_glr_plot_theilsen_0011.png

1.1.15.1. 各種使用場景與相關概念

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

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

    離羣值在y方向上 離羣值在X方向上
    y_outliers X_outliers
  • 離羣點的比例 vs. 錯誤的量級(amplitude)

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

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

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

折中: 預測器的選擇

Scikit-learn提供了三種穩健迴歸的預測器(estimator): RANSAC , Theil Sen 和 HuberRegressor

  • HuberRegressor 一般快於 RANSAC 和 Theil Sen , 除非樣本數很大,即 n_samples >> n_features 。 這是因爲 RANSAC 和 Theil Sen 都是基於數據的較小子集進行擬合。但使用默認參數時, Theil Sen 和 RANSAC 可能不如 HuberRegressor 魯棒。
  • RANSAC 比 Theil Sen 更快,在樣本數量上的伸縮性(適應性)更好。
  • RANSAC 能更好地處理y方向的大值離羣點(通常情況下)。
  • Theil Sen 能更好地處理x方向中等大小的離羣點,但在高維情況下無法保證這一特點。

實在決定不了的話,請使用 RANSAC

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

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

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

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

../_images/sphx_glr_plot_ransac_0011.png

1.1.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 的全體數據認爲是局內點。
  1. 若局內點樣本數最大,保存當前模型爲最佳模型。以免當前模型離羣點數量恰好相等(而出現未定義情況),規定僅當數值大於當前最值時認爲是最佳模型。

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

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

參考文獻:

1.1.15.3. Theil-Sen 預估器: 廣義中值估計

TheilSenRegressor 估計器:使用中位數在多個維度推廣,因此對多維離散值是有幫助,但問題是,隨着維數的增加,估計器的準確性在迅速下降。準確性的丟失,導致在高維上的估計值比不上普通的最小二乘法。

1.1.15.3.1. 算法理論細節

TheilSenRegressor 媲美 Ordinary Least Squares (OLS) (普通最小二乘法(OLS))漸近效率和無偏估計。在對比 OLS, Theil-Sen 是一種非參數方法,這意味着它沒有對底層數據的分佈假設。由於 Theil-Sen 是基於中位數的估計,它是更適合的對損壞的數據。在單變量的設置,Theil-Sen 在一個簡單的線性迴歸,這意味着它可以容忍任意損壞的數據高達 29.3% 的情況下,約 29.3% 的一個崩潰點。

../_images/sphx_glr_plot_theilsen_0011.png

在 scikit-learn 中 TheilSenRegressor 實施如下的學習推廣到多元線性迴歸模型 [8] 利用空間中這是一個概括的中位數多維度 [9] 。

在時間複雜度和空間複雜度,根據 Theil-Sen 量表

\binom{n_{samples}}{n_{subsamples}}

這使得它不適用於大量樣本和特徵的問題。因此,可以選擇一個亞羣的大小來限制時間和空間複雜度,只考慮所有可能組合的隨機子集。

參考文獻:

[8] Xin Dang, Hanxiang Peng, Xueqin Wang and Heping Zhang: Theil-Sen Estimators in a Multiple Linear Regression Model.
[9]
  1. Kärkkäinen and S. Äyrämö: On Computation of Spatial Median for Robust Data Mining.

1.1.15.4. Huber 迴歸

HuberRegressor 不同,因爲它適用於 Ridge 損耗的樣品被分類爲離羣值。如果這個樣品的絕對誤差小於某一閾值,樣品就分爲一層。 它不同於 TheilSenRegressor 和 RANSACRegressor 因爲它無法忽略對離羣值的影響,但對它們的權重較小。

../_images/sphx_glr_plot_huber_vs_ridge_001.png

這個 HuberRegressor 最小化損失函數是由

\underset{w, \sigma}{min\,} {\sum_{i=1}^n\left(\sigma + H_m\left(\frac{X_{i}w - y_{i}}{\sigma}\right)\sigma\right) + \alpha {||w||_2}^2}

其中

H_m(z) = \begin{cases}       z^2, & \text {if } |z| < \epsilon, \\       2\epsilon|z| - \epsilon^2, & \text{otherwise}\end{cases}

建議設置參數 epsilon 爲 1.35 以實現 95% 統計效率。

1.1.15.5. 注意

HuberRegressor 與將損失設置爲 huber 的 SGDRegressor 在以下方面的使用方式上是不同的。

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

參考文獻:

  • 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 不實現加權最小二乘實現每個樣本上給出多少剩餘的基礎重量大於某一閾值。

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

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

例如,可以通過構造係數的 polynomial features 來擴展一個簡單的線性迴歸。在標準線性迴歸的情況下,你可能有一個類似於二維數據的模型:

\hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2

如果我們想把拋物面擬合成數據而不是平面,我們可以結合二階多項式的特徵,使模型看起來像這樣:

\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

(這有時候是令人驚訝的)觀察,這還是 still a linear model : 看到這個,想象創造一個新的變量

z = [x_1, x_2, x_1 x_2, x_1^2, x_2^2]

有了這些數據的重新標記的數據,我們的問題就可以寫了。

\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 是線性模型中的同一類,我們認爲以上(即模型是線性 ),可以用同樣的方法解決。通過考慮在用這些基函數建立的高維空間中的線性擬合,該模型具有靈活性,可以適應更廣泛的數據範圍。

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

../_images/sphx_glr_plot_polynomial_interpolation_0011.png

這個圖是使用 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 的特徵已經從 [x_1, x_2] 轉換到 [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.])

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

在某些情況下,沒有必要包含任何單個特徵的更高的冪,但只需要在大多數 d 不同的特徵上相乘的所謂 interaction features(交互特徵) 。這些可以與設定的 interaction_only=True 的 PolynomialFeatures 得到。

例如,當處理布爾屬性, x_i^n = x_i 所有 n ,因此是無用的;但 x_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



中文文檔: http://sklearn.apachecn.org/cn/0.19.0/tutorial/basic/tutorial.html

英文文檔: http://sklearn.apachecn.org/en/0.19.0/tutorial/basic/tutorial.html

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

有興趣的大佬們也可以和我們一起來維護,持續更新中 。。。

機器學習交流羣: 629470233

發佈了25 篇原創文章 · 獲贊 67 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章