200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > sklearn中的正则化

sklearn中的正则化

时间:2022-03-28 18:22:09

相关推荐

sklearn中的正则化

文章目录

L1和L2L2正则化、岭回归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 Ridgeridge_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 SGDRegressorsgd_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) * 10y = 12 * X + 256from sklearn.linear_model import Lassolasso_reg = Lasso()lasso_reg.fit(X, y)print(lasso_reg.coef_, lasso_reg.intercept_)

[11.88574327] [256.58076116]

from sklearn.linear_model import SGDRegressorsgd_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) * 10y = 12 * X + 256from sklearn.linear_model import ElasticNeten_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 SGDRegressorsgd_reg = SGDRegressor(penalty='elasticnet')sgd_reg.fit(X, y.ravel())print(sgd_reg.coef_, sgd_reg.intercept_)

[12.06448304] [255.59790417]

提前停止

为了避免过拟合,也为了记录训练过程中的最优模型,我们经常需要用到提前停止。

from copy import deepcopyfrom sklearn.pipeline import Pipelinefrom 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 = Nonebest_model = Nonefor 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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。