Python使用sklearn的GridSearchCV运行时报NOTSET语法错误如何解决?
问题根因与解决建议
核心错误根因
- Python版本与依赖库不兼容
你当前使用的是Python 3.5版本,而报错涉及的_pytest/compat.py中的NOTSET: "Final"写法属于Python 3.6才正式支持的变量类型注解语法,你安装的pytest版本过高,已经不再适配Python 3.5,在GridSearchCV开启多进程(n_jobs=-1)调度时,导入链触发了pytest模块的加载,所以抛出语法错误。你平时单进程运行基础RF模型没有触发这个导入逻辑,所以可以正常运行。 - 超参数配置错误(后续运行会触发的隐藏问题)
你使用的是RandomForestRegressor回归模型,但是参数网格中criterion的取值gini、entropy是分类随机森林的评价准则,回归模型不支持这两个取值,解决版本问题后运行依然会抛出参数不合法错误。
解决建议
- 优先升级Python版本到3.8及以上,目前Python 3.5已经停止维护多年,主流机器学习库都不再对其做适配,升级版本可以避免绝大多数依赖兼容问题。
- 如果暂时无法升级Python版本,可以采取以下两个临时方案:
- 降级pytest到最后一个支持Python 3.5的版本,执行命令:
pip install pytest==4.6.11 - 将GridSearchCV的
n_jobs参数设置为1,关闭多进程并行,避开pytest模块的导入逻辑,缺点是网格搜索速度会变慢。
- 降级pytest到最后一个支持Python 3.5的版本,执行命令:
- 修正参数网格中的
criterion取值,替换为回归模型支持的选项:
新版本sklearn可取值为squared_error、absolute_error、friedman_mse;旧版本sklearn可取值为mse、mae,修改示例:'criterion' :['squared_error', 'absolute_error']
内容的提问来源于stack exchange,提问作者totalsurfer_v1
相关产品推荐
相关产品推荐

