sklearn中的正则化
文章目錄
- L1和L2
- L2正則化、嶺回歸
- L1正則化、Lasso回歸
- 彈性網絡
- 提前停止
正則化是處理模擬過擬合最常用的方式之一。本部分我們介紹常見的正則化方法。
L1和L2
Lasso回歸的一個重要特點是它傾向于完全消除掉最不重要特征的權重(也就是將它們設置為零)因為所有高階多項式的特征權重都等于零。換句話說,Lasso回歸會自動執行特征選擇并輸出一個稀疏模型(即只有很少的特征有非零權重)。
你可以通過查下圖來了解為什么會這樣:軸代表兩個模型參數,背景輪廓代表不同的損失函數。在左上圖中,輪廓線代表1損失(|θ1|+|θ2|),當你靠近任何軸時,該損失呈線性下降。例如,如果將模型參數初始化為θ1=2和θ2=0.5,運行梯度下降會使兩個參數均等地遞減(如黃色虛線所示)。因此θ2將首先達到0(因為開始時接近0)。之后,梯度下降將沿山谷滾動直到其達到θ1=0(有一點反彈,因為1的梯度永遠不會接近0:對于每個參數,它們都是1或1)。在右上方的圖中,輪廓線代表Lasso的成本函數(即MSE成本函數加L1損失)。白色的小圓圈顯示了梯度下降優化某些模型參數的路徑,這些參數在θ1=0.25和θ2=1附近初始化:再次注意該路徑如何快速到達θ2=0,然后向下滾動并最終在全局最優值附近反彈(由紅色正方形表示)。如果增加α,則全局最優值將沿黃色虛線向左移動;如果減少α,則全局最優值將向右移動(在此示例中,非正則化的MSE的最優參數為θ1=2和θ2=0.5)。
底部的兩個圖顯示了相同的內容,但懲罰為L2。在左下圖中,你可以看到L2損失隨距原點的距離而減小,因此梯度下降沿該點直走。在右下圖中,輪廓線代表嶺回歸的成本函數(即MSE成本函數加L2損失)。Lasso有兩個主要區別。首先,隨著參數接近全局最優值,梯度會變小,因此,梯度下降自然會減慢,這有助于收斂(因為周圍沒有反彈)。其次,當你增加α時,最佳參數(用紅色正方形表示)越來越接近原點,但是它們從未被完全被消除。
L2正則化、嶺回歸
本部分介紹了sklearn中嶺回歸的實現方式。
sklearn提供了一個Ridge的線性領回歸的實現,但更常用的方式是在其它模型中加入penalty='l2’的參數。我們先看一下Rideg類的使用:
X = np.random.rand(1000, 1) y = 2 * X + 1from sklearn.linear_model import Ridge ridge_reg = Ridge(alpha=1, solver='cholesky') ridge_reg.fit(X, y) print(ridge_reg.coef_, ridge_reg.intercept_) [[1.97643979]] [1.01167015]我們再看一下使用其它模型+penalty參數的方式:
X = np.random.rand(1000, 1) y = 2 * X + 1from sklearn.linear_model import SGDRegressor sgd_reg = SGDRegressor(penalty='l2') sgd_reg.fit(X, y.ravel()) print(ridge_reg.coef_, ridge_reg.intercept_) [[1.97643979]] [1.01167015]L1正則化、Lasso回歸
與L2類似,L1也有Lasso和penalty2種實現方式:
X = np.random.rand(100, 1) * 10 y = 12 * X + 256from sklearn.linear_model import Lasso lasso_reg = Lasso() lasso_reg.fit(X, y) print(lasso_reg.coef_, lasso_reg.intercept_) [11.88574327] [256.58076116] from sklearn.linear_model import SGDRegressor sgd_reg = SGDRegressor(penalty='l1') sgd_reg.fit(X, y.ravel()) print(sgd_reg.coef_, sgd_reg.intercept_) [12.05735998] [255.60450449]彈性網絡
彈性網絡ElasticNet同時使用L1和L2。
X = np.random.rand(100, 1) * 10 y = 12 * X + 256from sklearn.linear_model import ElasticNet en_reg = ElasticNet(alpha=0.1, l1_ratio=0.5) en_reg.fit(X,y) print(en_reg.coef_, en_reg.intercept_) [11.91128824] [256.42500209] from sklearn.linear_model import SGDRegressor sgd_reg = SGDRegressor(penalty='elasticnet') sgd_reg.fit(X, y.ravel()) print(sgd_reg.coef_, sgd_reg.intercept_) [12.06448304] [255.59790417]提前停止
為了避免過擬合,也為了記錄訓練過程中的最優模型,我們經常需要用到提前停止。
from copy import deepcopy from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScalerpoly_scaler = Pipeline([("poly_features", PolynomialFeatures(degree=90, include_bias=False)),("std_scaler", StandardScaler())])X_train_poly_scaled = poly_scaler.fit_transform(X_train) X_val_poly_scaled = poly_scaler.transform(X_val)sgd_reg = SGDRegressor(max_iter=1, tol=-np.infty, warm_start=True,penalty=None, learning_rate="constant", eta0=0.0005, random_state=42)minimum_val_error = float("inf") best_epoch = None best_model = None for epoch in range(1000):sgd_reg.fit(X_train_poly_scaled, y_train) # continues where it left offy_val_predict = sgd_reg.predict(X_val_poly_scaled)val_error = mean_squared_error(y_val, y_val_predict)if val_error < minimum_val_error:minimum_val_error = val_errorbest_epoch = epochbest_model = deepcopy(sgd_reg)總結
以上是生活随笔為你收集整理的sklearn中的正则化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn的基本用法:分类与回归
- 下一篇: sklearn中的metrics