18.【進階】模型正則化--L1&L2範數正則化
阿新 • • 發佈:2019-01-07
#-*- coding:utf-8 -*-
#模型正則化:目的是提高模型在未知測試資料上的泛化力,避免參數過擬合
#常用方法:在原模型優化目標的基礎上,增加對引數的懲罰(penalty)項
#拓展一下L0範數、L1範數、L2範數的概念
#L0範數是指向量中非0的元素的個數,如果我們用L0範數來規則化一個引數矩陣W的話,就是希望W的大部分元素都是0,實現稀疏但是NP-hard。
#L1範數是指向量中各個元素絕對值之和,也有個美稱叫“稀疏規則運算元”(Lasso regularization),通常用來實現稀疏
#L2範數是指向量各元素的平方和然後求平方根。我們讓L2範數的規則項||W||2最小,可以使得W的每個元素都很小,都接近於0,
#但與L1範數不同,它不會讓它等於0,而是接近於0,這裡是有很大的區別的。而越小的引數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象。
#接下來分別以L1範數正則化和L2範數正則化進行討論
#繼續以上一講的資料進行研究(程式碼與上一講相同)
import numpy as np
X_train = [[6],[8],[10],[14],[18]]
y_train = [[7],[9],[13],[17.5],[18]]
X_test = [[6],[8],[11],[16]]
y_test = [[8],[12],[15],[18]]
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
poly4 = PolynomialFeatures(degree=4 )
X_train_poly4 = poly4.fit_transform(X_train)
X_test_poly4 = poly4.transform(X_test)
#*************************************************************************************
#1.L1範數正則化
#目標:讓引數(權重)向量中的許多元素趨向於0,使得大部分特徵失去對優化目標的貢獻
#這種讓有效特徵變得稀疏對L1正則化模型,通常被稱為Lasso模型
from sklearn.linear_model import Lasso
#使用預設配置的lasso
lasso_poly4 = Lasso()
lasso_poly4.fit(X_train_poly4,y_train)
#對Lasso模型在測試樣本上的迴歸功能進行評估
print lasso_poly4.score(X_test_poly4,y_test)
#輸出:0.83889268736
#輸出Lasso模型的引數列表
print lasso_poly4.coef_
#[0.00000000e+00 0.00000000e+00 1.17900534e-01 5.42646770e-05 -2.23027128e-04]
#小結:
#1.預設配置的Lasso模型(L1範數正則化的模型)效能比普通的多項式迴歸模型更好一些;
#2.相較於普通的多項式迴歸模型,Lasso模型擬合後對引數列表中,4次與3次特徵的引數均為0.0,使得特徵更加稀疏。
#*************************************************************************************
#2.L2範數正則化
#目標:讓引數(權重)向量中的大部分元素 都 變得很小,<壓制了引數之間對差異性>
#這種壓制引數之間差異性的L2正則化模型,通常被稱為Ridge模型
from sklearn.linear_model import Ridge
ridge_poly4 = Ridge()
ridge_poly4.fit(X_train_poly4,y_train)
print ridge_poly4.score(X_test_poly4,y_test)
#輸出:0.837420175937
#輸出Ridge模型擬合後引數的平方和
print np.sum(ridge_poly4.coef_**2)
#0.0154989652036
#小結:
#1.預設配置的Ridge模型(L2範數正則化的模型)效能比普通的多項式迴歸模型更好一些;
#2.相較於普通的多項式迴歸模型,Ridge模型擬合後引數之間的差異非常小
#最後值得一提的是,不論是L1範數正則化,還是L2範數正則化,懲罰項都有一個調節因子λ,在模型優化中扮演重要的角色,留待後續研究。