正则化线性模型(一):岭回归

167 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

在之间我们看到了如果线性模型想要对一个非线性数据模拟的够好,就会多加一个多项式特征。但是如果我们的特征的次数过高,那么模拟出来的图像反而容易过拟合,模拟出来的曲线很诡异。

之前我们就知道了,对于过拟合的模型,我们就需要加以约束,就需要正则化:正则化多项式模型的一种简单方法就是减少多项式的次数。这里我们先来将一种正则化方法-岭回归。

岭回归

岭回归是将原本的成本函数加上了一个正则化项ai=1nθi2a\sum_{i=1}^{n}\theta^{2}_{i}。来看一下岭回归的成本函数为

岭回归成本函数(θ)=MSE(θ)+a2i=1nθi2岭回归成本函数(\theta) = MSE(\theta) + \frac{a}{2}\sum_{i=1}^{n}\theta^{2}_{i}

MSE(θ)MSE(\theta)为我们之间的成本函数,这边就不多做赘述。主要看一下a2i=1nθi2\frac{a}{2}\sum_{i=1}^{n}\theta^{2}_{i}这个是什么?

我们将θ1θn\theta_{1}到\theta_{n}用一个新的向量ω\omega 表示,12(ω2)2\frac{1}{2}(||\omega||_{2})^{2} 表示正则项的 12i=1nθi2\frac{1}{2}\sum_{i=1}^{n}\theta^{2}_{i}部分,也就是权重向量的平方的一半。对于我们需要的梯度下降,就是把aωa\omega添加到MSE梯度向量中。

这边的超参数aa的作用就是控制对模型的正则化程度。当aa=0时,岭回归就是线性回归,当aa非常大的时候,所有的权重又会趋向于零,那时候的结果就会时一条类似数据均值的线。

我们可以根据上面的内容,通过“闭式”方程求出θ\theta:

θ^=(XTX+aA)1XTy\hat{\theta} = (X^{T}X+aA)^{-1}X^{T}y

这里的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()

图 线性模型(左)和多项式模型(右)岭正则化

很明显的如果不做处理直接岭正则化会导致回到了线性预测,同时随着aa的增加图形更加平稳,这最后看上去真的很像一个平均值,也就是会减少了方差,但是拟合效果明显不足,也就是偏差会加大。