Python機器學習庫SKLearn:監督學習之廣義線性模型

以下是用於迴歸的一組方法,其中預期目標值爲輸入變量的線性組合,在數學概念中,假設{y^}是預測值。


其中,向量 w = (w_1,..., w_p) 作爲一個 coef_ (係數)and w_0 作爲 intercept_(截距)。

1.1.1 普通最小二乘法(Ordinary Least Squares
LinearRegression是具有係數w =(w_1,...,w_p)的以最小化數據集中的觀察到的值與通過線性近似預測的值之間的平方和的殘差的線性模型。 數學上的形式如下:


                                                                                                  

                                                                                

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

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

 

   

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

1.1.2.2 設置正則化參數:generalized交叉驗證

RidgeCV使用內置的alpha參數的交叉驗證實現脊迴歸。 該對象以與GridSearchCV相同的方式工作,除了它默認爲廣義交叉驗證(GCV),一種高效形式的留一交叉驗證:

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

Lasso是一個估計稀疏係數的線性模型。 它在一些上下文中是有用的,因爲其傾向於優選具有較少參數值的解,有效地減少給定解所依賴的變量的數量。 爲此,Lasso及其變體對於壓縮感測領域是基礎。 在某些條件下,它可以恢復非零權重的確切集合(見壓縮感知:用L1 prior(Lasso)進行斷層重建)。
數學上,它包括一個用\ell_1 先驗作爲正則化訓練的線性模型。 最小化的目標函數是:

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

因此,  Lasso估計解決了添加了 \alpha ||w||_1的最小二乘懲罰的最小化,其中\α是常數, ||w||_1是參數向量的\ell_1範數。

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

1.1.3.1 設置正則化參數

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

1.1.3.1.1 使用交叉驗證

scikit-learn通過交叉驗證顯示設置Lasso alpha參數的對象:LassoCV和LassoLarsCV。 LassoLarsCV基於下面解釋的最小角度迴歸算法。
對於具有許多共線迴歸的高維數據集,LassoCV是最常用的。 然而,LassoLarsCV具有探索更相關的α參數值的優點,並且如果樣本的數量與觀察的數量相比非常小,則通常比LassoCV更快。

              lasso_cv_1 lasso_cv_2


1.1.3.1.2 基於信息標準的模型選擇
或者,估計器LassoLarsIC建議使用Akaike信息準則(AIC)和Bayes信息準則(BIC)。 當使用k折交叉驗證時,正則化路徑僅計算一次而不是k + 1次,這是計算上更便宜的替代方法來找到α的最佳值。 然而,這樣的標準需要對解的自由度的適當估計,針對大樣本(漸近結果)導出並且假設模型是正確的,即數據實際上由該模型生成。 當問題嚴重失調(比特徵更多的特徵)時,它們也傾向於斷裂。

                                                                      ../_images/sphx_glr_plot_lasso_model_selection_0011.png

1.1.4. Multi-task Lasso

MultiTaskLasso是一個線性模型,用於聯合估計多個迴歸問題的稀疏係數:y是形狀的二維數組(n_samples,n_tasks)。 約束是所選的特徵對於所有迴歸問題都相同,也稱爲任務。

下圖比較了用簡單Lasso或MultiTaskLasso獲得的W中非零的位置。 Lasso估計產生分散的非零,而MultiTaskLasso的非零是完整列。


multi_task_lasso_1 multi_task_lasso_2

1.1.8. LARS Lasso

LassoLars是一個使用LARS算法實現的套索模型,與基於coordinate_descent的實現不同,這產生了精確的解,它是作爲其係數範數的函數的分段線性。

../_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.        ])

1.1.10. Bayesian Regression 貝葉斯迴歸

1.1.10.1. Bayesian Ridge Regression

貝葉斯嶺迴歸用於迴歸:

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


1.1.11. Logistic regression

邏輯迴歸從名字上看起來像迴歸模型,但是邏輯迴歸是一個分類的線性分類模型而不是一個迴歸模型。 邏輯迴歸在文獻中也稱爲logit迴歸,最大熵分類(MaxEnt)或對數線性分類器。 在這個模型中,描述單個試驗的可能結果的概率使用邏輯函數建模。
scikit-learn中邏輯迴歸的實現可以從LogisticRegression類訪問。 此實現可以適用於二元,可選的L2或L1正則化的One-vs- Rest或多項Logistic迴歸。
作爲優化問題,二元類L2懲罰邏輯迴歸使以下成本函數最小化:

                                                 \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正則邏輯迴歸解決以下優化問題:

                                                 \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”:
求解器“liblinear”使用座標下降(CD)算法,並依賴於優秀的C ++ LIBLINEAR庫,它隨scikit-learn一起提供。然而,在liblinear中實現的CD算法不能學習真正的多項式(多類)模型;相反,優化問題以“一對一”的方式分解,因此爲所有類訓練單獨的二進制分類器。這發生在引擎蓋下,因此使用此解算器的LogisticRegression實例表現爲多類分類器。對於L1懲罰,sklearn.svm.l1_min_c允許計算C的下限,以便得到非“零”(所有特徵權重爲零)模型。
“lbfgs”,“sag”和“newton-cg”求解器僅支持L2懲罰,並且發現對於一些高維數據更快地收斂。使用這些求解器將multi_class設置爲“多項”學習一個真正的多項Logistic迴歸模型[5],這意味着其概率估計應該比默認的“一個vs休息”設置更好地校準。 “lbfgs”,“sag”和“newton-cg”求解器不能優化L1懲罰模型,因此“多項式”設置不學習稀疏模型。
求解器“sag”使用隨機平均梯度下降[6]。對於大型數據集,當樣本數和特徵數都很大時,它比其他求解器更快。
簡而言之,可以選擇具有以下規則的求解器:

Case Solver
Small dataset or L1 penalty “liblinear”
Multinomial loss or large dataset “lbfgs”, “sag” or “newton-cg”
Very Large dataset “sag”




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