评估指标 #

什么是评估指标? #

评估指标用于衡量模型性能,与损失函数不同,它们不参与优化过程。

text
┌─────────────────────────────────────────────────────────────┐
│                    评估指标 vs 损失函数                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  损失函数:                                                  │
│  ├── 用于优化                                              │
│  ├── 必须可微分                                            │
│  └── 例: CrossEntropy, MSE                                 │
│                                                             │
│  评估指标:                                                  │
│  ├── 用于监控                                              │
│  ├── 不需要可微分                                          │
│  └── 例: Accuracy, Precision, Recall                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Accuracy(准确率) #

基本用法 #

python
import keras

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

不同类型的准确率 #

python
import keras

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        'accuracy',
        keras.metrics.BinaryAccuracy(threshold=0.5)
    ]
)

model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=[
        'accuracy',
        keras.metrics.CategoricalAccuracy(),
        keras.metrics.TopKCategoricalAccuracy(k=5)
    ]
)

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=[
        'accuracy',
        keras.metrics.SparseCategoricalAccuracy(),
        keras.metrics.SparseTopKCategoricalAccuracy(k=5)
    ]
)

Precision(精确率) #

text
┌─────────────────────────────────────────────────────────────┐
│                    精确率                                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Precision = TP / (TP + FP)                                 │
│                                                             │
│  含义: 预测为正例中真正为正例的比例                         │
│                                                             │
│  例: 垃圾邮件分类                                           │
│  预测为垃圾邮件的邮件中,真正是垃圾邮件的比例               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
python
import keras

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        keras.metrics.Precision(thresholds=0.5)
    ]
)

Recall(召回率) #

text
┌─────────────────────────────────────────────────────────────┐
│                    召回率                                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Recall = TP / (TP + FN)                                    │
│                                                             │
│  含义: 真正为正例中被正确预测的比例                         │
│                                                             │
│  例: 疾病诊断                                               │
│  真正患病的人中,被正确诊断的比例                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘
python
import keras

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        keras.metrics.Recall(thresholds=0.5)
    ]
)

AUC(ROC 曲线下面积) #

python
import keras

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        keras.metrics.AUC(
            num_thresholds=200,
            curve='ROC',
            summation_method='interpolation'
        )
    ]
)

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        keras.metrics.AUC(curve='PR')
    ]
)

F1Score #

python
import keras

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        keras.metrics.F1Score(threshold=0.5)
    ]
)

MeanIoU(平均交并比) #

python
import keras

model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=[
        keras.metrics.MeanIoU(num_classes=10)
    ]
)

MeanAbsoluteError #

python
import keras

model.compile(
    optimizer='adam',
    loss='mse',
    metrics=[
        keras.metrics.MeanAbsoluteError(),
        keras.metrics.RootMeanSquaredError()
    ]
)

MeanSquaredError #

python
import keras

model.compile(
    optimizer='adam',
    loss='mae',
    metrics=[
        keras.metrics.MeanSquaredError(),
        keras.metrics.RootMeanSquaredError()
    ]
)

R-Square(R² 决定系数) #

python
import keras

model.compile(
    optimizer='adam',
    loss='mse',
    metrics=[
        keras.metrics.RSquare()
    ]
)

自定义指标 #

函数方式 #

python
import keras
import keras.ops as ops

def f1_score(y_true, y_pred):
    y_pred = ops.round(y_pred)
    tp = ops.sum(y_true * y_pred)
    fp = ops.sum((1 - y_true) * y_pred)
    fn = ops.sum(y_true * (1 - y_pred))
    
    precision = tp / (tp + fp + 1e-7)
    recall = tp / (tp + fn + 1e-7)
    
    return 2 * precision * recall / (precision + recall + 1e-7)

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[f1_score]
)

类方式 #

python
import keras

class F1Score(keras.metrics.Metric):
    def __init__(self, name='f1_score', **kwargs):
        super().__init__(name=name, **kwargs)
        self.true_positives = self.add_weight(name='tp', initializer='zeros')
        self.false_positives = self.add_weight(name='fp', initializer='zeros')
        self.false_negatives = self.add_weight(name='fn', initializer='zeros')
    
    def update_state(self, y_true, y_pred, sample_weight=None):
        y_pred = keras.ops.round(y_pred)
        y_true = keras.ops.cast(y_true, 'float32')
        y_pred = keras.ops.cast(y_pred, 'float32')
        
        tp = keras.ops.sum(y_true * y_pred)
        fp = keras.ops.sum((1 - y_true) * y_pred)
        fn = keras.ops.sum(y_true * (1 - y_pred))
        
        self.true_positives.assign_add(tp)
        self.false_positives.assign_add(fp)
        self.false_negatives.assign_add(fn)
    
    def result(self):
        precision = self.true_positives / (self.true_positives + self.false_positives + 1e-7)
        recall = self.true_positives / (self.true_positives + self.false_negatives + 1e-7)
        return 2 * precision * recall / (precision + recall + 1e-7)
    
    def reset_state(self):
        self.true_positives.assign(0)
        self.false_positives.assign(0)
        self.false_negatives.assign(0)

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[F1Score()]
)

多指标监控 #

python
import keras

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=[
        'accuracy',
        keras.metrics.Precision(name='precision'),
        keras.metrics.Recall(name='recall'),
        keras.metrics.AUC(name='auc'),
        keras.metrics.AUC(name='prc', curve='PR')
    ]
)

指标选择指南 #

text
┌─────────────────────────────────────────────────────────────┐
│                    指标选择建议                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  分类问题:                                                  │
│  ├── 平衡数据: Accuracy                                    │
│  ├── 不平衡数据: Precision, Recall, F1, AUC               │
│  ├── 多分类: CategoricalAccuracy, Top-K                    │
│  └── 分割任务: MeanIoU                                     │
│                                                             │
│  回归问题:                                                  │
│  ├── 一般情况: MAE, RMSE                                   │
│  ├── 相对误差: MAPE                                        │
│  └── 模型解释: R²                                          │
│                                                             │
│  注意事项:                                                  │
│  ├── 多个指标可能冲突                                      │
│  ├── 根据业务目标选择                                      │
│  └── 验证集上监控                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下一步 #

现在你已经掌握了评估指标,接下来学习 自定义模型,创建更灵活的网络架构!

最后更新:2026-04-04