模型正則化Regularization
解決過擬合問題或者說解決模型含有巨大方差誤差問題礁遣,一個非常有效的方法是模型正則化致稀。所謂模型正則化就是限制待求參數(shù)的大小。正則化有多種不同方法熔任,本篇將介紹嶺回歸和LASSO回歸兩種常用的正則化泽本。
以多元線性回歸為例染突,在多元線性回歸中捻爷,y與x的模型表達式為:
對于一個樣本的預(yù)測值則為:
模型最終要求解參數(shù)使得:
盡可能小。但是這樣求得單個參數(shù)數(shù)值可能是非常大的份企,這樣的模型面對全新數(shù)據(jù)將會有很大波動也榄。于是為了模型的泛化能力,對參數(shù)也加上限制司志,這就是正則化甜紫,此時目標(biāo)函數(shù)轉(zhuǎn)變?yōu)椋?br>
這種模型正則化方式稱為嶺回歸Ridge Regression。是一個新的超參數(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)
均方誤差值:
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()
回歸方程圖示:
下面同樣使用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)
使用=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)
plot_model(ridge1_reg)
可以看到=0.0001的嶺回歸均方誤差比沒有正則化的要優(yōu)秀很多吨述,圖像中也已經(jīng)沒有特別離譜的點。當(dāng)然可以修改的值來進一步優(yōu)化結(jié)果钞脂,使用=1的嶺回歸:
使用=100的嶺回歸:
使用=10000的嶺回歸:
可以看到隨著的增加,回歸曲線越來越平滑捕儒,最后甚至成為與x軸平行的直線冰啃,這是因為當(dāng)權(quán)重加到非常大時,損失函數(shù)J里起決定作用的已經(jīng)是正則項了刘莹,為了損失函數(shù)最小自然是所有都取0阎毅,于是回歸曲線就成為與x軸平行的直線了。實際中要調(diào)節(jié)超參數(shù)的值点弯,讓模型盡可能優(yōu)秀扇调,本例中嶺回歸使用過的里可以發(fā)現(xiàn)最優(yōu)。
LASSO回歸
LASSO回歸全稱是Least Absolute Shrinkage and Selection Operator Regression抢肛,相應(yīng)的損失函數(shù)表達式為:
LASSO的特性使得它傾向于使一部分變?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))
])
使用=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)
plot_model(lasso1_reg)
可以看到在LASSO回歸中=0.01時季俩,回歸曲線已經(jīng)非常平緩了钮糖,這也正是LASSO回歸的優(yōu)勢,在特征選擇的作用下能很快地求解模型种玛。
使用=1的LASSO回歸:
=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)地有范數(shù):
于是對于Ridge回歸,類比范數(shù)的定義汇陆,我們叫它L2正則項怒炸;對于LASSO回歸,我們稱之為L1正則項毡代;相應(yīng)地阅羹,有Ln正則項。不過實際中我們很少使用大于2的正則項教寂。還有一個L0正則項捏鱼,對于L0正則化芹啥,我們希望的個數(shù)盡可能的少甥角,即:要使非零的的個數(shù)盡可能少,這是個離散最優(yōu)化問題控妻,同樣我們也很少使用L0正則化迂烁,因為求解它是一個NP難問題看尼,實際中往往用L1的特征選擇來代替L0。
綜合L1正則化和L2正則化婚被,得到彈性網(wǎng)Elastic Net:
它同時具有L1正則和L2正則的優(yōu)勢狡忙,即能準(zhǔn)確地計算又能進行特征選擇加快計算速度,因此在實際中經(jīng)常使用彈性網(wǎng)絡(luò)進行正則化址芯。