一、前述
魯棒性調優就是讓模型有更好的泛化能力和推廣力。
二、具體原理
1、背景
第一個更好,因為當把測試集帶入到這個模型裡去。如果測試集本來是100,帶入的時候變成101,則第二個模型結果偏差很大,而第一個模型偏差不是很大。
2、目的
魯棒性就是為了讓w引數也就是模型變小,但不是很小。所以引出了 L1和L2正則。
L1和L2的使用就是讓w引數減小的使用就是讓w引數減小。
L1正則,L2正則的出現原因是為了推廣模型的泛化能力。相當於一個懲罰係數。
3、具體使用
L1正則:Lasso Regression
L2正則:Ridge Regression
總結:
經驗值 MSE前係數為1 ,L1 , L2正則前面係數一般為0.4~0.5 更看重的是準確性。
L2正則會整體的把w變小。
L1正則會傾向於使得w要麼取1,要麼取0 ,稀疏矩陣 ,可以達到降維的角度。
ElasticNet函式(把L1正則和L2正則聯合一起):
總結:
1.預設情況下選用L2正則。
2.如若認為少數特徵有用,可以用L1正則。
3.如若認為少數特徵有用,但特徵數大於樣本數,則選擇ElasticNet函式。
4、在保證正確率的情況下加上正則。
5、如果把lamda設定成0,就只看準確率。
6、如果把lamda設定大些,就看中推廣能力。
7、L1傾向於使得w要麼取1,要麼取0 稀疏編碼 可以降維
8、L2傾向於使得w整體偏小 嶺迴歸 首選
4、圖示
左邊是L1正則+基本損失函式
右邊是L2正則+基本損失函式
中間部分是圓心,損失函式最小,與正則函式相交,則既要滿足基本函式,也要滿足L1,L2正則,則損失函式增大了。
w1,w2等等與基本函式相交,則w1,w2都在[0,1]之間。
三、程式碼演示
程式碼一:L1正則
# L1正則
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressor
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
lasso_reg = Lasso(alpha=0.15)
lasso_reg.fit(X, y)
print(lasso_reg.predict(1.5))
sgd_reg = SGDRegressor(penalty='l1')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))
程式碼二:L2正則
# L2正則
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
#兩種方式第一種嶺迴歸
ridge_reg = Ridge(alpha=1, solver='auto')
ridge_reg.fit(X, y)
print(ridge_reg.predict(1.5))#預測1.5的值
#第二種 使用隨機梯度下降中L2正則
sgd_reg = SGDRegressor(penalty='l2')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))
程式碼三:Elastic_Net函式
# elastic_net函式
import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressor
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
#兩種方式實現Elastic_net
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X, y)
print(elastic_net.predict(1.5))
sgd_reg = SGDRegressor(penalty='elasticnet')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))