當我們使用數(shù)據訓練分類器的時候,很重要的一點就是要在過度擬合與擬合不足之間達成一個平衡。防止過度擬合的一種方法就是對模型的復雜度進行約束。模型中用到解釋變量的個數(shù)是模型復雜度的一種體現(xiàn)??刂平忉屪兞總€數(shù)有很多方法,例如變量選擇(feature selection),即用filter或wrapper方法提取解釋變量的最佳子集。或是進行變量提取(feature structure),即將原始變量進行某種映射或轉換,如主成分方法和因子分析。變量選擇的方法是比較“硬”的方法,變量要么進入模型,要么不進入模型,只有0-1兩種選擇。但也有“軟”的方法,也就是Regularization類方法,例如嶺回歸(Ridge Regression)和套索方法(LASSO:least absolute shrinkage and selection operator)。
這兩種方法的共同點在于,將解釋變量的系數(shù)加入到Cost Function中,并對其進行最小化,本質上是對過多的參數(shù)實施了懲罰。而兩種方法的區(qū)別在于懲罰函數(shù)不同。但這種微小的區(qū)別卻使LASSO有很多優(yōu)良的特質(可以同時選擇和縮減參數(shù))。
公式中的lambda是重要的設置參數(shù),它控制了懲罰的嚴厲程度,如果設置得過大,那么最后的模型參數(shù)均將趨于0,形成擬合不足。如果設置得過小,又會形成擬合過度。所以lambda的取值一般需要通過交叉檢驗來確定。
在R語言中可以使用glmnet包來實施套索算法。我們采用的數(shù)據集是Machine Learning公開課中第七課的一個算例。先來看看這個樣本數(shù)據的散點圖。下圖顯示有兩個類別等待我們來區(qū)分。顯然其決策邊界是非線性的,所以如果要用Logistic Regression來作分類器的話,解釋變量需要是多項式形式。但這里存在一個問題,我們應該用幾階的多項式呢?如果階數(shù)過高,模型變量過多,會存在過度擬合,而反之階數(shù)過少,又會存在擬合不足。所以這里我們用LASSO方法來建立Logistic回歸分類器。
[size=1.05em]
分析步驟如下:
- 根據算例要求,先生成有六階多項式的自變量,這樣一共有28個自變量;
- 用glmnet包中的cv.glmnet函數(shù)建模,該函數(shù)自帶交叉檢驗功能;
- 根據上面的結果繪制CV圖如下,從中選擇最佳lambda值。
[size=1.05em]
cv.glmnet函數(shù)利用交叉檢驗,分別用不同的lambda值來觀察模型誤差。上圖橫軸是lambda值的對數(shù),縱軸是模型誤差。從上面的圖可以看到,最佳的lambda取值就是在紅色曲線的最低點處,對應著變量個數(shù)是11個。它右側的另一條虛線是在其一倍SE內的更簡潔的模型(變量個數(shù)為9)。由于這兩個lambda對應的模型誤差變化不大,而我們更偏好于簡潔的模型,選擇對應的lambda值為0.025。
在使用cv.glmnet函數(shù)選擇lambda值之后,我們沒有必要去運行glmnet函數(shù),直接從結果中就可以提取最終模型(9個變量)并獲得參數(shù)系數(shù)。為了利于比較我們還提取了原始模型(28個變量)的參數(shù)系數(shù)。
最后我們要在原來的散點圖上畫出兩條決策邊界,一條是根據LASSO方法得到的9變量模型,下圖中紫色曲線即是它決策邊界,決策邊界比較平滑,具備很好的泛化能力。另一條是28個變量的原始模型。 藍色曲線即是它的決策邊界,它為了擬合個別樣本,顯得凸凹不平。
如果你的數(shù)據變異較大,那么在做LASSO之前最好進行數(shù)據標準化處理。LASSO的進一步擴展是和嶺回歸相結合,形成Elastic Net方法。glmnet包也可以實施這種算法。








暫無數(shù)據