特徵縮減係數的理解等 嶺迴歸 lasso

出處:http://blog.csdn.net/autoliuweijie/article/details/50285881


總結來說,加入特徵縮減係數是爲了減少影響係數小的特徵,保留重要的特徵。

1. 理論

  1. 概述:

    通過對損失函數(即優化目標)加入懲罰項,使得訓練求解參數過程中會考慮到係數的大小,通過設置縮減係數(懲罰係數),會使得影響較小的特徵的係數衰減到0,只保留重要的特徵。常用的縮減係數方法有lasso(L1正則化),嶺迴歸(L2正則化)。

  2. 縮減係數的目的

    2.1 消除噪聲特徵:

    如果模型考慮了一些不必要的特徵,那麼這些特徵就算是噪聲。噪聲是沒必要的,使得模型複雜,降低模型準確性,需要剔除。
    

    2.2 消除關聯的特徵:

    如果模型的特徵空間中存在關聯的特徵,這會使得模型不適定,即模型參數會有多解。訓練得到的只是其中一個解,這個解往往不能反映模型的真實情況,會誤導模型的分析與理解。訓練求解的模型參數受樣本影響特別大,樣本變化一點點,參數解就跳到另一組解去了。總之,模型是不穩定的。
    
  3. 正則化:

    什麼是正則化:

    對損失函數(目標函數)加入一個懲罰項,使得模型由多解變爲更傾向其中一個解。
    
    在最小二乘法中,可以這樣理解。XTX可能是不可逆的,通過加上正則項,迫使弱的特徵的係數縮減爲0.
    

    shrinkage

    3.1 lasso(L1正則化):

    與普通的線性迴歸相同,只是把損失函數換成:

    shrinkage

    這樣,最優化求解參數過程,就會傾向選擇係數比較小的解。當alpha增大,哪些無關的係數會率先縮減爲0。但是L1正則化對相關特徵的消除無能爲力,仍然是不穩定的。

    3.2 嶺迴歸(L2正則化):

    與普通的線性迴歸相同,只是把損失函數換成:

    shrinkage

    與lasso相比,這裏的懲罰項加上了平方,這樣就對於相關的兩個特徵,傾向與一個特別大,另一個接近0,起到了消除相關特徵的效果。下圖爲隨着alpha變化,係數的縮減效果。

    shrinkage

2. 實現

  1. 我的實現:

    包含L1與L2:

    https://github.com/autoliuweijie/MachineLearning/blob/master/regression/regression.py
    
  2. 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])
詳細可參考該文章:

乾貨:結合Scikit-learn介紹幾種常用的特徵選擇方法

http://dataunion.org/14072.html

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官方手冊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章