機器學(xué)習(xí)系列(二十五)——正則化之Ridge回歸與LASSO回歸

模型正則化Regularization

解決過擬合問題或者說解決模型含有巨大方差誤差問題礁遣,一個非常有效的方法是模型正則化致稀。所謂模型正則化就是限制待求參數(shù)的大小。正則化有多種不同方法熔任,本篇將介紹嶺回歸和LASSO回歸兩種常用的正則化泽本。
以多元線性回歸為例染突,在多元線性回歸中捻爷,y與x的模型表達式為:
y=\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+...+\theta_{n}x_{n}

對于一個樣本X^{(i)}的預(yù)測值則為:
\widehat{y}^{(i)}=\theta_{0}+\theta_{1}X_{1}^{(i)}+\theta_{2}X_{2}^{(i)}+...+\theta_{n}X_{n}^{(i)}

模型最終要求解參數(shù)\theta=(\theta_{0},\theta_{1},...,\theta_{n})^{T}使得:
MSE=\sum_{i=1}^m(y^{(i)}-\widehat{y}^{(i)})^{2}

盡可能小。但是這樣求得單個參數(shù)數(shù)值可能是非常大的份企,這樣的模型面對全新數(shù)據(jù)將會有很大波動也榄。于是為了模型的泛化能力,對參數(shù)\theta也加上限制司志,這就是正則化甜紫,此時目標(biāo)函數(shù)轉(zhuǎn)變?yōu)椋?br> J(\theta)=MSE+\frac{\alpha}{2}\sum_{i=1}^{n}\theta_{i}^{2}

這種模型正則化方式稱為嶺回歸Ridge Regression\alpha是一個新的超參數(shù)骂远,可以理解為正則化部分占整個待優(yōu)化函數(shù)的權(quán)重囚霸。


嶺回歸與LASSO回歸

嶺回歸

以一個具體的例子感受一下模型正則化的作用,生成模擬數(shù)據(jù)集:

np.random.seed(42)
x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5 * x +3 +np.random.normal(0,1,size=100)

該模擬數(shù)據(jù)集服從y=0.5x+3激才,加入了標(biāo)準(zhǔn)高斯噪音拓型,首先不使用正則化用20次冪多項式回歸訓(xùn)練模型:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
def PolynomialRegression(degree):
    '''傳入步驟對應(yīng)的類組成多項式回歸函數(shù)'''
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("std_scaler",StandardScaler()),
        ("lin_reg",lin_reg)
    ])

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)

from sklearn.metrics import mean_squared_error

poly20_reg = PolynomialRegression(degree=20)
poly20_reg.fit(X_train,y_train)

y20_predict = poly20_reg.predict(X_test)
mean_squared_error(y_test,y20_predict)

均方誤差值:

均方誤差值MSE
X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = poly20_reg.predict(X_plot)

plt.scatter(x,y)
plt.plot(X_plot,y_plot,color='r')#有序排序后繪制曲線
plt.axis([-3,3,-1,6])
plt.show()

回歸方程圖示:

20次冪無正則化

下面同樣使用degree=20的多項式加入正則化項進行嶺回歸,為了調(diào)用方便瘸恼,封裝嶺回歸函數(shù)和做圖函數(shù):

from sklearn.linear_model import Ridge
def RidgeRegression(degree,alpha):
    '''傳入步驟對應(yīng)的類組成嶺回歸函數(shù)'''
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("std_scaler",StandardScaler()),
        ("ridge_reg",Ridge(alpha=alpha))
    ])

'''繪圖函數(shù)封裝'''
def plot_model(model):
    X_plot = np.linspace(-3,3,100).reshape(100,1)
    y_plot = model.predict(X_plot)

    plt.scatter(x,y)
    plt.plot(X_plot,y_plot,color='r')#有序排序后繪制曲線
    plt.axis([-3,3,-1,6])
    plt.show()
plot_model(poly20_reg)

使用\alpha=0.0001的嶺回歸:

ridge1_reg = RidgeRegression(20,0.0001)
ridge1_reg.fit(X_train,y_train)

y1_predict = ridge1_reg.predict(X_test)
mean_squared_error(y_test,y1_predict)
0.0001嶺回歸MSE
plot_model(ridge1_reg)
0.0001嶺回歸

可以看到\alpha=0.0001的嶺回歸均方誤差比沒有正則化的要優(yōu)秀很多吨述,圖像中也已經(jīng)沒有特別離譜的點。當(dāng)然可以修改\alpha的值來進一步優(yōu)化結(jié)果钞脂,使用\alpha=1的嶺回歸:

1嶺回歸MSE
1嶺回歸

使用\alpha=100的嶺回歸:

100
100

使用\alpha=10000的嶺回歸:

10000
10000

可以看到隨著\alpha的增加,回歸曲線越來越平滑捕儒,最后甚至成為與x軸平行的直線冰啃,這是因為當(dāng)權(quán)重加到非常大時,損失函數(shù)J里起決定作用的已經(jīng)是正則項了刘莹,為了損失函數(shù)最小自然是所有\theta都取0阎毅,于是回歸曲線就成為與x軸平行的直線了。實際中要調(diào)節(jié)超參數(shù)\alpha的值点弯,讓模型盡可能優(yōu)秀扇调,本例中嶺回歸使用過的\alpha里可以發(fā)現(xiàn)\alpha=1最優(yōu)。

LASSO回歸

LASSO回歸全稱是Least Absolute Shrinkage and Selection Operator Regression抢肛,相應(yīng)的損失函數(shù)表達式為:

J(\theta)=MSE+\frac{\alpha}{2}\sum_{i=1}^{n}|\theta_{i}|

LASSO的特性使得它傾向于使一部分\theta變?yōu)?狼钮,所以可以作為特征選擇用,系數(shù)為0的特征說明對表達模型幾乎沒用捡絮。但也因此LASSO回歸有可能對一些特征存在誤判熬芜,所以從準(zhǔn)確度上來說嶺回歸要更加準(zhǔn)確,但是當(dāng)特征特別多時使用嶺回歸計算將特別消耗計算資源福稳,耗時較多涎拉,所以如果在特征特別多的情況下,比如多項式回歸次冪為100,一般使用LASSO回歸鼓拧,LASSO可以有效降低特征量加快運算速度半火。
接下來對上面的數(shù)據(jù)例子使用LASSO回歸,首先定義LASSO回歸函數(shù):

from sklearn.linear_model import Lasso
def LassoRegression(degree,alpha):
    '''傳入步驟對應(yīng)的類組成LASSO回歸函數(shù)'''
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("std_scaler",StandardScaler()),
        ("ridge_reg",Lasso(alpha=alpha))
    ])

使用\alpha=0.01的LASSO回歸:

lasso1_reg = LassoRegression(20,0.01)
lasso1_reg.fit(X_train,y_train)

y1_predict =lasso1_reg.predict(X_test)
mean_squared_error(y_test,y1_predict)
0.01
plot_model(lasso1_reg)
0.01

可以看到在LASSO回歸中\alpha=0.01時季俩,回歸曲線已經(jīng)非常平緩了钮糖,這也正是LASSO回歸的優(yōu)勢,在特征選擇的作用下能很快地求解模型种玛。
使用\alpha=1的LASSO回歸:

1LASSO
1LASSO

\alpha=1時已幾乎成為平行于x軸的直線藐鹤。


L1,L2彈性網(wǎng)絡(luò)

比較嶺回歸和LASSO回歸的正則項部分可以發(fā)現(xiàn)赂韵,其實它們分別是MSE和MAE的一種變形娱节,本質(zhì)上是還是一種距離(誤差)的衡量。機器學(xué)習(xí)中有很多這樣的名詞祭示,雖然名稱不同但背后的數(shù)學(xué)原理是一致的肄满。
在這兒引入在knn算法中提到過的閔可夫斯基距離Minkowski Distance,明氏距離中當(dāng)p=1時就是曼哈頓距離质涛;p=2時就是歐氏距離稠歉。相應(yīng)地有L_{p}范數(shù):
||x||_{p}=(\sum_{i=1}^{n}|x_{i}|^{p})^{\frac{1}{p}}

于是對于Ridge回歸,類比范數(shù)的定義汇陆,我們叫它L2正則項怒炸;對于LASSO回歸,我們稱之為L1正則項毡代;相應(yīng)地阅羹,有Ln正則項。不過實際中我們很少使用大于2的正則項教寂。還有一個L0正則項捏鱼,對于L0正則化芹啥,我們希望\theta的個數(shù)盡可能的少甥角,即:要使非零的\theta的個數(shù)盡可能少,這是個離散最優(yōu)化問題控妻,同樣我們也很少使用L0正則化迂烁,因為求解它是一個NP難問題看尼,實際中往往用L1的特征選擇來代替L0。
綜合L1正則化和L2正則化婚被,得到彈性網(wǎng)Elastic Net:
J(\theta)=MSE+r\alpha\sum_{i=1}^{n}|\theta_{i}|+\frac{1-r}{2}\alpha\sum_{i=1}^{n}\theta_{i}^{2}

它同時具有L1正則和L2正則的優(yōu)勢狡忙,即能準(zhǔn)確地計算又能進行特征選擇加快計算速度,因此在實際中經(jīng)常使用彈性網(wǎng)絡(luò)進行正則化址芯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灾茁,一起剝皮案震驚了整個濱河市窜觉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌北专,老刑警劉巖禀挫,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拓颓,居然都是意外死亡语婴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門驶睦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砰左,“玉大人,你說我怎么就攤上這事场航〔迹” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵溉痢,是天一觀的道長僻造。 經(jīng)常有香客問我,道長孩饼,這世上最難降的妖魔是什么髓削? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮镀娶,結(jié)果婚禮上立膛,老公的妹妹穿的比我還像新娘。我一直安慰自己梯码,他們只是感情好旧巾,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忍些,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坎怪。 梳的紋絲不亂的頭發(fā)上罢坝,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音搅窿,去河邊找鬼嘁酿。 笑死,一個胖子當(dāng)著我的面吹牛男应,可吹牛的內(nèi)容都是我干的闹司。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼沐飘,長吁一口氣:“原來是場噩夢啊……” “哼游桩!你這毒婦竟也來了牲迫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤借卧,失蹤者是張志新(化名)和其女友劉穎盹憎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铐刘,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡陪每,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镰吵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檩禾。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疤祭,靈堂內(nèi)的尸體忽然破棺而出盼产,到底是詐尸還是另有隱情,我是刑警寧澤画株,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布辆飘,位于F島的核電站,受9級特大地震影響谓传,放射性物質(zhì)發(fā)生泄漏蜈项。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一续挟、第九天 我趴在偏房一處隱蔽的房頂上張望紧卒。 院中可真熱鬧,春花似錦诗祸、人聲如沸跑芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽博个。三九已至,卻和暖如春功偿,著一層夾襖步出監(jiān)牢的瞬間盆佣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工械荷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留共耍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓吨瞎,卻偏偏與公主長得像痹兜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颤诀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容