sklearn OneHotEncoder输出异常 1D标签独热编码结果不符该如何修复
问题原因
你调用fit_transform时传入的数组维度错误:OneHotEncoder要求输入为*(样本数, 特征数)*格式的二维数组,你使用y_train.reshape(1,-1)会把所有标签拼接为1行、长度等于样本总数的数组,编码器会将每个位置识别为独立类别,最终输出1行多列的稀疏矩阵,完全不符合预期。
修复方案
调整reshape参数,将标签转换为*(样本数, 1)*格式的二维数组,同时根据需求选择输出格式:
- 如果你使用scikit-learn 1.2及以上版本,直接在初始化编码器时指定
sparse_output=False,即可直接得到你要的二维数组格式:
from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder(sparse_output=False) # 核心改动:reshape(-1,1) 让每个标签单独占一行 y_train_onehot = enc.fit_transform(y_train.reshape(-1, 1))
- 如果你使用旧版本scikit-learn,或者需要保留稀疏矩阵后续处理,可以调用
toarray()方法转换格式:
from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder() y_train_onehot = enc.fit_transform(y_train.reshape(-1, 1)).toarray()
输出说明
默认情况下编码器会按数值升序排列类别,也就是-1对应第一列、0对应第二列、1对应第三列,输出格式和你预期完全一致:
[[0. 1. 0.] [0. 1. 0.] [0. 1. 0.] [1. 0. 0.] [0. 0. 1.] ...]
如果需要自定义类别顺序,可在初始化OneHotEncoder时传入categories参数指定,例如OneHotEncoder(categories=[[0, -1, 1]], sparse_output=False)即可调整列的顺序。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

