sklearn 套索回归模型和参数选择

套索回归中alpha值调整方法对比
本算例验证套索回归中,用AIC、BIC和交叉验证动态调整alpha值对结果的影响。AIC、BIC选择模型迅速,但依赖自由度评价。交叉验证采用20层LassoCV和最小角回归算法,二者结果相近,计算速度和误差来源不同。在特征维度大、样本充足时,交叉验证训练误差更小。

本算例主要验证套索回归中,分别采用AIC,BIC和交叉验证动态调整alpha的值,对结果的影响。
采用AIC、BIC信息标准的模型选择通常十分迅速,但是依赖于对合适的自由度的评价,并且在大数据量的分析中,往往假定模型是正确的,然而基于数据产生的模型去描述事物通常不准确,存在实际特征大于样本的情况。
对于交叉验证,分别采用20层的LassoCV算法和最小角回归算法路径进行计算,又称为并行下降算法,这2种算法得出结果大致相同,不同的是计算速度和数据误差的来源。
最小角回归算法,从结果上来说,在数据特征维度不大时,非常有效,而且计算不需要设定任何初始值。相对来看,并行下降算法(即交叉验证),在一个特定的网络结构中计算(算例中使用的初始值),因此在计算节点数小于特征维度时,效率会很高。因此,在特征维度很大,且数据样本充足的条件下,交叉验证的方法相对于单纯的最小角回归算法,训练误差会更小。
值得注意的是,在针对不确定或不可观测的数据时,模型的选择和参数的设置息息相关。

print(__doc__)

# Author: Olivier Grisel, Gael Varoquaux, Alexandre Gramfort
# License: BSD 3 clause

import time

import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LassoCV, LassoLarsCV, LassoLarsIC
from sklearn import datasets

diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

rng = np.random.RandomState(42)
X = np.c_[X, rng.randn(X.shape[0], 14)]  # add some bad features

# normalize data as done by Lars to allow for comparison
X /= np.sqrt(np.sum(X ** 2, axis=0))

# #############################################################################
# LassoLarsIC: least angle regression with BIC/AIC criterion

model_bic = LassoLarsIC(criterion='bic')
t1 = time.time()  #计时
model_bic.fit(X, y)
t_bic = time.time() - t1
alpha_bic_ = model_bic.alpha_      

model_aic = LassoLarsIC(criterion='aic')
model_aic.fit(X, y)
alpha_aic_ = model_aic.alpha_


def plot_ic_criterion(model, name, color):
    alpha_ = model.alpha_
    alphas_ = model.alphas_
    criterion_ = model.criterion_
    plt.plot(-np.log10(alphas_), criterion_, '--', color=color,
             linewidth=3, label='%s criterion' % name)
    plt.axvline(-np.log10(alpha_), color=color, linewidth=3,
                label='alpha: %s estimate' % name)
    plt.xlabel('-log(alpha)')
    plt.ylabel('criterion')

plt.figure()
plot_ic_criterion(model_aic, 'AIC', 'b')
plot_ic_criterion(model_bic, 'BIC', 'r')
plt.legend()
plt.title('Information-criterion for model selection (training time %.3fs)'
          % t_bic)

# #############################################################################
# LassoCV: coordinate descent

# Compute paths
print("Computing regularization path using the coordinate descent lasso...")
t1 = time.time()
model = LassoCV(cv=20).fit(X, y)
t_lasso_cv = time.time() - t1

# Display results
m_log_alphas = -np.log10(model.alphas_)

plt.figure()
ymin, ymax = 2300, 3800
plt.plot(m_log_alphas, model.mse_path_, ':')
plt.plot(m_log_alphas, model.mse_path_.mean(axis=-1), 'k',
         label='Average across the folds', linewidth=2)
plt.axvline(-np.log10(model.alpha_), linestyle='--', color='k',
            label='alpha: CV estimate')

plt.legend()

plt.xlabel('-log(alpha)')
plt.ylabel('Mean square error')
plt.title('Mean square error on each fold: coordinate descent '
          '(train time: %.2fs)' % t_lasso_cv)
plt.axis('tight')
plt.ylim(ymin, ymax)

# #############################################################################
# LassoLarsCV: least angle regression

# Compute paths
print("Computing regularization path using the Lars lasso...")
t1 = time.time()
model = LassoLarsCV(cv=20).fit(X, y)
t_lasso_lars_cv = time.time() - t1

# Display results
m_log_alphas = -np.log10(model.cv_alphas_)

plt.figure()
plt.plot(m_log_alphas, model.mse_path_, ':')
plt.plot(m_log_alphas, model.mse_path_.mean(axis=-1), 'k',
         label='Average across the folds', linewidth=2)
plt.axvline(-np.log10(model.alpha_), linestyle='--', color='k',
            label='alpha CV')
plt.legend()

plt.xlabel('-log(alpha)')
plt.ylabel('Mean square error')
plt.title('Mean square error on each fold: Lars (train time: %.2fs)'
          % t_lasso_lars_cv)
plt.axis('tight')
plt.ylim(ymin, ymax)

plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### L1正则化在线性模型中的应用 L1正则化是一种通过引入绝对值惩罚项来控制线性模型复杂度的技术。其核心目标是在优化过程中减少不必要特征的影响,从而实现稀疏解[^1]。 #### 套索回归Lasso Regression) 套索回归是基于L1正则化的线性回归模型之一。它的损失函数由两部分组成:原始的线性回归损失函数 \(J_0\) 额外加入的L1范数正则项 \(L_1\): \[ J(\beta) = J_0 + \lambda \sum_{j=1}^{p} |\beta_j| \] 其中: - \(J_0\) 是标准线性回归的均方误差损失; - \(\lambda\) 是正则化参数,用于平衡拟合数据简化模型之间的权衡; - \(|\beta_j|\) 表示第 \(j\) 个特征对应的权重系数的绝对值[^3]。 由于L1正则化使用的是绝对值而非平方值,在优化过程中会倾向于使某些特征的权重变为零。这意味着套索回归能够自动执行特征选择功能,仅保留对预测最有贡献的部分特征。 #### 数学解释与几何视角 从数学角度来看,当施加L1正则化时,约束条件表现为所有系数向量满足如下关系: \[ \sum_{j=1}^{p} |\beta_j| \leq s \] 这里的 \(s\) 是一个依赖于收缩因子 \(\lambda\) 的常数值。相比于岭回归采用的球形约束区域(即欧几里得距离),L1正则化形成了一个多边形边界。这种多边形状使得最优解更可能落在坐标轴上,进而导致一些维度上的系数被精确压缩至零。 #### 实现方式 尽管套索回归不像普通线性回归那样可以直接利用闭式解计算得到结果,但它仍然可以通过多种高效算法解决,比如坐标下降法或者最小角回归(LARS)[^3]。以下是Python中实现的一个简单例子: ```python from sklearn.linear_model import Lasso import numpy as np # 构造样本数据集 X, y X = np.array([[1, 2], [3, 4], [5, 6]]) y = np.dot(X, [1.5, -2]) + np.random.randn(3) # 创建并训练lasso模型 model = Lasso(alpha=0.1) # alpha对应λ超参 model.fit(X, y) print("Coefficients:", model.coef_) ``` 此代码片段展示了如何借助scikit-learn库快速构建并评估一个带L1正则化的线性模型实例。 ### 总结 综上所述,L1正则化及其衍生品——套索回归提供了一种有效途径去处理高维数据场景下的过拟合问题,并具备内在机制筛选重要变量的能力。然而需要注意的是,适当调整正则强度 (\(\lambda\)) 对最终效果至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值