解决OneHotEncoder初始化报错:收到意外参数categorical_features
报错原因
scikit-learn 0.22及后续版本正式移除了OneHotEncoder类的categorical_features参数,旧版教程中基于老版本API编写的代码无法直接在新版环境运行。除此之外你的原代码还存在一处笔误:调用fit_transform时误用了类名OneHotEncoder,而非你实例化生成的编码器对象onehotencoder。
解决方案
官方推荐写法(适配所有0.22+版本scikit-learn)
使用ColumnTransformer指定待编码的列,其余列默认保留,不需要提前对分类列做LabelEncoder转换——新版OneHotEncoder可直接处理字符串类型分类值,提前用LabelEncoder转整数反而会给无序分类值引入无意义的序数关系,干扰模型效果。
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 定义列转换器:仅对索引为3的列做独热编码,其余列原样保留 col_transformer = ColumnTransformer( transformers=[ # sparse_output=False直接返回稠密数组,无需额外调用toarray() # 如果你的sklearn版本低于1.2,把sparse_output换成sparse即可 ('ohe', OneHotEncoder(sparse_output=False), [3]) ], remainder='passthrough' ) X = col_transformer.fit_transform(X)
手动拼接写法(不依赖ColumnTransformer)
如果不想引入ColumnTransformer,可以单独提取待编码列做转换,再和其余列手动拼接:
from sklearn.preprocessing import OneHotEncoder import numpy as np onehotencoder = OneHotEncoder(sparse_output=False) # 提取第3列做独热编码,注意传入二维数组格式 encoded_feature = onehotencoder.fit_transform(X[:, [3]]) # 拼接:原数据剔除第3列 + 编码后的独热列 X = np.concatenate([X[:, :3], encoded_feature, X[:, 4:]], axis=1)
注意事项
- 不需要再对分类列提前做LabelEncoder转换,该步骤在新版API下属于冗余操作,还可能引入特征偏差
- 编码后如果需要对齐特征名,可以通过
col_transformer.get_feature_names_out()获取所有输出列的名称,方便后续做特征重要性分析等操作
内容的提问来源于stack exchange,提问作者Mario16
相关产品推荐
相关产品推荐

