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

Keras的Sequential或Functional API模型预测分类目标时如何获取类别标签?

原有方法的可靠性分析

你目前使用的两种方法都不具备完全可靠性,核心原因是两者的类别顺序都没有和模型输出的softmax维度顺序做强制绑定:

  • pd.get_dummies(y_train["Category_Target"]).columns会按类别字典序升序排列返回列名,除非你训练时的标签编码逻辑和这个排序完全一致,否则就会出现标签错配。
  • y_train.drop_duplicates(by = "Category_Target")["Category_Target"]会按类别在训练集中首次出现的顺序返回,和get_dummies的排序逻辑、模型训练时的标签编码逻辑都没有对应关系,错配概率更高。

可靠的实现方案

最稳妥的方式是在数据预处理阶段就通过标签编码器固定类别和编码索引的映射关系,全程使用统一的映射规则匹配模型输出:

步骤1:统一编码训练标签

使用sklearn.preprocessing.LabelEncoder在训练集上拟合,固定类别到整数索引的映射:

from sklearn.preprocessing import LabelEncoder
import numpy as np

# 拟合训练集标签,得到固定的映射关系
label_encoder = LabelEncoder()
y_train_encoded = label_encoder.fit_transform(y_train["Category_Target"])
# label_encoder.classes_ 即为按编码顺序排列的原始类别,索引n对应第n个类别的原始标签,和softmax输出维度一一对应

步骤2:使用编码后的标签训练模型

训练时传入编码后的标签,和你当前使用的sparse_categorical_crossentropy损失函数完全兼容:

model.fit(
    X_train,
    y_train_encoded,
    epochs = 10,
    batch_size = 50,
    verbose = 1
)

步骤3:预测时直接转换为原始标签

不需要手动给概率矩阵加列名,直接取概率最大值的索引,通过编码器反向转换为原始类别标签即可:

# 提取分类任务的预测概率数组
y_pred_proba = model.predict(X_train)[0]
# 取概率最高的维度索引
y_pred_max_idx = np.argmax(y_pred_proba, axis=1)
# 转换为原始类别标签
y_pred_labels = label_encoder.inverse_transform(y_pred_max_idx)

如果需要保留每个类别的概率值并对应正确的列名,直接使用编码器的classes_属性即可:

y_pred_proba_df = pd.DataFrame(y_pred_proba, columns=label_encoder.classes_)

额外注意事项

你当前代码中定义模型时outputs = [regression_output_1, classification_output_1],但并未定义regression_output_1,且编译、训练时都只使用了分类任务的配置,如果不需要回归任务,建议直接修改模型定义为outputs = classification_output_1,避免预测时多取一层索引的冗余操作。

内容的提问来源于stack exchange,提问作者Daniel Coben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:06:00