scikit-learn 0.21.3导入_deprecate_positional_args报错求助
解决ImportError: cannot import name '_deprecate_positional_args' from 'sklearn.utils.validation'
嘿,这个问题我之前也碰到过——你用的scikit-learn 0.21.3版本里根本没有_deprecate_positional_args这个函数,它是在scikit-learn 0.22及以后的版本才被添加到sklearn.utils.validation模块中的。给你两个靠谱的解决方案:
方案一:升级scikit-learn版本
这是最直接省事的办法,执行下面的命令把scikit-learn升级到至少0.22版本(建议直接升到最新的稳定版,能避免更多兼容性问题):
pip install --upgrade scikit-learn>=0.22
升级完成后,你就能正常导入这个函数了。
方案二:手动实现该函数(如果无法升级版本)
如果因为项目依赖限制不能升级scikit-learn,你可以自己在代码里实现这个装饰器的核心功能,完全能替代原函数的作用:
import warnings import inspect def _deprecate_positional_args(func): """Decorator to warn about deprecated positional arguments""" sig = inspect.signature(func) all_param_names = list(sig.parameters.keys()) # 筛选出仅限关键字传入的参数 kwonly_param_names = [ name for name, param in sig.parameters.items() if param.kind == inspect.Parameter.KEYWORD_ONLY ] def wrapper(*args, **kwargs): # 计算允许传入的最大位置参数数量 max_positional_args = len(all_param_names) - len(kwonly_param_names) if len(args) > max_positional_args: # 找出被错误传入的位置参数 deprecated_args = all_param_names[max_positional_args:max_positional_args + (len(args)-max_positional_args)] warnings.warn( f"Passing {', '.join(deprecated_args)} as positional argument(s) is deprecated. " "Please pass them as keyword argument(s) instead.", FutureWarning, stacklevel=2 ) return func(*args, **kwargs) return wrapper
把这段代码放在你需要使用该函数的文件顶部,之后直接用这个自定义的_deprecate_positional_args就行,不用再从sklearn导入了。
内容的提问来源于stack exchange,提问作者sahar allègue
相关产品推荐
相关产品推荐

