如何将模型预测的独热编码结果转换为原始类别向量?
如何将Keras模型输出的独热编码预测结果转换为原始类别向量?
这个问题很常见,尤其是在使用独热编码做分类任务后,需要把模型输出的概率结果转回原始类别标签。结合你的代码,我给你两种简单的解决方法:
方法一:直接利用np.argmax映射(适用于二分类且类别为0/1的场景)
你的任务是二分类(最后一层输出2个单元+softmax),而且原始target是0和1的整数类别。因为pd.get_dummies(y)生成的独热编码列是按类别升序排列的(即第一列对应0,第二列对应1),所以用np.argmax取概率最大的索引,直接就是原始类别值:
# 获取每个样本概率最大的类别索引,结果就是原始类别向量 predicted_classes = np.argmax(predictions, axis=1)
这样得到的predicted_classes就是和独热编码前的原始y完全一致的格式,比如array([0, 1, 0, 1, ...])。
方法二:基于pd.get_dummies的列映射(通用所有类别场景)
如果你的原始类别不是0/1,或者后续可能扩展为多分类,这个方法更通用。因为pd.get_dummies生成的DataFrame的列名就是原始的类别标签,我们可以通过索引映射回去:
# 1. 获取每个样本概率最大的类别索引 pred_indices = np.argmax(predictions, axis=1) # 2. 获取独热编码对应的原始类别标签(从之前的y中提取) # 这里y是pd.get_dummies生成的DataFrame,columns就是原始类别 original_class_labels = y.columns.astype(int) # 如果原始类别是字符串则去掉astype(int) # 3. 将索引转换为原始类别向量 predicted_classes = original_class_labels[pred_indices]
为什么这个方法可靠?
pd.get_dummies会自动按类别值的升序排列列,只要你的原始类别集合不变,列的顺序就固定,所以索引和原始类别是一一对应的。
验证方法
你可以用测试集的y_test来验证转换是否正确:
# 把独热编码的y_test转回原始类别 y_test_original = y_test.columns[np.argmax(y_test.values, axis=1)] # 模型预测X_test test_predictions = model.predict(X_test) test_pred_classes = np.argmax(test_predictions, axis=1) # 对比准确率(结果应该和模型训练时输出的accuracy一致) print(np.mean(test_pred_classes == y_test_original.astype(int)))
内容的提问来源于stack exchange,提问作者Xceptions
相关产品推荐
相关产品推荐

