机器学习入门研究(十三)-岭回归

目录

 

前言

欠拟合和过拟合

正则化

L1正则化

L2正则化

岭回归


前言

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

欠拟合和过拟合

  • 欠拟合

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

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

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

  • 过拟合

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

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

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

正则化

主要有两种方法: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 Ridge

def 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.62137203166228
ridge 的误差值: 20.656448214354967

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值