【skLearn回归模型】Lasso----选择最佳正则化参数<带交叉验证的LassoLa。
。。
⽂章⽬录
⼀、linear_model.LassoCV()
使⽤交叉验证的 Lasso类的参数看起来与岭回归略有不同,这是由于 Lasso对于alpha的取值更加敏感的性质决定的。之前提到过,由于Lasso对正则化系数的变动过于敏感,因此我们往往让α在很⼩的空间中变动。这个⼩空间⼩到超乎⼈们的想象(不是0.01到0.02之间这样的空间,这个空间对 lasso⽽⾔还是太⼤了),因此我们设定了⼀个重要概念"正则化路径”,⽤来设定正则化系数的变动.
♦正则化路径 regularization path
假设我们的特征矩阵中有n个特征,则我们就有特征向量x1,x2…xn。对于每⼀个α的取值,我们都可以得出⼀组对应这个特征向量的参数向量w,其
中包含了n+1个参数,分别是w0,w1,w2,...wn.这些参数可以被看作是⼀个n维空间中的⼀个点。对于不同的α取值,我们就将得到许多个在n维空间中的点,所有的这些点形成的序列,就被我们称之为是正则化路径。
我们把形成这个正则化路径的α的最⼩值除以α的最⼤值得到的量(α.min/α.max)称为正则化路径的长度(length of the path)。在 sklearn中,我们可以通过规定正则化路径的长度(即限制α的最⼩值和最⼤值之间的⽐例),以及路径中α的个数,来让 sklearn为我们⾃动⽣成α的取值,这就避免了我们需要⾃⼰⽣成⾮常⾮常⼩的α的取值列表来让交叉验证类使⽤,类Lassocv⾃⼰就可以计算了。
和岭回归的交叉验证类相似,除了进⾏交叉验证之外, LassoCV也会单独建⽴模型。它会先出最佳的正则化参数,然后在这个参数下按照模型评估指标进⾏建模。需要注意的是, LassoCV的模型评估指标(交叉验证结果)选⽤的是均⽅误差,⽽岭回归的模型评估指标是可以⾃⼰设定的,并且默认是R2。
♦ linear_model.LassoCV类
class sklearn.linear_model.LassoCV(*, eps=0.001, n_alphas=100, alphas=None, fit_intercept=True,
normalize=False, precompute='auto', max_iter=1000, tol=0.0001,
copy_X=True, cv=None, verbose=False, n_jobs=None, positive=False,
random_state=None, selection='cyclic')[source]
①⾃定义alpha范围测试
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.datasets import fetch_california_housing as fch
from sklearn.linear_model import LassoCV
del_selection import train_test_split
# 获取数据集
house_value = fch()
x = pd.DataFrame(house_value.data)
y = house_value.target
# 划分测试集和训练集
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=420)
# 重置索引
for i in[xtrain,xtest]:
i.index =range(i.shape[0])
# ⾃⼰建⽴Lasso进⾏alpha选择的范围
# 形成10为底的指数函数
# 10**(-10) -10**(-2)
alpha_range = np.logspace(-10,-2,200,base=10)
print(alpha_range)# 200个⾃定义的alpha值
fetch最佳用法# LassoCV
lasso_ = LassoCV(alphas=alpha_range,cv=5).fit(xtrain,ytrain)
# 查看最佳正则化系数
best_alpha = lasso_.alpha_ # 0.0020729217795953697
# 调⽤所有的交叉验证结果:均⽅误差 --- 每个alpha对应的五折交叉验证结果(200,5)
each_five_alpha = lasso_.mse_path_
#[[0.52454913 0.49856261 0.55984312 0.50526576 0.55262557]
# [0.52361933 0.49748809 0.55887637 0.50429373 0.55283734]
# [0.52281927 0.49655113 0.55803797 0.5034594 0.55320522]
# [0.52213811 0.49574741 0.55731858 0.50274517 0.55367515]
# [0.52155715 0.49505688 0.55669995 0.50213252 0.55421553]
mean = lasso_.mse_path_.mean(axis=1)#有注意到在岭回归中我们的轴向是axis=0吗?
print(mean.shape)
# (200,)
#在岭回归当中,我们是留⼀验证,因此我们的交叉验证结果返回的是,每⼀个样本在每个 alpha下的交叉验证结果
#因此我们要求每个alpha下的交叉验证均值,就是axis=,跨⾏求均值
#⽽在这⾥,我们返回的是,每⼀个 alpha取值下,每⼀折交叉验证的结果
#因此我们要求每个 alpha下的交叉验证均值,就是axis=1,跨列求均值
# 最佳正则化系数下获得的模型的系数结果
w = lasso_.coef_
# [ 4.29867301e-01 1.03623683e-02 -9.32648616e-02 5.51755252e-01, 1.14732262e-06 -3.31941716e-03 -4.10451223e-01 -4.22410330e-01] # 获取R2指数
r2_score = lasso_.score(xtest,ytest)# 0.6038982670571436
② LassoCV默认参数配置测试
# 使⽤LassoCV⾃带正则化路径长度和路径中的alpha个数来⾃动建⽴alpha选择的范围
ls_ = LassoCV(eps=0.0001,n_alphas=300,cv=5).fit(xtrain,ytrain)
# 查看最佳alpha
b_alpha = ls_.alpha_ # 0.0029405973698326477
# 查看是否有⾃动⽣成的alpha取值
new_alpha = ls_.alphas_
print(ls_.alphas_.shape)# (300,)
# 查看R2指数
r2 = ls_.score(xtest,ytest)# 0.6036135609816554
# 查看特征系数
W = ls_.coef_
# [ 4.26722427e-01 1.04253992e-02 -8.71648975e-02 5.20444027e-01, 1.40841579e-06 -3.30718197e-03 -4.09361522e-01 -4.20836139e-01]
可以看出来通过⾃定义alpha或LassoCV⾃带的正则化路径进⾏测试,最终的结果都相差不⼤,所以按照本数据⽽⾔,最佳正则化系数约为0.002-0.003之间,此时的模型训练最佳。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论