评估指标 #
什么是评估指标? #
评估指标用于衡量模型性能,与损失函数不同,它们不参与优化过程。
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