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

如何在TensorFlow Estimator中获取各类别的准确率

获取Premade Estimator中每个类别的准确率

嘿,我来帮你搞定这个问题——默认的classifier.evaluate()只会返回整体的准确率,要拿到每个类别的准确率,其实有两种实用的路径,我给你一步步拆解:

方法一:通过预测结果+混淆矩阵计算

这种方法很直观,先拿到所有测试样本的真实标签和模型的预测标签,再用混淆矩阵计算每个类别的准确率(每个类别的准确率=该类别正确预测数/该类别总样本数)。

步骤1:收集真实标签与预测标签

先准备好你的测试集输入函数,然后遍历模型的预测结果,同时收集真实标签:

# 假设你已经定义好了测试集输入函数test_input_fn
predictions = classifier.predict(input_fn=test_input_fn)

# 初始化列表存储真实标签和预测标签
true_labels = []
predicted_labels = []

# 这里的test_data需要是你的测试数据集(包含真实标签字段,比如label)
for pred, sample in zip(predictions, test_data):
    true_labels.append(sample['label'])
    # 从预测结果中取出类别ID
    predicted_labels.append(pred['class_ids'][0])

步骤2:计算混淆矩阵与类别准确率

借助sklearn的混淆矩阵工具,快速计算每个类别的准确率:

from sklearn.metrics import confusion_matrix
import numpy as np

# 生成混淆矩阵:行是真实类别,列是预测类别
confusion_mat = confusion_matrix(true_labels, predicted_labels)

# 计算每个类别的准确率:对角线是正确数,行求和是该类别总样本数
class_accuracies = np.diag(confusion_mat) / confusion_mat.sum(axis=1)

# 输出结果就是你想要的数组形式
print(class_accuracies)
# 示例输出:[0.924012, 0.89478, 0.945123, 0.685042]

方法二:自定义评估指标集成到Estimator

如果你想让classifier.evaluate()直接返回每个类别的准确率,可以自定义评估指标函数,把它集成到Estimator的配置里:

步骤1:定义自定义评估函数

这个函数会针对每个类别计算准确率,处理好除以0的边界情况:

import tensorflow as tf

def class_wise_accuracy_metrics(labels, predictions):
    # 替换成你的类别总数,比如这里是4类
    num_classes = 4
    metric_dict = {}
    
    for class_idx in range(num_classes):
        # 标记该类别下的真实样本和正确预测的样本
        is_true_class = tf.cast(tf.equal(labels, class_idx), tf.float32)
        is_correct_pred = tf.cast(
            tf.logical_and(tf.equal(labels, class_idx), 
                          tf.equal(predictions['class_ids'], class_idx)),
            tf.float32
        )
        
        # 计算该类别的准确率,避免除以0
        class_accuracy = tf.divide(
            tf.reduce_sum(is_correct_pred),
            tf.reduce_sum(is_true_class) + 1e-8,  # 加小值防止除以0
            name=f'class_{class_idx}_accuracy'
        )
        
        metric_dict[f'class_{class_idx}_accuracy'] = class_accuracy
    
    return metric_dict

步骤2:创建Estimator时添加自定义指标

在初始化DNNClassifier(或其他Premade Estimator)时,把自定义指标传入eval_metric_ops参数:

classifier = tf.estimator.DNNClassifier(
    feature_columns=your_feature_columns,  # 替换成你的特征列
    hidden_units=[1024, 512, 256],  # 替换成你的网络结构
    n_classes=4,  # 替换成你的类别总数
    model_dir='./your_model_dir',  # 替换成你的模型保存路径
    eval_metric_ops=class_wise_accuracy_metrics  # 加入自定义评估指标
)

步骤3:执行评估并获取结果

现在调用evaluate()后,返回的结果字典里就会包含每个类别的准确率:

eval_result = classifier.evaluate(input_fn=test_input_fn)

# 提取每个类别的准确率组成数组
class_accuracies = [eval_result[f'class_{i}_accuracy'] for i in range(4)]
print(class_accuracies)

两种方法各有优势:方法一适合快速验证,不需要修改Estimator的初始化;方法二更贴合TensorFlow的Estimator流程,适合正式的训练评估流水线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:15:02