performance - ElasticNet 非常慢

标签 performance scikit-learn

我正在使用 sklearn 运行弹性网络模型。我的数据集有 70k 个观察值和 20 个特征。我想测试不同的参数并使用以下代码:

alpha_plot, l1_ratio_plot = np.linspace(min_xlim, max_xlim, 50), np.linspace(0, 1, 10)
alpha_grid, l1_ratio_grid = np.meshgrid(alpha_plot, l1_ratio_plot)
l1_ratio_alpha_grid = np.array([l1_ratio_grid.ravel(), alpha_grid.ravel()]).T

model_coefficients_analysis = []

for i in l1_ratio_alpha_grid:
    
    model_analysis = ElasticNet(alpha=i[1], l1_ratio=i[0], fit_intercept=True, max_iter=10000).fit(self.features_train_std, self.labels_train)
    model_coefficients_analysis.append(model_analysis.coef_)

我知道这可以使用 GridsearchCV 来完成,但它不适合我,因为我需要存储每个测试参数组合的系数。当前的代码片段非常慢。每次 50*10 迭代大约需要 10 分钟。有没有办法加快这个过程?例如,在 GridsearchCV 中,有一个参数 n_jobs 可以设置为 -1 以加快该过程。但我这里好像没找到。

最佳答案

It takes roughly 10 minutes for each of the 50*10 iterations

这看起来很高,但你的数据也相当大;我无法将随机的此类数据集放入 Colab 的内存中(我通常在此处运行示例以获取答案)。您可能无法大幅缩短首次拟合时间,但也许可以通过使用热启动来减少后续拟合时间。

设置warm_start=True并为每次迭代使用相同的模型对象,系数将被保存为下一次迭代中求解器的起点:

model_analysis = ElasticNet(fit_intercept=True, max_iter=10000)
for i in l1_ratio_alpha_grid:
    model_analysis.set_params(alpha=i[1], l1_ratio=i[0])
    model_analysis.fit(self.features_train_std, self.labels_train)
    model_coefficients_analysis.append(model_analysis.coef_)

您可能会考虑使用ElasticNetCV,因为它在内部使用热启动,并且提供了一些其他优点。如果添加 k 倍交叉验证会增加太多费用,则可以使用 PredefinedSplit,但我相信 n_jobs 参数仅在跨超参数拆分作业时有用和折叠,因此使用更多核心可能会缓解 k 折叠的问题(但随后您也会拥有 k 倍的系数)。

你的大max_iter有点令人担忧;你得到不收敛吗?从你的自变量名称来看,你似乎正在缩放,但如果不是,那就是开始的地方:快速(也许是正确的)收敛取决于具有相似尺度的特征。您还可以考虑提高收敛标准tol。我没有使用 selection 参数的经验,但文档字符串建议将其更改为 random 可能会加快收敛速度​​?

关于performance - ElasticNet 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73785234/

相关文章:

php - 哪个更快?常量、变量或变量数组

ios - 循环处理时间太长

python - sklearn.plot_tree 如何可视化分类任务的 class_labels?

python - 我正在进行分层分割并出现越界错误,我不明白为什么

machine-learning - Scikit_learn 的 PolynomialFeatures 与逻辑回归导致分数较低

python - 用于多项式回归的 GridsearchCV

c# - Parallel.For() 会随着重复执行而变慢。我应该看什么?

c - 多个位 vector ;如何找到恰好设置 n 次的位?

python - 更高效/时尚的代码来转换数据结构

python - 无法重建分解图像