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

基于多维数组计算多分类NLP模型的混淆矩阵

解决多分类NLP模型的混淆矩阵计算问题

针对你的多分类场景,需要先把one-hot编码的真实标签和模型输出的多维预测分数转换成一维的类别索引,再计算混淆矩阵。下面是具体实现方案:

步骤1:转换多维数组为一维类别索引

处理真实标签(label_ids)

你的result.label_ids是one-hot格式(每个样本对应长度为4的数组,正确类别为1),用np.argmax可以快速提取每个样本的真实类别索引(0-3):

import numpy as np

# 转换one-hot标签为一维类别索引
true_labels = np.argmax(result.label_ids, axis=1)

处理模型预测结果(predictions)

根据你的描述,模型预测值为正时对应预测类别为1,否则为0。但如果是标准多分类任务,模型输出的logits(未激活的分数)更适合用np.argmax取分数最高的类别作为预测(即使所有分数为负,也能得到模型最倾向的类别):

# 方案1:按你要求的"正值为预测类别"提取索引
pred_labels = np.where(result.predictions > 0)[1]

# 方案2:更通用的多分类逻辑——取分数最高的类别(推荐)
pred_labels = np.argmax(result.predictions, axis=1)

步骤2:计算混淆矩阵

方法一:修改你原有的函数

适配转换后的一维类别索引,修改后的函数如下:

def compute_confusion_matrix(labels, true_onehot, pred_scores):
    # 转换为一维类别索引
    true_labels = np.argmax(true_onehot, axis=1)
    # 选择上面的方案1或方案2获取预测类别
    pred_labels = np.argmax(pred_scores, axis=1)  # 这里用推荐的方案2
    
    K = len(labels)
    conf_matrix = np.zeros((K, K), dtype=int)
    
    for t, p in zip(true_labels, pred_labels):
        conf_matrix[t][p] += 1
    
    return conf_matrix

# 使用示例:假设你的4个标签为['类别0', '类别1', '类别2', '类别3']
class_labels = ['类别0', '类别1', '类别2', '类别3']
conf_matrix = compute_confusion_matrix(class_labels, result.label_ids, result.predictions)

方法二:使用sklearn工具(更简洁)

直接调用sklearn.metrics.confusion_matrix,无需自己实现循环:

from sklearn.metrics import confusion_matrix

true_labels = np.argmax(result.label_ids, axis=1)
pred_labels = np.argmax(result.predictions, axis=1)

conf_matrix = confusion_matrix(true_labels, pred_labels)

混淆矩阵解读

得到的conf_matrix是一个4×4的矩阵,其中conf_matrix[i][j]表示真实类别为i,被预测为j的样本数量,可以直接用来分析每个标签的分类准确率、召回率等指标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:39:18