Keras独热编码报错ValueError:y应为1d数组,得到(9121,14)形状如何解决
错误原因
- 触发
ValueError: y should be a 1d array, got an array of shape (9121, 14) instead的核心原因是LabelEncoder.fit_transform()方法仅支持1维数组作为输入,但你传入的y_train、y_test是形状为(样本数,14)的二维数组,不符合输入要求。 - 原有代码存在逻辑漏洞:测试集直接调用
fit_transform()会重新拟合标签编码器,导致训练集和测试集的标签编码规则不一致,最终模型的训练、评估结果都会出现偏差。
修复方案
根据你的标签类型选择对应处理方式即可:
单标签场景
如果你的二维标签数组是单标签被错误转为二维(比如每一行仅存储一个标签值、嵌套结构导致意外升维),先将标签降为1维,再修正测试集的编码逻辑即可,修复后的完整代码如下:
import numpy as np import tensorflow import keras from keras.utils import np_utils from sklearn.preprocessing import LabelEncoder import pickle # 数据格式转换 X_train = np.array(X_train) y_train = np.array(y_train) X_test = np.array(X_test) y_test = np.array(y_test) # 将二维标签数组压缩为1维 # 如果你的14列中只有某一列是实际标签,可替换为 y_train = y_train[:, 对应列索引] y_train = y_train.flatten() y_test = y_test.flatten() # 标签独热编码 lb = LabelEncoder() # 训练集拟合编码器并做转换 y_train = np_utils.to_categorical(lb.fit_transform(y_train)) # 测试集直接使用训练集拟合好的编码器做转换,不重新拟合 y_test = np_utils.to_categorical(lb.transform(y_test)) print(X_train.shape) print(lb.classes_) # print(y_train[0:10]) # print(y_test[0:10]) # 序列化编码器用于后续使用 filename = 'labels' outfile = open(filename,'wb') pickle.dump(lb,outfile) outfile.close()
多标签场景
如果你当前的(9121,14)数组本身就是多标签任务的0/1编码结果,不需要再做独热编码处理,直接删除LabelEncoder和to_categorical相关代码,用现有y_train、y_test训练模型即可。
内容的提问来源于stack exchange,提问作者Md Abrar Mahir
相关产品推荐
相关产品推荐

