对机器学习中常用的评估指标进行总结。

在机器学习中,评估指标是不可缺少的一环,用于衡量模型的好坏,决定着对模型的改进方向和思路。

在使用评估指标之前首先得知道所要解决问题的类型,分类、回归等问题使用的评估指标是有区别的,评估指标影响着对于结果的判断,以及最终算法、模型的选择和改进。

0. 评估指标分类

根据问题类型对评估指标进行分类,主要分为两类:分类指标、回归指标

0.1 分类问题

  • 准确率(Accuracy)
  • 精准率(Precision)
  • 召回率(Recall)
  • PR曲线
  • F1值
  • ROC(Receiver Operating Characteristic curve)
  • AUC(Area under Curve)
  • 对数损失

首先对于分类问题,属性值是离散的,这些指标主要是定义在二分类问题上,多分类问题,通常是利用二分类问题的评估指标,比如视为多个二分类,对于多类标签,主要有两种计算方式:micro, macro,micro是直接计算所有标签的数据,macro是对每个标签进行计算,然后求平均,结合具体的二分类指标,有micro precision, macro precision, micro F1, macro F1等。

通过对比预测值和真实值,通过正负样本的角度,有四种情况:

  1. TP, True Positive
  2. TN, True Negtive
  3. FP, False Positive
  4. FN, False Negtive

混淆矩阵(Confusion Matrix):通过矩阵形式(方阵)列出各类标签数据的预测情况,列和行的长度都是标签类数量,分别对应各个标签,评估指标 - 图1位置元素表示的是实际上的第评估指标 - 图2类数据被分类为第评估指标 - 图3类数据的个数。对于两分类和多同类都适用,在二分类中,分别是TN, FP, FN, TP(因为0表示负样本,1表示正样本,默认情况0在1前面)。

  1. from sklearn.metrics import confusion_matrix
  2. confusion_matrix(y_true, y_pred)

另外还有分类报告,显示各类别个指标的值(precision, recall ,f1-score, support)


在keras中,metrics是一个带状态的类,常用方法是:update_state(), result(), reset_state(),使用update_state()时传入真实值和预测值,同时可以传入样本权重。

未清除状态时,就继续进行update_state()操作的话,将会将结果合并入之前的结果之中,如果要只算之后的结果,需要先清除状态(reset_state()

0.2 回归问题

  • 平均绝对误差(MAE)
  • 均方误差(MSE)
  • 均方根误差(RMSE)
  • 归一化均方根误差(NRMSE)
  • 决定系数 R2值

0.3 Keras API

Accuracy

  • Accuracy
  • BinaryAccuracy
  • CategoricalAccuracy
  • TopKCategoricalAccuracy
  • SparseTopKCategoricalAccuracy

Probabilistic

  • BinaryCrossentropy
  • CategoricalCrossentropy
  • SparseCategoricalCrossentropy
  • KLDivergence
  • Poisson

Regression

  • MeanSquaredError
  • RootMeanSquaredError
  • MeanAbsoluteError
  • MeanAbsolutePercentageError
  • MeanSquaredLogarithmicError
  • CosineSimilarity
  • LogCoshError

Classification

  • AUC
  • Precision
  • Recall
  • TruePositives
  • TrueNegatives
  • FalsePositives
  • FalseNegatives
  • PrecisionAtRecall
  • SensitivityAtSpecificity
  • SpecificityAtSensitivity

Image

  • MeanloU

Hinge

  • Hinge
  • SquaredHinge
  • CategoricalHinge

1. 准确率(Accuracy)

对于分类问题,最直接的判断标准就是准确率,预测值中与真实值相同的比例,针对的是所有样本。

评估指标 - 图4

  1. from sklearn.metrics import accuracy_score
  2. accuracy_score(y_true, y_pred, normalize=True)
  3. # normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数
  4. # tf
  5. m = keras.metrics.Accuracy()
  6. m.update_state(y_preds, y)
  7. m.result().numpy()

二分准确率

普通的准确率是判断预测值与真实值是否相同,二分准确率的却是通过判断预测值大于或小于某一阈值,确实是否为真或为假。

  1. # tf
  2. m = keras.metrics.BinaryAccuracy(threshold=0.5)
  3. m.update_state(y_preds, y)
  4. m.result().numpy()

类别准确率

在keras中分为:CategoricalAccuracy(),预测值需要是onehot形式。

  1. # tf
  2. m = keras.metrics.BinaryAccuracy(threshold=0.5)
  3. m.update_state(y_preds, y)
  4. m.result().numpy()

TopK类别准确率

计算真实值在topk预测值中的概率。

  1. # tf 真实值是onehot形式
  2. m = keras.metrics.TopkCategoricalAccuracy(k=5)
  3. m.update_state(y_preds, y)
  4. m.result().numpy()
  5. # tf 真实值是标量值
  6. m = keras.metrics.SparseTopKCategoricalAccuracy(k=5)
  7. m.update_state(y_preds, y)
  8. m.result().numpy()

2. 精确率(Precision)

也称查准率,预测对的正样本占所有预测正样本的比例,”宁放一千,不错一个“。

评估指标 - 图5

  1. from sklearn.metrics import precision_score
  2. precision_score(y_true, y_pred, labels=None, average='binary')
  3. # labels用于多分类,average也是,
  4. # binary, 二分类
  5. # micro, 多分类,计算全局的TP, FN, FP
  6. # macro, 多分类,计算每个标签的评价值,然后平均
  7. # samples, 多分类,计算每个样本的评估值,然后平均

3. 召回率(Recall)

也称查全率,也是TPR,正样本中召回的比例,”宁错一千,不漏一个“。

评估指标 - 图6

精确率和召回率主要针对预测的正样本。在不同问题中精确率和召回率的重要性不同,因为对于负样本,不同场景的问题对其敏感性不同,两者相互牵制,如在医疗诊断、推荐系统中,准确率更重要,而电话销售中召回率更重要一些。

  1. from sklearn.metrics import recall_score
  2. recall_score(y_true, y_pred, labels=None, average='binary')

4. PR曲线

为了衡量Precision和Recall的相互关系,建立了PR曲线,横轴是Precision,纵轴是Recall。

PR曲线下面积成为AP(Average Precision),表示的是召回率从0-1的平均精度值。

5. F1值

为了平衡精确率和召回率,构造了F1值,是两者的调和平均值:

评估指标 - 图7

  1. from sklearn.metrics import f1_score
  2. f1_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’)

另外还有Macro F1和Micro F1,用于多类别分类。

在多类别分类中,如果忽略类别区分,直接计算整体的F1值,称为Macro F1,而如果分别计算各类别的F1值,然后进行平均,称为Micro F1。

6. ROC

为二维曲线,横轴轴范围都是0-1,横轴是FPR(假阳性率,负样本中分错的比例),纵轴是TPR(真阳性率,正样本中分对的比例

评估指标 - 图8

曲线越往左上角移动表示效果越好

  1. from sklearn.metrics import roc_curve, auc
  2. fpr, tpr, thresholds = roc_curve(y_true, y_pred)
  3. roc_auc = auc(fpr, tpr)

7. AUC

因为ROC是曲线,观察不够具体,引入量化指标AUC,表示的是ROC曲线中曲线下方的面积,AUC越好,ROC曲线越靠近左上方,也就是分类效果越好。AUC值介于0-1

具体意义:正样本预测结果大于负样本预测结果的概率

ROC曲线和AUC的一大优势是,利用的是FPR、TPR,计算不涉及正、负样本的比例,可处理不平衡样本

  1. # 通过FPR,TPR计算AUC
  2. from sklearn.metrics import auc
  3. auc(fpr, tpr)
  4. # 直接根据样本计算AUC,更常用
  5. from sklearn.metrics import roc_auc_score
  6. roc_auc_score(y_ture, y_pred)

8. 对数损失

  1. from sklearn.metrics import log_loss
  2. log_loss(y_true, y_pred)

不常用

9. 平均绝对误差(MAE)

评估指标 - 图9

  1. from sklearn.metrics import mean_absolute_error
  2. mean_absolute_error(y_true, y_pred, multioutput='uniform_average')

10. 均方误差(MSE)

L2范数损失,简洁、常用:

评估指标 - 图10%5E2%0A#card=math&code=MSE%20%3D%20%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5En%28y_i%20-%20%5Chat%20y_i%29%5E2%0A)

  1. from sklearn.metrics import mean_squared_error
  2. mean_squared_error(y_true, y_pred, multioutput='uniform_average')
  3. # multioutput 用于多分类,如下取值
  4. # 'raw_values' 返回各类别的误差数据
  5. # 'uniform_average' 平均权重下的均值误差

11. 均方根误差(RMSE)

评估指标 - 图11%5E2%7D%0A#card=math&code=RMSE%20%3D%20%5Csqrt%7B%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5En%28y_i%20-%20%5Chat%20y_i%29%5E2%7D%0A)

只是MSE加个根号,和MSE一样,比离群值(异常值)敏感

  1. from sklearn.metrics import mean_squared_error
  2. np.sqrt(mean_squared_error(y_true, y_pred, multioutput='uniform_average'))

12. 归一化均方根误差(NRMSE)

评估指标 - 图12

  1. from sklearn.metrics import mean_squared_error
  2. mean_squared_error(y_true, y_pred, multioutput='uniform_average') / (np.max(y_true) - np.min(y_pred))

13. 决策系数(R2)

评估指标 - 图13%5E2%7D%7B%5Csum_i(y_i%20-%20%5Cbar%20y)%5E2%7D%0A#card=math&code=R%5E2%20%3D%201%20%3D%20%5Cfrac%7B%5Csum_i%28y_i%20-%20%5Chat%20y_i%29%5E2%7D%7B%5Csum_i%28y_i%20-%20%5Cbar%20y%29%5E2%7D%0A)

coefficient of determination。统计学指标,反应多元回归中回归平方和占总平方和的比例,是衡量拟合程度的一个统计量,反应的是因变量的变差中被回归方程解释的部分。越接近1表明,表明回归平方和占总平方和的比例越大,回归线与各观测点越接近,用x的变化来解释y值变差的部分就越多,回归的拟合程度就越好。即表示y的变化中能被x解释的比例

  1. from sklearn.metrics import r2_score
  2. r2_score(y_true, y_pred, multioutput='uniform_average')