如何用LabelEncoder对多列编码且训练集测试集使用相同转换规则
错误原因
LabelEncoder仅支持输入1维数组,你直接传入10列的二维DataFrame触发了维度校验错误- 原代码中
le.fit(categorical_columns)是对列名列表做拟合,完全不符合需求,拟合对象应该是训练集对应列的实际数据
修复方案
方案1:逐列使用LabelEncoder
为每个类别列单独训练并保存编码器,保证训练集、测试集使用相同转换规则:
from sklearn.preprocessing import LabelEncoder categorical_columns = train.columns[:10].tolist() # 用字典存储每个列对应的编码器,方便后续复用 encoder_dict = {} for col in categorical_columns: le = LabelEncoder() # 仅在训练集的当前列上拟合规则 le.fit(train[col]) # 分别转换训练集和测试集的当前列 train[col] = le.transform(train[col]) test[col] = le.transform(test[col]) encoder_dict[col] = le
方案2:使用OrdinalEncoder(原生支持多列编码,代码更简洁)
OrdinalEncoder是sklearn专门设计用来做多列类别特征编码的工具,适配你的批量处理需求:
from sklearn.preprocessing import OrdinalEncoder categorical_columns = train.columns[:10].tolist() oe = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1) # 直接在训练集所有类别列上拟合规则 oe.fit(train[categorical_columns]) # 同时转换多列 train[categorical_columns] = oe.transform(train[categorical_columns]) test[categorical_columns] = oe.transform(test[categorical_columns])
注意事项
上面方案2的handle_unknown和unknown_value参数是用来处理测试集出现训练集未见过的类别的情况,遇到未知类别时会统一编码为你指定的数值(示例中为-1),避免程序抛出错误。
内容的提问来源于stack exchange,提问作者Sticky
相关产品推荐
相关产品推荐

