为什么GridSearchCV在'方法'获取''thread.lock'对象}上花费的时间超过50%?

时间:2013-11-19 13:28:32

标签: python scikit-learn

最近我正在调整我的一些机器学习管道。我决定利用我的多核处理器。我用param n_jobs=-1运行交叉验证。我也描述了它以及对我来说多么令人惊讶:最重要的功能是:

{method 'acquire' of 'thread.lock' objects}

由于我在Pipeline的操作,我不确定这是不是我的错。所以我决定做一个小实验:

pp = Pipeline([('svc', SVC())])
cv = GridSearchCV(pp, {'svc__C' : [1, 100, 200]}, jobs=-1, cv=2, refit=True)
%prun cv.fit(np.random.rand(1e4, 100), np.random.randint(0, 5, 1e4))

输出结果为:

2691 function calls (2655 primitive calls) in 74.005 seconds
Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   83   43.819    0.528   43.819    0.528 {method 'acquire' of 'thread.lock' objects}
    1   30.112   30.112   30.112   30.112 {sklearn.svm.libsvm.fit}

我想知道这种行为的原因是什么。如果有可能加快它的速度。

1 个答案:

答案 0 :(得分:6)

探查器只告诉你主进程正在做什么,而它的子进程正在完成所有工作。在这种情况下,在verbose=2上设置GridSearchCV可能会提供比%prun更好的输出。