持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
在之间我们看到了如果线性模型想要对一个非线性数据模拟的够好,就会多加一个多项式特征。但是如果我们的特征的次数过高,那么模拟出来的图像反而容易过拟合,模拟出来的曲线很诡异。
之前我们就知道了,对于过拟合的模型,我们就需要加以约束,就需要正则化:正则化多项式模型的一种简单方法就是减少多项式的次数。这里我们先来将一种正则化方法-岭回归。
岭回归
岭回归是将原本的成本函数加上了一个正则化项。来看一下岭回归的成本函数为
为我们之间的成本函数,这边就不多做赘述。主要看一下这个是什么?
我们将用一个新的向量表示, 表示正则项的 部分,也就是权重向量的平方的一半。对于我们需要的梯度下降,就是把添加到MSE梯度向量中。
这边的超参数的作用就是控制对模型的正则化程度。当=0时,岭回归就是线性回归,当非常大的时候,所有的权重又会趋向于零,那时候的结果就会时一条类似数据均值的线。
我们可以根据上面的内容,通过“闭式”方程求出:
这里的A就是一个(n+1)x(n+1)的单位矩阵。
ok最后让我们看一下未作任何处理的岭回归,和增加多项式特征和标准化后的岭回归:
def plot_ridge(model_class,polynomial,alphas,**model_kargs):
for alpha, style in zip(alphas, ('b-','g--','r:')):
model = model_class(alpha, **model_kargs) if alpha > 0 else LinearRegression()
if polynomial:
model = Pipeline([
("poly_features",PolynomialFeatures(degree=10, include_bias=False)),
("std_scaler",StandardScaler()),
("regul_reg", model),
])
model.fit(X, y)
y_new_regul = model.predict(X_new)
lw = 2 if alpha > 0 else 1
plt.plot(X_new, y_new_regul,linewidth=lw,label=r"$\alpha = {}$".format(alpha))
plt.plot(X, y, "b.", linewidth=3)
plt.legend(loc="upper left", fontsize=15)
plt.xlabel("$x_1$", fontsize=18)
plt.axis([0, 3, 0, 4])
plt.subplot(121)
# 不做处理的岭正则化
plot_ridge(Ridge, polynomial=False, alphas=(0, 10, 100), random_state=42)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.subplot(122)
# 多项式模型的岭正则化
plot_ridge(Ridge, polynomial=True, alphas=(0, 10**-5, 1), random_state=42)
plt.show()
图 线性模型(左)和多项式模型(右)岭正则化
很明显的如果不做处理直接岭正则化会导致回到了线性预测,同时随着的增加图形更加平稳,这最后看上去真的很像一个平均值,也就是会减少了方差,但是拟合效果明显不足,也就是偏差会加大。