You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多分类模型生成classification_report触发ValueError问题求助

文本分类模型classification_report报错解决

问题现象

运行文本分类模型的评估代码时,调用sklearn.metrics.classification_report抛出如下错误:

ValueError: Classification metrics can't handle a mix of multiclass and continuous-multioutput targets

代码实现(出错版本)

数据预处理与编码

train_size = int(len(df) * 0.7,)
train_text = df['cleansed_text'][:train_size]
train_cat = df['category'][:train_size]

test_text = df['cleansed_text'][train_size:]
test_cat = df['category'][train_size:]

max_words = 2500
tokenize = text.Tokenizer(num_words=max_words, char_level=False)
tokenize.fit_on_texts(train_text) 

x_train = tokenize.texts_to_matrix(train_text)
x_test = tokenize.texts_to_matrix(test_text)

encoder = LabelEncoder()
encoder.fit(train_cat)
y_train = encoder.transform(train_cat)
y_test = encoder.transform(test_cat)

num_classes = np.max(y_train) + 1
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

模型构建与训练

model = Sequential()
model.add(Dense(256, input_shape=(max_words,)))
model.add(Dropout(0.5))
model.add(Dense(256,))
model.add(Dropout(0.5))
model.add(Activation('relu'))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.summary()
history = model.fit(x_train, y_train,
                    batch_size=32,
                    epochs=10,
                    verbose=1,
                    validation_split=0.1)

评估代码(出错部分)

from sklearn.metrics import classification_report

y_test_arg=np.argmax(y_test,axis=1)
Y_pred = np.argmax(model.predict(x_test),axis=1)
print('Confusion Matrix')
print(confusion_matrix(y_test_arg, Y_pred))

print(classification_report(y_test_arg, y_pred, labels=[1,2,3,4,5]))

错误原因分析

从变量输出和代码细节可以明确问题:

  • y_test_arg是经过np.argmax转换后的多分类整数标签,属于multiclass类型
  • 代码中已经将模型预测结果转换为整数标签并赋值给Y_pred,但调用classification_report时误写为小写的y_pred,而y_pred是模型直接输出的概率矩阵,属于continuous-multioutput类型
  • 分类指标函数要求输入的真实标签与预测标签类型必须一致,两种不同类型的目标变量传入后触发类型不匹配报错

解决方法

修正评估代码中的变量名,将classification_report里的y_pred改为Y_pred,确保传入的是经过np.argmax转换后的整数标签,与y_test_arg类型一致:

from sklearn.metrics import classification_report

y_test_arg=np.argmax(y_test,axis=1)
Y_pred = np.argmax(model.predict(x_test),axis=1)
print('Confusion Matrix')
print(confusion_matrix(y_test_arg, Y_pred))

# 修正变量名为Y_pred
print(classification_report(y_test_arg, Y_pred, labels=[1,2,3,4,5]))

额外注意:从y_test_arg的输出可以看到标签编码后包含0类,当前labels=[1,2,3,4,5]会忽略0类的评估结果。若需要评估所有类别,可改为labels=np.arange(num_classes)或者直接去掉labels参数,让函数自动识别所有类别。

内容的提问来源于stack exchange,提问作者Jeren Suen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:54:16