出處:http://blog.csdn.net/autoliuweijie/article/details/50285881
1. 理論
-
概述:
通過對損失函數(即優化目標)加入懲罰項,使得訓練求解參數過程中會考慮到係數的大小,通過設置縮減係數(懲罰係數),會使得影響較小的特徵的係數衰減到0,只保留重要的特徵。常用的縮減係數方法有lasso(L1正則化),嶺迴歸(L2正則化)。
-
縮減係數的目的
2.1 消除噪聲特徵:
如果模型考慮了一些不必要的特徵,那麼這些特徵就算是噪聲。噪聲是沒必要的,使得模型複雜,降低模型準確性,需要剔除。
2.2 消除關聯的特徵:
如果模型的特徵空間中存在關聯的特徵,這會使得模型不適定,即模型參數會有多解。訓練得到的只是其中一個解,這個解往往不能反映模型的真實情況,會誤導模型的分析與理解。訓練求解的模型參數受樣本影響特別大,樣本變化一點點,參數解就跳到另一組解去了。總之,模型是不穩定的。
-
正則化:
什麼是正則化:
對損失函數(目標函數)加入一個懲罰項,使得模型由多解變爲更傾向其中一個解。 在最小二乘法中,可以這樣理解。XTX可能是不可逆的,通過加上正則項,迫使弱的特徵的係數縮減爲0.
3.1 lasso(L1正則化):
與普通的線性迴歸相同,只是把損失函數換成:
這樣,最優化求解參數過程,就會傾向選擇係數比較小的解。當alpha增大,哪些無關的係數會率先縮減爲0。但是L1正則化對相關特徵的消除無能爲力,仍然是不穩定的。
3.2 嶺迴歸(L2正則化):
與普通的線性迴歸相同,只是把損失函數換成:
與lasso相比,這裏的懲罰項加上了平方,這樣就對於相關的兩個特徵,傾向與一個特別大,另一個接近0,起到了消除相關特徵的效果。下圖爲隨着alpha變化,係數的縮減效果。
2. 實現
-
我的實現:
包含L1與L2:
https://github.com/autoliuweijie/MachineLearning/blob/master/regression/regression.py
-
scikit-learn:
嶺迴歸:
>>> from sklearn import linear_model >>> clf = linear_model.Ridge (alpha = .5) >>> clf.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) >>> clf.coef_ array([ 0.34545455, 0.34545455]) >>> clf.intercept_ 0.13636...
通過交叉驗證尋找最優的alpha:
>>> from sklearn import linear_model >>> clf = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0]) >>> clf.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) >>> clf.alpha_ 0.1
lasso:
>>> from sklearn import linear_model >>> clf = linear_model.Lasso(alpha = 0.1) >>> clf.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) >>> clf.predict([[1, 1]]) array([ 0.8])
3. 擴展:
更多關於特徵選擇: http://dataunion.org/14072.html
scikit-learn: http://scikit-learn.org/stable/modules/linear_model.html#lars-lasso
參考:
[1]《機器學習實戰》 Peter Harrington
[2] scikit-learn官方手冊