用L2正則的線性回歸模型脚线,稱為Ridge回歸 (嶺回歸)
用L1正則的線性回歸模型蔗候,稱為L(zhǎng)ASSO回歸
=== L2和L1的比較 ===
秧秉,由于對(duì)于各個(gè)維度的參數(shù)縮放是在一個(gè)圓內(nèi)縮放的污桦,(對(duì)各個(gè)維度的參數(shù)進(jìn)行一個(gè)播報(bào),在一個(gè)圓內(nèi)進(jìn)行播報(bào))书幕,所以不可能導(dǎo)致有維度參數(shù)變成0的情況新荤,那么也就不會(huì)產(chǎn)生;實(shí)際應(yīng)用中台汇,數(shù)據(jù)的維度中是存在和的苛骨,稀疏的解可以找到有用的維度并減少冗余,提高預(yù)測(cè)的和(減少了overfitting)苟呐。
L1-norm可以達(dá)到最終解的稀疏性要求痒芝。
Ridge模型具有較高的準(zhǔn)確性、魯棒性以及穩(wěn)定性牵素;
LASSO模型具有較高的求解速度严衬;
如果即要考慮穩(wěn)定性也考慮求解的速度,就使用Elastic Net笆呆。
什么是稀疏解请琳?
對(duì)于一組參數(shù)θk,其中有一個(gè)或多個(gè)θ等于0赠幕,或近似等于0俄精。稱這組參數(shù)θk存在稀疏解。
如何理解:稀疏解可以找到有用的維度并減少冗余榕堰?
y=ax1+bx2+c;
若求解得到 a=3; b=0; c=2;
我們發(fā)現(xiàn)x2特征對(duì)于結(jié)果的預(yù)測(cè)沒(méi)有任何幫助竖慧,所以可以將x2的特征刪除。
注意:
L2-Ridge不產(chǎn)生稀疏解逆屡,L1-LASSO可以讓解去冗余圾旨。
當(dāng)我們覺(jué)得每個(gè)特征都是有用的,用L2康二。
如果想用回歸的手段確定特征的可用性碳胳,用L1。
L1-LASSO有相對(duì)比較快的求解速度沫勿。
=== L1挨约、L2的圖像比較 ===
首先把特征降低至2維:
y=θ0+θ1x1+θ2x2
什么是把數(shù)據(jù)播放到圓內(nèi)?
L1(左圖)产雹、L2(右圖)中兩團(tuán)紅色的圈圈是三維圖像在二維平面上的映射诫惭。L1和L2兩張圖是中間圖像的俯視圖,要立體得去看:
先忽略正則項(xiàng)蔓挖,只看損失函數(shù)對(duì)應(yīng)的圖像:
對(duì)于: y=θ0+θ1x1+θ2x2夕土; θ1、θ2有一組對(duì)應(yīng)的取值(Β1,Β2)
當(dāng)θ向量取值為損失函數(shù)最小值的點(diǎn)怨绣,這個(gè)點(diǎn)就是Β^
Β^ 這一點(diǎn)是線性回歸取得損失函數(shù)最優(yōu)點(diǎn)的那個(gè)解角溃。Β^:(Β1,Β2)
每一個(gè)小橢圓上篮撑,損失函數(shù)的值是相等的减细。
以Β^為圓心,越往外的橢圓損失值越大赢笨。
現(xiàn)在損失加入正則的情況:
加入正則懲罰項(xiàng)后未蝌,意味著現(xiàn)在的取值加入了新的約束條件,使得θ值必須在我的限制條件內(nèi)才能被認(rèn)可茧妒。
圖像中萧吠,L1藍(lán)色方塊和L2藍(lán)色橢圓的區(qū)域就是正則懲罰項(xiàng)中允許的θ值。什么時(shí)候能夠取得最優(yōu)的θ值桐筏?
回過(guò)頭再次思考稀疏解的問(wèn)題:
何為稀疏解?系數(shù)為0的時(shí)候九昧。
在圖中绊袋,即意味著Β1 = 0 或Β2 = 0 或Β1 = Β2 = 0;
在L1-norm和L2-norm中 (藍(lán)色區(qū)域) 铸鹰,顯然Β1 = Β2 = 0 這點(diǎn)為圓心癌别,相切的點(diǎn)不可能在圓心上,因此這點(diǎn)排除蹋笼。
對(duì)于我們的L1和L2來(lái)說(shuō)展姐,損失函數(shù)中懲罰項(xiàng)的位置是固定的。
觀察L2圖像剖毯,為什么不能生成稀疏解:
而損失函數(shù)前半段的圖像形狀(紅色橢圓)圾笨,會(huì)根據(jù)y值(真實(shí)值)的改變而發(fā)生改變。如圖:
損失函數(shù)和懲罰相相切的位置可能存在于任何一點(diǎn)逊谋。既然在懲罰項(xiàng)的圓上每一點(diǎn)都有可能相切擂达,那么切到Β1 = 0或Β2 = 0的概率趨向于0。
所以胶滋,當(dāng)選擇L2-norm后板鬓,基本不可能出現(xiàn)稀疏解。
觀察L1圖像究恤,為什么能夠生成稀疏解:
如果損失函數(shù)和懲罰項(xiàng)相切了俭令,意味紅色橢圓和藍(lán)色四邊形的其他任意一點(diǎn)都不相交,意味著藍(lán)色四邊形邊上的其他任意一點(diǎn)到B^ 的距離都不如相切的這一點(diǎn)到B^ 的距離近部宿。
該圖形中抄腔,各個(gè)點(diǎn)相切的概率不是相等的。切到頂點(diǎn)的概率是最高的。所以更容易產(chǎn)生稀疏解赫蛇。
=== Elastic Net ===
如果即要考慮穩(wěn)定性也考慮求解的速度绵患,就使用Elastic Net。
同時(shí)使用L1正則和L2正則的線性回歸模型就稱為Elastic Net棍掐,
p藏雏、λ都是超參數(shù)拷况。
超參數(shù)是在開(kāi)始學(xué)習(xí)過(guò)程之前設(shè)置值的參數(shù)作煌,而不是通過(guò)訓(xùn)練得到的參數(shù)數(shù)據(jù)。通常情況下赚瘦,需要對(duì)超參數(shù)進(jìn)行優(yōu)化粟誓,給學(xué)習(xí)機(jī)選擇一組最優(yōu)超參數(shù),以提高學(xué)習(xí)的性能和效果起意。
=== 案例 ===
根據(jù)四種不同的回歸模型鹰服,在不同階數(shù)下的回過(guò)結(jié)果如何。
## 創(chuàng)建模擬數(shù)據(jù)
## 使得隨機(jī)數(shù)據(jù)可預(yù)測(cè)揽咕,即只要seed的值一樣悲酷,后續(xù)生成的隨機(jī)數(shù)都一樣。
np.random.seed(100)
np.set_printoptions(linewidth=1000, suppress=True)#顯示方式設(shè)置亲善,每行的字符數(shù)用于插入換行符设易,是否使用科學(xué)計(jì)數(shù)法
N = 10
## linspace:x從0~6之間等步長(zhǎng)取N個(gè)數(shù)
## 由于seed(10),固定了一種隨機(jī)方案蛹头,np.random.randn(N)每次結(jié)果都一致
x = np.linspace(0, 6, N) + np.random.randn(N)
y = 1.8*x**3 + x**2 - 14*x - 7 + np.random.randn(N)
x.shape
## 將其設(shè)置為矩陣
#無(wú)論多少數(shù)據(jù)顿肺,生成一列,反之1渣蜗,-1生成一行
x.shape = -1, 1
y.shape = -1, 1
x.shape
y.shape
將多個(gè)管道嵌套屠尊,共4個(gè)管道Pipeline
看看每個(gè)管道做了什么操作
管道1:多形式擴(kuò)展+線性回歸
管道2:多形式擴(kuò)展+RidgeCV
管道3:多形式擴(kuò)展+LassoCV
管道4:多形式擴(kuò)展+ElasticNetCV
## RidgeCV和Ridge的區(qū)別是:前者可以進(jìn)行交叉驗(yàn)證
## 目標(biāo):比較不同階數(shù)的情況下,會(huì)不會(huì)出現(xiàn)過(guò)擬合的情況
models = [
Pipeline([
('Poly', PolynomialFeatures(include_bias=False)),
('Linear', LinearRegression(fit_intercept=False))
]),
Pipeline([
('Poly', PolynomialFeatures(include_bias=False)),
('Linear', RidgeCV(alphas=np.logspace(-3,2,50), fit_intercept=False))
]),
Pipeline([
('Poly', PolynomialFeatures(include_bias=False)),
('Linear', LassoCV(alphas=np.logspace(0,1,10), fit_intercept=False))
]),
Pipeline([
('Poly', PolynomialFeatures(include_bias=False)),
('Linear', ElasticNetCV(alphas=np.logspace(0,1,10),
l1_ratio=[.1, .5, .7, .9, .95, 1], fit_intercept=False))
])
]
## 線性回歸耕拷、Lasso回歸讼昆、Ridge回歸、ElasticNet比較
plt.figure(facecolor='w')
degree = np.arange(1,N, 2) # 階
dm = degree.size
colors = [] # 顏色
for c in np.linspace(16711680, 255, dm):
colors.append('#%06x' % int(c))
titles = [u'線性回歸', u'Ridge回歸', u'Lasso回歸', u'ElasticNet']
for t in range(4):
model = models[t]#選擇了模型--具體的pipeline
plt.subplot(2,2,t+1)
plt.plot(x, y, 'ro', ms=10, zorder=N)
for i,d in enumerate(degree):
# 設(shè)置階數(shù)(多項(xiàng)式)
model.set_params(Poly__degree=d)
# 模型訓(xùn)練
model.fit(x, y.ravel())
# 獲取得到具體的算法模型
lin = model.get_params('Linear')['Linear']
# 打印數(shù)據(jù)
output = u'%s:%d階骚烧,系數(shù)為:' % (titles[t],d)
print (output, lin.coef_.ravel())
# 產(chǎn)生模擬數(shù)據(jù)
x_hat = np.linspace(x.min(), x.max(), num=100) ## 產(chǎn)生模擬數(shù)據(jù)
x_hat.shape = -1,1
# 數(shù)據(jù)預(yù)測(cè)
y_hat = model.predict(x_hat)
# 計(jì)算準(zhǔn)確率
s = model.score(x, y)
#
z = N - 1 if (d == 2) else 0
label = u'%d階, 正確率=%.3f' % (d,s)
plt.plot(x_hat, y_hat, color=colors[i], lw=2, alpha=0.75, label=label, zorder=z)
plt.legend(loc = 'upper left')
plt.grid(True)
plt.title(titles[t])
plt.xlabel('X', fontsize=16)
plt.ylabel('Y', fontsize=16)
plt.tight_layout(1, rect=(0,0,1,0.95))
plt.suptitle(u'各種不同線性回歸過(guò)擬合顯示', fontsize=22)
plt.show()
線性回歸:1階浸赫,系數(shù)為: [-44.14102611 40.05964256]
線性回歸:3階,系數(shù)為: [ -6.80525963 -13.743068 0.93453895 1.79844791]
線性回歸:5階止潘,系數(shù)為: [ -5.60899679 -14.80109301 0.75014858 2.11170671 -0.07724668 0.00566633]
線性回歸:7階掺炭,系數(shù)為: [-41.70721172 52.38570529 -29.56451338 -7.66322829 12.07162703 -3.86969096 0.53286096 -0.02725536]
線性回歸:9階,系數(shù)為: [-2465.58381316 6108.63817712 -5111.99333504 974.74974891 1078.89649478 -829.50277842 266.13230658 -45.71741587 4.1158274 -0.15281063]
Ridge回歸:1階凭戴,系數(shù)為: [ 29.87629065]
Ridge回歸:3階涧狮,系數(shù)為: [-12.98191422 -0.50844765 1.98772916]
Ridge回歸:5階,系數(shù)為: [-18.76655299 -0.28947771 3.32509764 -0.35027494 0.02456036]
Ridge回歸:7階,系數(shù)為: [-17.34640888 -3.48657706 4.33150776 0.39729204 -0.45104331 0.08994449 -0.0056256 ]
Ridge回歸:9階者冤,系數(shù)為: [-2.2521578 -2.27937783 -1.70299005 -1.0348803 0.85755012 0.37020601 -0.26024292 0.04709033 -0.00277978]
Lasso回歸:1階肤视,系數(shù)為: [ 30.30898284]
Lasso回歸:3階,系數(shù)為: [-12.31558512 -0.50643475 1.96415216]
Lasso回歸:5階涉枫,系數(shù)為: [-12.49095935 -0.5462019 1.85689229 0.04796991 -0.00459415]
Lasso回歸:7階邢滑,系數(shù)為: [-0. -0.42783947 -0.52239776 0.41588259 0.0107619 -0.00095271 -0.00041016]
Lasso回歸:9階,系數(shù)為: [-12.78111829 -0.49882979 1.80841074 0.03631125 0.00358085 -0.0003109 -0.00003417 -0.00000479 -0.00000044]
ElasticNet:1階愿汰,系數(shù)為: [ 28.51169563]
ElasticNet:3階困后,系數(shù)為: [-10.72359515 -1.20646101 2.03645101]
ElasticNet:5階,系數(shù)為: [-5.90338414 -1.62213355 1.13077809 0.2390498 -0.01640652]
ElasticNet:7階衬廷,系數(shù)為: [-0. -0.501937 -0.51930136 0.42305198 0.00992334 -0.00096761 -0.00041003]
ElasticNet:9階摇予,系數(shù)為: [-0.59980891 -0.53028001 -0.49033227 0.40675528 0.00848508 0.00000901 -0.00016187 -0.00002562 -0.00000379]
數(shù)據(jù)來(lái)源: 07 過(guò)擬合欠擬合 - 案例