scikit-learn : 优化岭回归参数alpha优化

背景:优化岭回归参数alpha

当你使用岭回归模型进行建模时,需要考虑Ridge的alpha参数。

例如,用OLS(普通最小二乘法)做回归也许可以显示两个变量之间的某些关系;但是,当alpha参数正则化之后,那些关系就会消失。做决策时,这些关系是否需要考虑就显得很重要了。

模型参数优化用交叉检验(cross validation)完成。在后面的主题中,还会有更简便的方式实现这些,但是这里我们一步一步来实现岭回归的优化。

在scikit-learn里面,岭回归的 Γ <script type="math/tex" id="MathJax-Element-1">Γ</script> 参数就是RidgeRegression的alpha参数;因此,问题就是最优的alpha参数是什么。首先我们建立回归数据集.

生成模拟数据

from sklearn.datasets import make_regression
reg_data, reg_target = make_regression(n_samples=100, n_features=2, effective_rank=1, noise=10)

岭回归模型 & 留一法交叉验证

在linear_models模块中,有一个对象叫RidgeCV,表示岭回归交叉检验(ridge cross-validation)。这个交叉检验类似于留一交叉验证法(leave-one-out cross-validation,LOOCV)。这种方法是指训练数据时留一个样本,测试的时候用这个未被训练过的样本:

import numpy as np
from sklearn.linear_model import RidgeCV
rcv = RidgeCV(alphas=np.array([.1, .2, .3, .4]))
rcv.fit(reg_data, reg_target)
RidgeCV(alphas=array([ 0.1,  0.2,  0.3,  0.4]), cv=None, fit_intercept=True,
    gcv_mode=None, normalize=False, scoring=None, store_cv_values=False)

拟合模型之后,alpha参数就是最优参数:

rcv.alpha_
0.10000000000000001

这里,0.1是最优参数,我们还想看到0.1附近更精确的值:

rcv = RidgeCV(alphas=np.array([.08, .09, .1, .11, .12]))
rcv.fit(reg_data, reg_target)
RidgeCV(alphas=array([ 0.08,  0.09,  0.1 ,  0.11,  0.12]), cv=None,
    fit_intercept=True, gcv_mode=None, normalize=False, scoring=None,
    store_cv_values=False)
rcv.alpha_
0.080000000000000002

可以按照这个思路一直优化下去,这里只做演示,后面还是介绍更好的方法。

上面的演示很直接,但是我们介绍一下为什么这么做,以及哪个值才是最优的。在交叉检验的每一步里,模型的拟合效果都是用测试样本的误差表示。
我们可以让RidgeCV储存交叉检验的数据,这样就可以可视化整个过程:

可视化交叉验证过程

alphas_to_test = np.linspace(0.0001, 0.05)
rcv3 = RidgeCV(alphas=alphas_to_test, store_cv_values=True)
rcv3.fit(reg_data, reg_target)
RidgeCV(alphas=array([ 0.0001 ,  0.00112,  0.00214,  0.00316,  0.00417,  0.00519,
        0.00621,  0.00723,  0.00825,  0.00927,  0.01028,  0.0113 ,
        0.01232,  0.01334,  0.01436,  0.01538,  0.01639,  0.01741,
        0.01843,  0.01945,  0.02047,  0.02149,  0.0225 ,  0.02352,
        0.02454,  0.02556...4185,
        0.04287,  0.04389,  0.04491,  0.04593,  0.04694,  0.04796,
        0.04898,  0.05   ]),
    cv=None, fit_intercept=True, gcv_mode=None, normalize=False,
    scoring=None, store_cv_values=True)

我们测试了0.0001到0.05区间中的50个点。由于我们把store_cv_values设置成true,我们可以看到每一个值对应的拟合效果:

rcv3.cv_values_.shape
(100L, 50L)

通过100个样本的回归数据集,我们获得了50个不同的alpha值。我们可以看到50个误差值,最小的均值误差对应最优的alpha值:

smallest_idx = rcv3.cv_values_.mean(axis=0).argmin()
alphas_to_test[smallest_idx]
0.041853061224489799

此时问题转化成了“RidgeCV认可我们的选择吗?”可以再用下面的命令获取alpha值:

rcv3.alpha_
0.041853061224489799

通过可视化图形可以更直观的显示出来。我们画出50个测试alpha值的图:

%matplotlib inline
import matplotlib.pyplot as plt
f, ax = plt.subplots(figsize=(7, 5))
ax.set_title(r"Various values of $\alpha$")

xy = (alphas_to_test[smallest_idx], rcv3.cv_values_.mean(axis=0)[smallest_idx])
xytext = (xy[0] + .01, xy[1] + .1)

ax.annotate(r'Chosen $\alpha$', xy=xy, xytext=xytext,
            arrowprops=dict(facecolor='black', shrink=0, width=0)
            )
ax.plot(alphas_to_test, rcv3.cv_values_.mean(axis=0));

这里写图片描述

自定义评分函数

用其他误差自定义评分函数,也是可以实现的。前面我们介绍过MAD误差,我们可以用它来评分。首先我们需要定义损失函数:

def MAD(target, prediction):
    absolute_deviation = np.abs(target - prediction)
    return absolute_deviation.mean()

定义损失函数之后,我们用sklearn量度中的make_scorer函数来处理。这样做可以标准化自定义的函数,让scikit-learn对象可以使用它。另外,由于这是一个损失函数不是一个评分函数,是越低越好,所以要用sklearn来把最小化问题转化成最大化问题:

import sklearn
MAD = sklearn.metrics.make_scorer(MAD, greater_is_better=False)
rcv4 = RidgeCV(alphas=alphas_to_test, store_cv_values=True, scoring=MAD)
rcv4.fit(reg_data, reg_target)
smallest_idx = rcv4.cv_values_.mean(axis=0).argmin()
alphas_to_test[smallest_idx]
0.050000000000000003
  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
scikit-learn是一个广泛使用的Python机器学习库,包括多种回归算法,如线性回归、岭回归、Lasso回归等。以下是它们的使用场景和用法。 1. 线性回归:线性回归是一种用于建立线性模型的回归方法。它适用于特征与目标变量之间存在线性关系的情况。在scikit-learn中,使用LinearRegression类实现线性回归。以下是一个简单的例子: ```python from sklearn.linear_model import LinearRegression import numpy as np # 训练集数据 X_train = np.array([[1], [2], [3], [4], [5]]) y_train = np.array([3, 5, 7, 9, 11]) # 创建线性回归模型 model = LinearRegression() # 训练模型 model.fit(X_train, y_train) # 预测 X_test = np.array([[6]]) y_pred = model.predict(X_test) print(y_pred) ``` 在上面的例子中,我们使用了一个简单的训练集,包含5个数据点。我们使用LinearRegression类创建一个线性回归模型,并用训练集数据进行训练。然后,我们使用模型对测试数据进行预测。 2. 岭回归岭回归是一种用于处理多重共线性问题的线性回归方法。它通过对系数进行惩罚来减小模型的方差。在scikit-learn中,使用Ridge类实现岭回归。以下是一个简单的例子: ```python from sklearn.linear_model import Ridge import numpy as np # 训练集数据 X_train = np.array([[0, 0], [0, 0], [1, 1]]) y_train = np.array([0, 0.1, 1]) # 创建岭回归模型 model = Ridge(alpha=1.0) # 训练模型 model.fit(X_train, y_train) # 预测 X_test = np.array([[1, 1]]) y_pred = model.predict(X_test) print(y_pred) ``` 在上面的例子中,我们使用了一个简单的训练集,包含3个数据点。我们使用Ridge类创建一个岭回归模型,并用训练集数据进行训练。然后,我们使用模型对测试数据进行预测。 3. Lasso回归:Lasso回归也是一种用于处理多重共线性问题的线性回归方法。它和岭回归的区别在于,它使用L1惩罚项而不是L2惩罚项。在scikit-learn中,使用Lasso类实现Lasso回归。以下是一个简单的例子: ```python from sklearn.linear_model import Lasso import numpy as np # 训练集数据 X_train = np.array([[0, 0], [0, 1], [1, 1]]) y_train = np.array([0, 1, 2]) # 创建Lasso回归模型 model = Lasso(alpha=0.1) # 训练模型 model.fit(X_train, y_train) # 预测 X_test = np.array([[1, 1]]) y_pred = model.predict(X_test) print(y_pred) ``` 在上面的例子中,我们使用了一个简单的训练集,包含3个数据点。我们使用Lasso类创建一个Lasso回归模型,并用训练集数据进行训练。然后,我们使用模型对测试数据进行预测。 总的来说,线性回归适用于特征与目标变量之间存在线性关系的情况;岭回归适用于处理多重共线性问题,减小模型的方差;Lasso回归适用于处理多重共线性问题,使用L1惩罚项。具体使用哪个方法,需要根据数据的特点和需求来选择

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值