3.6 评估指标 (Metrics) 3.6 评估指标 (Metrics) 在机器学习模型的训练和评估过程中,评估指标 (Metrics) 用于衡量模型在特定任务上的表现。它们提供了一种量化模型性能的方式,帮助我们了解模型的优缺点,并进行模型选择和优化。TensorFlow Keras 提供了丰富的内置评估指标,同时也允许用户自定义评估指标。 3.6.1 Keras 内置评估指标 Keras 提供了许多常用的评估指标,涵盖了分类、回归和分割等多种任务。以下是一些常见的 Keras 内置评估指标: 分类指标: : 准确率,衡量模型正确分类的样本比例。 : 二元准确率,用于二分类任务。 : 类别准确率,用于多分类任务,要求标签是 one-hot 编码。
在机器学习模型的训练和评估过程中,评估指标 (Metrics) 用于衡量模型在特定任务上的表现。它们提供了一种量化模型性能的方式,帮助我们了解模型的优缺点,并进行模型选择和优化。TensorFlow Keras 提供了丰富的内置评估指标,同时也允许用户自定义评估指标。
Keras 提供了许多常用的评估指标,涵盖了分类、回归和分割等多种任务。以下是一些常见的 Keras 内置评估指标:
分类指标:
Accuracy: 准确率,衡量模型正确分类的样本比例。
BinaryAccuracy: 二元准确率,用于二分类任务。
CategoricalAccuracy: 类别准确率,用于多分类任务,要求标签是 one-hot 编码。
SparseCategoricalAccuracy: 稀疏类别准确率,用于多分类任务,要求标签是整数编码。
TopKCategoricalAccuracy: Top-K 类别准确率,衡量模型预测的前 K 个类别中包含正确类别的比例。
BinaryCrossentropy: 二元交叉熵,用于二分类任务,衡量模型预测概率与真实标签之间的差异。
CategoricalCrossentropy: 类别交叉熵,用于多分类任务,衡量模型预测概率分布与真实标签之间的差异。
SparseCategoricalCrossentropy: 稀疏类别交叉熵,用于多分类任务,衡量模型预测概率分布与真实标签之间的差异。
AUC: 曲线下面积,用于二分类任务,衡量模型区分正负样本的能力。
Precision: 精确率,衡量模型预测为正的样本中,真正为正的样本比例。
Recall: 召回率,衡量所有真正为正的样本中,被模型正确预测为正的样本比例。
F1Score: F1 分数,精确率和召回率的调和平均值。
回归指标:
MeanAbsoluteError: 平均绝对误差,衡量模型预测值与真实值之间的平均绝对差异。
MeanSquaredError: 均方误差,衡量模型预测值与真实值之间的平均平方差异。
RootMeanSquaredError: 均方根误差,均方误差的平方根。
MeanAbsolutePercentageError: 平均绝对百分比误差,衡量模型预测值与真实值之间的平均绝对百分比差异。
CosineSimilarity: 余弦相似度,衡量模型预测值与真实值之间的方向相似度。
示例代码:
import tensorflow as tf from tensorflow.keras.metrics import Accuracy, BinaryAccuracy, MeanSquaredError # 创建评估指标对象 accuracy = Accuracy() binary_accuracy = BinaryAccuracy() mse = MeanSquaredError() # 模拟模型预测和真实标签 y_true = tf.constant([1, 0, 1, 1]) y_pred = tf.constant([0, 0, 1, 1]) # 0和1 y_pred_proba = tf.constant([0.9, 0.2, 0.6, 0.8]) # 概率值 # 更新评估指标的状态 accuracy.update_state(y_true, y_pred) binary_accuracy.update_state(y_true, y_pred_proba) # 二元准确率需要概率值 mse.update_state(y_true, y_pred) # 获取评估指标的结果 print("Accuracy:", accuracy.result().numpy()) print("Binary Accuracy:", binary_accuracy.result().numpy()) print("Mean Squared Error:", mse.result().numpy()) # 重置评估指标的状态 accuracy.reset_state() binary_accuracy.reset_state() mse.reset_state()
在 Keras 模型中,可以通过 model.compile() 方法指定评估指标。
model = tf.keras.Sequential([ tf.keras.layers.Dense(10, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(1) ]) model.compile(optimizer='adam', loss='mse', metrics=['mae', 'mse']) # 指定评估指标
在训练过程中,Keras 会自动计算并显示指定的评估指标。
# 假设有训练数据 x_train, y_train model.fit(x_train, y_train, epochs=10)
在评估模型时,可以使用 model.evaluate() 方法。
# 假设有测试数据 x_test, y_test loss, mae, mse = model.evaluate(x_test, y_test, verbose=0) print("Mean Absolute Error:", mae) print("Mean Squared Error:", mse)
如果 Keras 内置的评估指标不能满足需求,可以自定义评估指标。自定义评估指标需要继承 tf.keras.metrics.Metric 类,并实现以下方法:
__init__(self, name='my_metric', **kwargs): 构造函数,用于初始化评估指标的状态变量。
update_state(self, y_true, y_pred, sample_weight=None): 更新状态变量,根据模型预测和真实标签计算中间结果。
result(self): 计算并返回最终的评估指标值。
reset_state(self): 重置状态变量,以便在新的数据上重新计算评估指标。
示例代码:
import tensorflow as tf class MyMeanAbsoluteError(tf.keras.metrics.Metric): def __init__(self, name='my_mae', **kwargs): super(MyMeanAbsoluteError, self).__init__(name=name, **kwargs) self.total = self.add_weight(name='total', initializer='zeros') self.count = self.add_weight(name='count', initializer='zeros') def update_state(self, y_true, y_pred, sample_weight=None): values = tf.abs(y_true - y_pred) if sample_weight is not None: sample_weight = tf.cast(sample_weight, self.dtype) values = tf.multiply(values, sample_weight) self.total.assign_add(tf.reduce_sum(values)) self.count.assign_add(tf.cast(tf.size(y_true), self.dtype)) def result(self): return self.total / self.count def reset_state(self): self.total.assign(0.) self.count.assign(0.)
# 使用自定义评估指标 model = tf.keras.Sequential([ tf.keras.layers.Dense(10, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(1) ]) model.compile(optimizer='adam', loss='mse', metrics=[MyMeanAbsoluteError()]) # 使用自定义评估指标 # 假设有训练数据 x_train, y_train model.fit(x_train, y_train, epochs=10) # 假设有测试数据 x_test, y_test loss, my_mae = model.evaluate(x_test, y_test, verbose=0) print("My Mean Absolute Error:", my_mae)
除了继承 tf.keras.metrics.Metric 类,还可以使用函数作为评估指标。函数需要接受 y_true 和 y_pred 作为输入,并返回一个标量值作为评估指标的结果。
示例代码:
import tensorflow as tf def my_mean_absolute_error(y_true, y_pred): return tf.reduce_mean(tf.abs(y_true - y_pred)) # 使用函数作为评估指标 model = tf.keras.Sequential([ tf.keras.layers.Dense(10, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(1) ]) model.compile(optimizer='adam', loss='mse', metrics=[my_mean_absolute_error]) # 使用函数作为评估指标 # 假设有训练数据 x_train, y_train model.fit(x_train, y_train, epochs=10) # 假设有测试数据 x_test, y_test loss, my_mae = model.evaluate(x_test, y_test, verbose=0) print("My Mean Absolute Error:", my_mae)
评估指标的选择取决于具体的任务和目标。
对于分类任务,常用的评估指标包括准确率、精确率、召回率、F1 分数和 AUC。
对于回归任务,常用的评估指标包括平均绝对误差、均方误差和均方根误差。
如果需要衡量模型预测值与真实值之间的方向相似度,可以使用余弦相似度。
在选择评估指标时,还需要考虑数据的特点。例如,如果数据集中存在类别不平衡问题,准确率可能不是一个好的评估指标,可以考虑使用精确率、召回率或 F1 分数。
评估指标是机器学习模型开发过程中不可或缺的一部分。通过使用 Keras 内置的评估指标或自定义评估指标,可以量化模型的性能,并进行模型选择和优化。选择合适的评估指标对于获得高质量的模型至关重要。
sample_weight: 在 update_state 方法中,sample_weight 参数用于指定每个样本的权重。可以根据样本的重要性或置信度来设置权重。
状态变量: 评估指标的状态变量用于存储中间结果,例如总误差和样本数量。状态变量必须是 tf.Variable 对象,并且需要通过 self.add_weight 方法添加到评估指标中。
dtype: 在自定义评估指标时,需要指定状态变量的数据类型。可以使用 self.dtype 属性获取默认的数据类型。
希望这篇文章能够帮助你更好地理解和使用 TensorFlow Keras 中的评估指标。