Scikit-learn: GridSearchCV.fit(...,n_job=-1) 可能包含并行性错误

创建于 2020-09-11  ·  3评论  ·  资料来源: scikit-learn/scikit-learn

在提交错误之前,请通过搜索过去的问题确保该问题尚未得到解决。

描述错误

使用n_jobs=-1调用GridSearchCV.fit()会引发异常“ OSError: [Errno 22] 无效参数”。
n_jobs=None调用GridSearchCV.fit() n_jobs=None效果很好

n_jobs=None的情况下,输出显示它解析了 n_jobs=1(尽管在我的其他程序中,GridSearchCV 的任何成功运行都会在同一台机器上解析 n_jobs=6,这可能不是一个大问题。仅供参考)。

可能问题出在 (1) lib\site-packages\joblib\parallel.py 或 _parallel_backends.py 或 (2) lib\concurrent\futures_base.py,如下面的回溯所示。

重现的步骤/代码

请添加一个我们可以通过运行代码重现错误的最小示例。 尽可能简洁,不要依赖外部数据。 简而言之,我们将复制粘贴您的代码,我们希望得到与您相同的结果。 示例:md5-0c48dcb0a123e7134795a5b1cc42e4f2 如果代码太长,请随意将其放入 public gist 并在 issue 中链接:https://gist.github.com
search = GridSearchCV(RandomForestClassifier(), param_grid, cv=3, n_jobs=-1, return_train_score=True, verbose=2)
search.fit(feature_matrix, labels)

预期成绩


不会抛出任何错误。

实际结果


OSError: [Errno 22] 无效参数

详细的引用附在下面:


_RemoteTraceback 回溯(最近一次调用最后一次)
_RemoteTraceback:
"""
回溯(最近一次调用最后一次):
文件“C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py”,第 431 行,在 _process_worker
r = call_item()
文件“C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py”,第 285 行,在__call__
返回 self.fn( self.args, * self.kwargs)
文件“C:Users\tlbh9\Anaconda3\lib\site-packages\joblib_parallel_backends.py”,第 595 行,在__call__
返回 self.func( args, * kwargs)
文件“C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py”,第 252 行,在__call__
返回 [func( args, * kwargs)
文件“C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py”,第 252 行,在
返回 [func( args, * kwargs)
文件“C:Users\tlbh9\Anaconda3\lib\site-packages\sklearn\model_selection_validation.py”,第 505 行,在 _fit_and_score
print("[CV] %s %s" % (msg, (64 - len(msg)) * '.'))
OSError: [Errno 22] 无效参数
"""

上述异常是以下异常的直接原因:

OSError 回溯(最近一次调用最后一次)

......
212 search = GridSearchCV(RandomForestClassifier(),param_grid,cv=3,n_jobs=-1,return_train_score=True,verbose=2)
--> 213 search.fit(feature_matrix, 标签)
......

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, kwargs)第 71 章72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})---> 73 返回 f( kwargs)
74 返回inner_f
75

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py​​ in fit(self, X, y, groups, **fit_params)
734 返回结果
735
--> 736 self._run_search(evaluate_candidates)
737
738 #对于多指标评估,存储best_index_、best_params_和

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py​​ in _run_search(self,evaluate_candidates)
1186 def_run_search(自我,评估候选人):
第 1187 章
-> 1188evaluate_candidates(ParameterGrid(self.param_grid))
1189
1190

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py​​ 中的evaluate_candidates(candidate_params)
第 706 章
707
--> 708 out = parallel(delayed(_fit_and_score)(clone(base_estimator),
第709话
710 火车=火车,测试=测试,

~\Anaconda3\lib\site-packages\joblib\parallel.py in __call__ (self, iterable)
1040
1041 与 self._backend.retrieval_context():
-> 1042 self.retrieve()
1043 # 确保我们收到最后一条消息,告诉我们已经完成
1044 elapsed_time = time.time() - self._start_time

~\Anaconda3\lib\site-packages\joblib\parallel.py 在检索(自我)
919尝试:
920 如果 getattr(self._backend, 'supports_timeout', False):
--> 921 self._output.extend(job.get(timeout=self.timeout))
922 其他:
923 self._output.extend(job.get())

~\Anaconda3\lib\site-packages\joblib_parallel_backends.py in wrap_future_result(future, timeout)
540 AsyncResults.get from multiprocessing."""
541尝试:
--> 542 return future.result(timeout=timeout)
543 除了 CfTimeoutError 作为 e:
第544回

~\Anaconda3\lib\concurrent\futures_base.py 在结果(自我,超时)
第430回
431 elif self._state == 完成:
--> 432 返回 self.__get_result()
433
434 self._condition.wait(超时)

~\Anaconda3\lib\concurrent\futures_base.py 在 __get_result(self)
第386话
第387话
--> 388 引发 self._exception
389 其他:
第390回

OSError: [Errno 22] 无效参数

版本


系统:
python:3.8.3(默认,2020 年 7 月 2 日,17:30:36)[MSC v.1916 64 位(AMD64)]
可执行文件:C:Users\tlbh9\Anaconda3\python.exe
机器:Windows-10-10.0.18362-SP0

Python依赖:
点数:20.1.1
设置工具:49.2.0.post20200714
sklearn:0.23.1
麻木:1.18.5
scipy:1.5.0
赛通:0.29.21
熊猫:1.0.5
matplotlib:3.2.2
作业库:0.16.0
线程池控制:2.1.0

使用 OpenMP 构建:True

感谢您的贡献!
triage

所有3条评论

@tluocs你能分享完整的代码吗,因为我试图重现这个问题,它说 param_grid 没有定义。
我想知道你是如何分配 param_grid 和 feature_matrix 的。
如果您可以共享上述行代码中使用的所有变量来重现问题,那就更好了。

谢谢安舒。 代码相当多,所以重现问题似乎并不容易。 这就是我在提出问题时试图输入所有必要信息的原因。 现在我刚刚通过将我的 python 和 scikit-learn 升级到最新版本来解决它(尽管我之前的版本已经很新了,日期是 2020 年 7 月)。 所以我猜这个“错误”(如果是的话)可能已经在最新版本中修复了。

感谢@tluocs伸出援手,感谢@AnshuTrivedi 对此进行了研究。
如果我理解正确,问题已通过更新解决,我将关闭它。 如果仍然需要修复某些内容,请随时重新打开。 谢谢。

此页面是否有帮助?
0 / 5 - 0 等级