python_岭回归_线性模型_L2 正则化(1)

python_岭回归_线性模型_L2 正则化

岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。
但在岭 # 回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加 # 约束。我们还希望系数尽量小。
换句话说,w 的所有元素都应接近于 0。直观上来看,这 # 意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。

这种约束是所谓正则化(regularization)的一个例子。正则化是指对模型做显式约束

# 3. 岭回归
# 岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭
# 回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加
# 约束。我们还希望系数尽量小。换句话说,w 的所有元素都应接近于 0。直观上来看,这
# 意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。
# 这种约束是所谓正则化(regularization)的一个例子。正则化是指对模型做显式约束,以
# 38 | 第 2 章
# 避免过拟合。岭回归用到的这种被称为 L2 正则化。7# 看一下它对扩展的波士顿房价数据集的效果如何:
from sklearn.linear_model import Ridge
​
ridge = Ridge().fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge.score(X_test, y_test)))
Training set score: 0.89
Test set score: 0.75
# 可以看出,Ridge 在训练集上的分数要低于 LinearRegression,但在测试集上的分数更高。
# 这和我们的预期一致。线性回归对数据存在过拟合。Ridge 是一种约束更强的模型,所以
# 更不容易过拟合。复杂度更小的模型意味着在训练集上的性能更差,但泛化性能更好。由
# 于我们只对泛化性能感兴趣,所以应该选择 Ridge 模型而不是 LinearRegression 模型。
​
​
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge10.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge10.score(X_test, y_test)))
Training set score: 0.79
Test set score: 0.64
# Ridge 模型在模型的简单性(系数都接近于 0)与训练集性能之间做出权衡。简单性和训练
# 集性能二者对于模型的重要程度可以由用户通过设置 alpha 参数来指定。在前面的例子中,
# 我们用的是默认参数 alpha=1.0。但没有理由认为这会给出最佳权衡。alpha 的最佳设定
# 值取决于用到的具体数据集。增大 alpha 会使得系数更加趋向于 0,从而降低训练集性能,
# 但可能会提高泛化性能。
# 默认参数 alpha=1.0
#增大 alpha 会使得系数更加趋向于 0
ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge01.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge01.score(X_test, y_test)))
​
​
​
# 减小 alpha 可以让系数受到的限制更小,即在图 2-1 中向右移动。对于非常小的 alpha 值,
# 系数几乎没有受到限制,我们得到一个与 LinearRegression 类似的模型:
Training set score: 0.93
Test set score: 0.77# 这里 alpha=0.1 似乎效果不错。我们可以尝试进一步减小 alpha 以提高泛化性能。
# 我们还可以查看 alpha 取不同值时模型的 coef_ 属性,从而更加定性地理解 alpha 参数是
# 如何改变模型的。更大的 alpha 表示约束更强的模型,所以我们预计大 alpha 对应的 coef_
# 元素比小 alpha 对应的 coef_ 元素要小。这一点可以在图 2-12 中得到证实:
# coef_  查看斜率
plt.plot(ridge.coef_, 's', label="Ridge alpha=1")
plt.plot(ridge10.coef_, '^', label="Ridge alpha=10")
plt.plot(ridge01.coef_, 'v', label="Ridge alpha=0.1")
​
plt.plot(lr.coef_, 'o', label="LinearRegression")
plt.xlabel("Coefficient index")
plt.ylabel("Coefficient magnitude")
xlims = plt.xlim()
plt.hlines(0, xlims[0], xlims[1])
plt.xlim(xlims)
plt.ylim(-25, 25)
plt.legend()
​
​
​
# 这里 x 轴对应 coef_ 的元素:x=0 对应第一个特征的系数,x=1 对应第二个特征的系数,以
# 此类推,一直到 x=100。y 轴表示该系数的具体数值。这里需要记住的是,对于 alpha=10,
# 系数大多在 -3 和 3 之间。对于 alpha=1 的 Ridge 模型,系数要稍大一点。对于 alpha=0.1,
# 点的范围更大。对于没有做正则化的线性回归(即 alpha=0),点的范围很大,许多点都超
# 出了图像的范围。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值