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_cpus
或n_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 冻结