n_jobs=-1 的 GridSearchCV 不适用于决策树/随机森林分类

Posted

技术标签:

【中文标题】n_jobs=-1 的 GridSearchCV 不适用于决策树/随机森林分类【英文标题】:GridSearchCV with n_jobs=-1 is not working for Decision Tree/Random Forest classification 【发布时间】:2020-06-28 22:54:28 【问题描述】:

我正在尝试使用 GridSearchCV 来评估具有不同参数集的不同模型。逻辑回归和 k-NN 不会导致问题,但决策树、随机森林和其他一些类型的分类器在 n_jobs=-1 时不起作用。

for classifier, paramSet, classifierName in zip(list_classifiers, list_paramSets, list_clfNames):
    gs = GridSearchCV(
                      estimator = classifier,
                      param_grid = paramSet,
                      cv = 10,      
                      n_jobs = -1           
                    )
    gs.fit(X_train, y_train)
    plot_learning_curve(gs, "Learning Curve", X_train, y_train, n_jobs=-1)

我正在使用 Google Colab,但以下任一解决方案建议都没有解决我的问题。

from sklearn.externals.joblib import parallel_backend
clf = GridSearchCV(...)
with parallel_backend('threading',n_jobs = -1):
    clf.fit(x_train, y_train)
if __name__ == "__main__":
    import multiprocessing as mp; mp.set_start_method('forkserver', force=True) // 'spawn' has also failed
    /// Gridsearch and fit here ///

这是我的源代码:https://github.com/bahadirbasaran/pulsarDetection/blob/master/main.ipynb

错误日志:

任何帮助将不胜感激!

【问题讨论】:

什么操作系统?您尝试将代码放在if __name__ == "__main__": 下?以及两者的结合,所以 import ... parallel_backend 位于代码顶部,并将 for classifier... 循环放在 with parallel_backend... 子句中。不熟悉multiprocessing... @E.Bassett 我的系统是 Linux Mint,但代码可以在 Google Colab 上运行。 【参考方案1】:

您不需要使用任何额外的调用来创建线程。您的第一个代码 sn-p 应该可以工作。如果你打电话:

n_cpus = multiprocessing.cpu_count()

它返回什么? 如果您使用它然后通过n_jobs=n_cpusn_jobs=n_cpus-1(如果您不希望您的计算机挂钩),看看它是否有效。 来自 sklearn 逻辑回归文档:

n_jobs int, default=None 并行化时使用的 CPU 内核数 如果 multi_class='ovr' 则超过类。该参数被忽略时 求解器设置为“liblinear”,无论“multi_class”是否为 指定与否。

因此,可能正在运行的模型实际上使用的 CPU 不超过 1 个。

希望这些想法对您有所帮助。

【讨论】:

我正在研究 Google Colab。 multiprocessing.cpu_count() 返回 2。当我使用 n_jobs = 2 时,没有任何变化。代码又冻结了。

以上是关于n_jobs=-1 的 GridSearchCV 不适用于决策树/随机森林分类的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn GridSearchCV n_jobs != 1 冻结

keras + scikit-learn 包装器,当 GridSearchCV 与 n_jobs >1 时似乎挂起

GridsearchCV 负分

并行运行 GridsearchCV()

scikit-learn 中的超参数优化(网格搜索)

sklearn Logistic Regression with n_jobs=-1 实际上并没有并行化