sklearn使用OrdinalEncoder报handle_unknown意外关键字参数错误如何解决
问题排查与解决方法
错误核心原因
你遇到的__init__() got an unexpected keyword argument 'handle_unknown'报错,是因为你本地安装的scikit-learn版本过低:handle_unknown和unknown_value两个参数是scikit-learn 0.24版本才正式加入OrdinalEncoder的,低于该版本的环境无法识别这两个入参。
另外你的代码还存在一个隐藏问题:OrdinalEncoder要求输入为二维数组,你直接传入一维的Series(train_d['Language'])会触发维度不匹配的报错。
解决方案
方案1:升级scikit-learn到符合要求的版本(推荐)
直接执行升级命令:
pip install --upgrade scikit-learn # 用conda管理环境的话执行 # conda install scikit-learn>=0.24
升级完成后可执行以下代码确认版本:
import sklearn print(sklearn.__version__)
版本确认≥0.24后,修正维度问题后的可运行代码如下:
from sklearn.preprocessing import OrdinalEncoder import pandas as pd # 你的示例数据转DataFrame df = pd.DataFrame(df) # 这里省略你拆分train_d和test_d的逻辑 oe_l = OrdinalEncoder(handle_unknown ='use_encoded_value',unknown_value = -1) oe_y = OrdinalEncoder(handle_unknown ='use_encoded_value', unknown_value = -1) # 用[[]]取列得到二维数组输入 oe_l.fit(train_d[['Language']]) oe_y.fit(train_d[['Year']]) train_d['Language'] = oe_l.transform(train_d[['Language']]) test_d['Language'] = oe_l.transform(test_d[['Language']]) train_d['Year'] = oe_y.transform(train_d[['Year']]) test_d['Year'] = oe_y.transform(test_d[['Year']])
方案2:无法升级版本的兼容处理
如果你的环境不能升级scikit-learn,就手动实现未知值的处理逻辑,代码如下:
from sklearn.preprocessing import OrdinalEncoder import pandas as pd import numpy as np df = pd.DataFrame(df) # 省略拆分train_d、test_d的逻辑 # 初始化时不传不存在的参数 oe_l = OrdinalEncoder() oe_y = OrdinalEncoder() # 拟合+处理训练集 train_d['Language'] = oe_l.fit_transform(train_d[['Language']]) # 处理测试集未知值:不在训练集类别里的统一赋值为-1 test_d['Language'] = test_d['Language'].apply(lambda x: oe_l.transform([[x]])[0][0] if x in oe_l.categories_[0] else -1) train_d['Year'] = oe_y.fit_transform(train_d[['Year']]) test_d['Year'] = test_d['Year'].apply(lambda x: oe_y.transform([[x]])[0][0] if x in oe_y.categories_[0] else -1)
内容的提问来源于stack exchange,提问作者AnonymousMe
相关产品推荐
相关产品推荐

