机器学习入门研究(十三)-岭回归
发布日期:2021-05-10 17:16:35 浏览次数:15 分类:技术文章

本文共 2440 字,大约阅读时间需要 8 分钟。

目录

 


前言

前段时间在忙项目合同的事情,这个学习耽误了一段时间,趁着年前不忙的时候,抓紧时间学完。

欠拟合和过拟合

  • 欠拟合

定义:一个假设在训练集上不能得到更好的拟合,并且在测试集中也不能得到很好的拟合数据。

原因:模型过于简单,学习数据的特征少

解决办法:增加数据的特征数量

  • 过拟合

定义:一个假设在训练数据上能够获得比其他假设更好的拟合,但在测试数据集上却不能很好的拟合数据,则认为为过拟合。

原因:模型过于复杂,原始特征过多,存在一些嘈杂特征

解决办法:正则化(主要用于回归),使得高次项的影响减少。

正则化

主要有两种方法:L1正则化和L2正则化。

L1正则化

原理:在原损失函数的基础上增加惩罚项,但惩罚项只是权重w的绝对值之和,其公式如下:

其中m为样本集的数量,n为特征值数,\lambda为惩罚系数。w为每个特征值的权重。

作用:可以使得其中一些w的值直接为0,删除了这个特征值的影响。

使用L1正则化的模型又称为Lasso回归。

L2正则化

原理:在原损失函数的基础上增加惩罚项,惩罚项是所有权重w的平方之和,其公式如下:

其中m为样本集的数量,n为特征值数,\lambda为惩罚系数。w为每个特征值的权重。

作用:可以使得其中一些w的值很小,接近于0,削弱了某个特征的影响。

使用L2正则化的模型又叫Ridge回归(岭回归)。

线性回归的优化就是使得损失函数减少,那对于加了惩罚项之后,不仅要使得损失函数减少,同样对于惩罚项也要减小。

从上述公式中可以看出,正则化力度\lambda越大,对应的权重w就越接近于0,反过来,正则化力度\lambda越小,对应的权重w就越大。

岭回归

岭回归就是带有L2正则化的线性回归。也是一种线性回归,只不过是在算法建立回归方程的时候,加上了L2正则化,从而解决过拟合。

对应在sklearn中的API

Ridge(self, alpha=1.0, fit_intercept=True, normalize=False,                 copy_X=True, max_iter=None, tol=1e-3, solver="auto",                 random_state=None)

其中参数含义如下:

参数 含义
alpha 惩罚系数,正则化力度,就是我们前面公式中提到的\lambda
fit_intercept 是否添加偏置,默认为True
normalize 是否将数据进行标准化,默认False,如果改为True,则我们不在需要对数据进行特征标准化处理
copy_X 默认为True。如果为True,将复制X; 否则,它可能被覆盖。
max_iter 最大迭代次数
solver

默认为auto。会自动根据数据自动选择优化算法。

如果数据集、特征都比较多的时候,选择SAG。

还有其他值为‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag

random_state 随机状态

其实Ridge相当于SGDRegressor( penalty='l2', loss="squared_loss"),只不过在SGDRegressor中使用的是SGD,而Ridge使用的是SAG。

返回值为:

参数 含义
coef_ 回归系数,即线性模型中的w
intercept_ 偏置,即线性模型中的b

 

实例还是分析之前提到的的预测波士顿房价的问题,代码如下:

from sklearn.linear_model import Ridgedef ridge():    # 1)获取数据集    boston = load_boston()    # 2)划分数据集    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)    # 3)进行标准化    transfer = StandardScaler()    x_train = transfer.fit_transform(x_train)    x_test = transfer.transform(x_test)    # 4)预估器    estimator = Ridge()    #estimator = SGDRegressor( penalty='l2', loss="squared_loss")    estimator.fit(x_train, y_train)    # 5)进行预测    y_predict = estimator.predict(x_test)    print("线性模型的参数为 w :", estimator.coef_)    print("线性模型的参数为 b:", estimator.intercept_)    # )模型评估    error = mean_squared_error(y_test, y_predict)    print("ridge 的误差值:", error)    return

其运行结果为:

线性模型的参数为 w : [-0.63591916  1.12109181 -0.09319611  0.74628129 -1.91888749  2.71927719 -0.08590464 -3.25882705  2.41315949 -1.76930347 -1.74279405  0.87205004 -3.89758657]线性模型的参数为 b: 22.62137203166228ridge 的误差值: 20.656448214354967

其结果的误差值和正规方程LinearRegression求解的误差还是有差别的,我们可以通过调整Ridge里面的alpha、max_iter等的值来提高岭回归的准确度。

 

转载地址:https://blog.csdn.net/nihaomabmt/article/details/103911488 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:机器学习入门研究(十四)-逻辑回归
下一篇:机器学习入门研究(十二)-线性回归

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月25日 16时00分59秒