最近我正在调整我的一些机器学习管道。我决定利用我的多核处理器。我用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}
我想知道这种行为的原因是什么。如果有可能加快它的速度。
答案 0 :(得分:6)
探查器只告诉你主进程正在做什么,而它的子进程正在完成所有工作。在这种情况下,在verbose=2
上设置GridSearchCV
可能会提供比%prun
更好的输出。