当前位置:   article > 正文

Lasso回归

lasso回归


Lasso回归是一种线性模型,该方法是一种压缩估计。它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些回归系数,即强制系数绝对值之和小于某个固定值;同时设定一些回归系数为0。也是一种处理 具有复共线性数据的有偏估计

目标函数为:

min ⁡ w 1 2 n s a m p l e s ∣ ∣ X w − y ∣ ∣ 2 2 + α ∣ ∣ w ∣ ∣ 1 = min ⁡ w 1 2 n s a m p l e s ∑ i = 1 n ( y ^ i − y i ) 2 + α ∑ i = 1 n ∣ w i ∣ (1) \min_w \frac{1}{2n_{samples}}||X_w-y||^2_2+\alpha ||w||_1=\\ \min_w \frac{1}{2n_{samples}}\sum_{i=1}^n(\hat{y}_i-y_i)^2+\alpha\sum_{i=1}^n |w_i| \tag{1} wmin2nsamples1∣∣Xwy22+α∣∣w1=wmin2nsamples1i=1n(y^iyi)2+αi=1nwi(1)

其中, α \alpha α是一个常数, ∣ ∣ w ∣ ∣ 1 ||w||_1 ∣∣w1是L1范数。

from sklearn.linear_model import Lasso

alpha = 0.1
lasso = Lasso(alpha=alpha)

y_pred_lasso = lasso.fit(X_train, y_train).predict(X_test)
r2_score_lasso = r2_score(y_test, y_pred_lasso)
print(lasso)
print("r^2 on test data : %f" % r2_score_lasso)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

评价指标:r2_score

选择正则化参数

交叉验证cross-validation

有两种交叉验证——LassoCVLassoLarsCV

  • LassoCV
    基于coordinate descent算法
  • LassoLarsCV
    基于Least Angle Regression算法

对于很多共线性特征的高维数据集,LassoCV表现更好。如果样本量很小,样本量小于特征数,LassoLarsCV比较快。

LassoCV例子:

from sklearn.linear_model import LassoCV

start_time = time.time()
model = make_pipeline(StandardScaler(), LassoCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time

import matplotlib.pyplot as plt

ymin, ymax = 2300, 3800
lasso = model[-1]
plt.semilogx(lasso.alphas_, lasso.mse_path_, linestyle=":")
plt.plot(
    lasso.alphas_,
    lasso.mse_path_.mean(axis=-1),
    color="black",
    label="Average across the folds",
    linewidth=2,
)
plt.axvline(lasso.alpha_, linestyle="--", color="black", label="alpha: CV estimate")

plt.ylim(ymin, ymax)
plt.xlabel(r"$\alpha$")
plt.ylabel("Mean square error")
plt.legend()
_ = plt.title(
    f"Mean square error on each fold: coordinate descent (train time: {fit_time:.2f}s)"
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

LassoLarsCV例子:

from sklearn.linear_model import LassoLarsCV

start_time = time.time()
model = make_pipeline(StandardScaler(), LassoLarsCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time

lasso = model[-1]
plt.semilogx(lasso.cv_alphas_, lasso.mse_path_, ":")
plt.semilogx(
    lasso.cv_alphas_,
    lasso.mse_path_.mean(axis=-1),
    color="black",
    label="Average across the folds",
    linewidth=2,
)
plt.axvline(lasso.alpha_, linestyle="--", color="black", label="alpha CV")

plt.ylim(ymin, ymax)
plt.xlabel(r"$\alpha$")
plt.ylabel("Mean square error")
plt.legend()
_ = plt.title(f"Mean square error on each fold: Lars (train time: {fit_time:.2f}s)")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

AIC/BIC准则

计数信息准则是基于训练集数据

困难:

  • 自由度的选择。
  • 要求大样本。
  • 样本量大于特征数。

计算公式为:

A I C = − 2 l o g ( L ^ ) + 2 d (2) AIC=-2log(\hat{L})+2d \tag{2} AIC=2log(L^)+2d(2)

其中, L ^ \hat{L} L^是模型的最大似然估计函数, d d d是参数个数,即自由度。

B I C BIC BIC的计算就是把式(2)中的2替换为 l o g ( N ) log(N) log(N)

B I C = − 2 l o g ( L ^ ) + l o g ( N ) d (3) BIC=-2log(\hat{L})+log(N)d \tag{3} BIC=2log(L^)+log(N)d(3)

其中 N N N是样本量。

对于一个线性高斯模型,最大似然函数的对数为:

l o g ( L ^ ) = − n 2 l o g ( 2 π ) − n 2 l n ( σ 2 ) − ∑ i = 1 n ( y i − y ^ i ) 2 2 σ 2 (4) log(\hat{L})=-\frac{n}{2}log(2\pi)-\frac{n}{2}ln(\sigma^2)-\frac{\sum_{i=1}^n (y_i-\hat{y}_i)^2}{2\sigma^2} \tag{4} log(L^)=2nlog(2π)2nln(σ2)2σ2i=1n(yiy^i)2(4)

将式(4)代入式(2)得:

A I C = n l o g ( 2 π σ 2 ) + ∑ i = 1 n ( y i − y ^ i ) 2 σ 2 + 2 d (5) AIC=nlog(2\pi\sigma^2)+\frac{\sum_{i=1}^n (y_i-\hat{y}_i)^2}{\sigma^2}+2d \tag{5} AIC=nlog(2πσ2)+σ2i=1n(yiy^i)2+2d(5)

其中 σ 2 \sigma^2 σ2是常数,由式(6)估计而得:

σ 2 = ∑ i = 1 n ( y i − y ^ i ) 2 n − p (6) \sigma^2=\frac{\sum_{i=1}^n (y_i-\hat{y}_i)^2}{n-p} \tag{6} σ2=npi=1n(yiy^i)2(6)

其中, p p p是特征个数,且仅当n_samples > n_features时成立。

import time
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LassoLarsIC
from sklearn.pipeline import make_pipeline

start_time = time.time()
lasso_lars_ic = make_pipeline(StandardScaler(), LassoLarsIC(criterion="aic")).fit(X, y)#AIC
fit_time = time.time() - start_time

results = pd.DataFrame(
    {
        "alphas": lasso_lars_ic[-1].alphas_,
        "AIC criterion": lasso_lars_ic[-1].criterion_,
    }
).set_index("alphas")
alpha_aic = lasso_lars_ic[-1].alpha_
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

以上是 A I C AIC AIC计算。

lasso_lars_ic.set_params(lassolarsic__criterion="bic").fit(X, y)
results["BIC criterion"] = lasso_lars_ic[-1].criterion_
alpha_bic = lasso_lars_ic[-1].alpha_

#加粗列的最小值
def highlight_min(x):
    x_min = x.min()
    return ["font-weight: bold" if v == x_min else "" for v in x]


results.style.apply(highlight_min)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这是 B I C BIC BIC的计算。

对比

一般使用交叉验证选择参数 α \alpha α,因为有很多共线性特征的高维数据集,使用交叉验证的限制较少,而是用信息准则需求更严格。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/598889
推荐阅读
相关标签
  

闽ICP备14008679号