使用n_jobs=-1的GridSearchCV无法为决策树/随机森林分类工作

3

我正尝试使用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 错误日志: error message 非常感谢您的任何帮助!

什么操作系统?你尝试把代码放在 if __name__ == "__main__": 下面了吗?也可以尝试结合两者,将 import ... parallel_backend 放在你的代码顶部,并将 for classifier... 循环放在 with parallel_backend... 子句中。如果不熟悉 multiprocessing... 可以参考相关文档。 - E. Bassett
@E.Bassett 我的系统是Linux Mint,但这段代码在Google Colab上可以运行。 - bbasaran
1个回答

2

您不需要使用任何额外的调用来创建线程。您的第一个代码片段应该可以工作。如果您调用:

n_cpus = multiprocessing.cpu_count()

它返回什么? 如果您使用它,然后传递n_jobs = n_cpus或n_jobs = n_cpus-1(如果您不想让计算机被占用),请查看是否有效。 来自sklearn逻辑回归文档: n_jobs int,默认值为None。多类=“ovr”时并行化类别时使用的CPU核心数。无论是否指定'multi_class',当求解器设置为'liblinear'时,都会忽略此参数。 因此,可能是工作的模型实际上并没有使用超过1个CPU。 希望这些想法中的一些能够帮助到您。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接