在 sklearn 中访问从 ElasticNetCV 获得的正则化路径

Posted

技术标签:

【中文标题】在 sklearn 中访问从 ElasticNetCV 获得的正则化路径【英文标题】:Access the regularization paths obtained from ElasticNetCV in sklearn 【发布时间】:2018-04-01 14:01:54 【问题描述】:

我想得到这些地块: http://scikit-learn.org/stable/auto_examples/linear_model/plot_lasso_coordinate_descent_path.html

来自我已经训练过的弹性网。 这个例子确实

from sklearn.linear_model import lasso_path, enet_path
from sklearn import datasets

diabetes = datasets.load_diabetes()
X = diabetes.data
print("Computing regularization path using the elastic net...")
alphas_enet, coefs_enet, _ = enet_path(
    X, y, eps=eps, l1_ratio=0.8, fit_intercept=False)

这基本上需要从X,y 重新计算整个模型。 不幸的是,我没有X,y

在训练中我使用了sklearn.linear_model.ElasticNetCV,它返回:

coef_ : array, shape (n_features,) | (n_targets, n_features)

    parameter vector (w in the cost function formula)

mse_path_ : array, shape (n_l1_ratio, n_alpha, n_folds)

Mean square error for the test set on each fold, varying l1_ratio and alpha.

虽然我需要改变 l1_ratio 和 alpha 的参数向量。

这可以在不重新计算的情况下完成吗?这将是极大的浪费时间,因为这些 coef_paths 实际上已经计算出来了

【问题讨论】:

【参考方案1】:

简答

一旦合适就不行了。

长答案

如果您查看ElasticNetCV 的源代码,您将看到在 fit 方法中,该类正在调用 enet_path,但将 alphas 设置为在 ElasticNet 中初始化的 alpha 值(默认为 1.0 ) 由ElasticNetCV 中的 alphas 值设置,最终将成为单个值。因此,无需计算允许您创建路径图的默认 100 个 alpha 值的系数,您只需为您在 CV 中设置的每个 alpha 值获取一个。话虽如此,您可以初始化 CV 中的 alpha 以模仿 enet_path 中的 100 默认值,然后组合每个折叠的系数,但这将是相当长的运行时间。正如您提到的,您已经适合 CV,这不是一个选择。

【讨论】:

好的。感谢您的回答。我希望我错过了一些未记录的功能。在我的情况下,EN 已经适合超过 100 个默认 alpha 值,因此在 CV 中设置的值确实足以重现图表。我认为这是一个设计错误,因为已经为每个折叠和每个 alpha 计算了系数,但它们没有存储/返回给调用者 总之,我必须找回 X,y 并重新训练

以上是关于在 sklearn 中访问从 ElasticNetCV 获得的正则化路径的主要内容,如果未能解决你的问题,请参考以下文章

Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

sklearn中的逻辑回归

Lasso_ElasticNet_PolynomialFeatures算法介绍---人工智能工作笔记0032

Python 3:NameError:未定义名称“sklearn”

在 sklearn 中访问从 ElasticNetCV 获得的正则化路径

机器学习经典算法