什么都不提供时,LassoCV 中的参数选择如何工作?

Posted

技术标签:

【中文标题】什么都不提供时,LassoCV 中的参数选择如何工作?【英文标题】:How does parameter selection work in LassoCV when nothing is supplied? 【发布时间】:2019-12-03 22:41:31 【问题描述】:

基本上,我想知道 sklearn 中的 LassoCV 在没有提供时如何选择 alpha 值(收缩参数)。运行语句时,

reg = LassoCV(cv = 5) # cv = 5 for 5 fold cross val
reg.fit(X, Y)

我对我得到的结果很满意;但是,我很好奇模型如何选择最佳 alpha。它只是简单地遍历具有给定容差的范围内的所有 alpha 吗?

除此之外,我还想问一下,当您为其提供 alpha 值或使用 n_alphas 参数时会发生什么,即:

reg = LassoCV(cv = 5, alphas = [.1, .2, .001, ...])
reg = LassoCV(cv = 5, n_alphas = 100)

它如何确定这些 alpha 值中的哪一个是最好的?提供多个 alpha 时,它会循环哪些 alpha?

谢谢。

【问题讨论】:

欢迎来到 SO;如果答案解决了您的问题,请接受它(请参阅What should I do when someone answers my question?) - 谢谢 【参考方案1】:

它如何确定这些 alpha 值中的哪一个是最好的?

它对所有提交的值alpha进行交叉验证,并返回最大的score,根据docs,它是决定系数R^2。

当提供多个 alpha 时,它会循环哪些 alpha?

用一个简单的例子很容易看出;为简单起见,只要求n_alphas=5,我们得到:

from sklearn.linear_model import LassoCV
from sklearn.datasets import make_regression
X, y = make_regression(noise=4, random_state=0)
reg = LassoCV(cv=5, n_alphas=5, random_state=0).fit(X, y)

根据docs,拟合对象的属性之一是:

alphas_ : numpy 数组,形状 (n_alphas,)

用于拟合的 alpha 网格

所以,我们有:

reg.alphas_
# result:
array([  6.92751635e+01,   1.23190597e+01,   2.19067302e+00,
         3.89562872e-01,   6.92751635e-02])

确切的值再次由参数eps间接确定,其默认值为0.001;再次来自文档:

eps : 浮动,可选

路径的长度。 eps=1e-3 表示alpha_min / alpha_max = 1e-3

所以,本质上它设置了一个可能的 aplhas 网格,例如最小值与最大值的比率等于@​​987654332@,这里是0.001;让我们验证一下我们的简单示例中的情况:

reg.alphas_[4]/reg.alphas_[0]
# result
0.00099999999999999959

实际上,它确实等于0.001

【讨论】:

啊,我明白了,谢谢你的回答。现在,当我既不提供 n_alphas 也不提供要测试的 alpha 表时会发生什么。它如何确定 alpha 值?此外,在使用 n_alphas 时 - 我了解您给出的路径解释的长度 - 但它如何找到要使用的路径上的哪些 alpha? @tester9271 如果您不提供任何内容,它将使用默认值 n_alphas=100(再次,请参阅文档)。至于其余的,我不确定 - 无论网格长度如何,最大值和最小值似乎总是相同,但我不能说它们是如何选择的。在任何情况下,你都不应该太认真——这只是一种方便;您应该始终喜欢自己提供aplha 的确切值。

以上是关于什么都不提供时,LassoCV 中的参数选择如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn、LassoCV() 和 ElasticCV() 坏了?

我应该使用 LassoCV 还是 GridSearchCV 来找到 Lasso 的最佳 alpha?

scikit-learn 的 LassoCV 的评分指标

到底如何选择PHP框架?YiiThinkPHPlaravelCI.

传入参数 指针 引用和 什么都不加的区别

如何在 SQL*Plus 中将参数(值)从函数传递/调用到“选择”stmt?