对机器学习中常用的评估指标进行总结。
在机器学习中,评估指标是不可缺少的一环,用于衡量模型的好坏,决定着对模型的改进方向和思路。
在使用评估指标之前首先得知道所要解决问题的类型,分类、回归等问题使用的评估指标是有区别的,评估指标影响着对于结果的判断,以及最终算法、模型的选择和改进。
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等。
通过对比预测值和真实值,通过正负样本的角度,有四种情况:
- TP, True Positive
- TN, True Negtive
- FP, False Positive
- FN, False Negtive
混淆矩阵(Confusion Matrix):通过矩阵形式(方阵)列出各类标签数据的预测情况,列和行的长度都是标签类数量,分别对应各个标签,位置元素表示的是实际上的第
类数据被分类为第
类数据的个数。对于两分类和多同类都适用,在二分类中,分别是TN, FP, FN, TP(因为0表示负样本,1表示正样本,默认情况0在1前面)。
from sklearn.metrics import confusion_matrix
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)
对于分类问题,最直接的判断标准就是准确率,预测值中与真实值相同的比例,针对的是所有样本。
from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred, normalize=True)
# normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数
# tf
m = keras.metrics.Accuracy()
m.update_state(y_preds, y)
m.result().numpy()
二分准确率
普通的准确率是判断预测值与真实值是否相同,二分准确率的却是通过判断预测值大于或小于某一阈值,确实是否为真或为假。
# tf
m = keras.metrics.BinaryAccuracy(threshold=0.5)
m.update_state(y_preds, y)
m.result().numpy()
类别准确率
在keras中分为:CategoricalAccuracy()
,预测值需要是onehot形式。
# tf
m = keras.metrics.BinaryAccuracy(threshold=0.5)
m.update_state(y_preds, y)
m.result().numpy()
TopK类别准确率
计算真实值在topk预测值中的概率。
# tf 真实值是onehot形式
m = keras.metrics.TopkCategoricalAccuracy(k=5)
m.update_state(y_preds, y)
m.result().numpy()
# tf 真实值是标量值
m = keras.metrics.SparseTopKCategoricalAccuracy(k=5)
m.update_state(y_preds, y)
m.result().numpy()
2. 精确率(Precision)
也称查准率,预测对的正样本占所有预测正样本的比例,”宁放一千,不错一个“。
from sklearn.metrics import precision_score
precision_score(y_true, y_pred, labels=None, average='binary')
# labels用于多分类,average也是,
# binary, 二分类
# micro, 多分类,计算全局的TP, FN, FP
# macro, 多分类,计算每个标签的评价值,然后平均
# samples, 多分类,计算每个样本的评估值,然后平均
3. 召回率(Recall)
也称查全率,也是TPR,正样本中召回的比例,”宁错一千,不漏一个“。
精确率和召回率主要针对预测的正样本。在不同问题中精确率和召回率的重要性不同,因为对于负样本,不同场景的问题对其敏感性不同,两者相互牵制,如在医疗诊断、推荐系统中,准确率更重要,而电话销售中召回率更重要一些。
from sklearn.metrics import recall_score
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值,是两者的调和平均值:
from sklearn.metrics import f1_score
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(真阳性率,正样本中分对的比例)
曲线越往左上角移动表示效果越好
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_true, y_pred)
roc_auc = auc(fpr, tpr)
7. AUC
因为ROC是曲线,观察不够具体,引入量化指标AUC,表示的是ROC曲线中曲线下方的面积,AUC越好,ROC曲线越靠近左上方,也就是分类效果越好。AUC值介于0-1
具体意义:正样本预测结果大于负样本预测结果的概率
ROC曲线和AUC的一大优势是,利用的是FPR、TPR,计算不涉及正、负样本的比例,可处理不平衡样本。
# 通过FPR,TPR计算AUC
from sklearn.metrics import auc
auc(fpr, tpr)
# 直接根据样本计算AUC,更常用
from sklearn.metrics import roc_auc_score
roc_auc_score(y_ture, y_pred)
8. 对数损失
from sklearn.metrics import log_loss
log_loss(y_true, y_pred)
不常用
9. 平均绝对误差(MAE)
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_true, y_pred, multioutput='uniform_average')
10. 均方误差(MSE)
L2范数损失,简洁、常用:
%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)
from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred, multioutput='uniform_average')
# multioutput 用于多分类,如下取值
# 'raw_values' 返回各类别的误差数据
# 'uniform_average' 平均权重下的均值误差
11. 均方根误差(RMSE)
%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一样,比离群值(异常值)敏感
from sklearn.metrics import mean_squared_error
np.sqrt(mean_squared_error(y_true, y_pred, multioutput='uniform_average'))
12. 归一化均方根误差(NRMSE)
from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred, multioutput='uniform_average') / (np.max(y_true) - np.min(y_pred))
13. 决策系数(R2)
%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解释的比例
from sklearn.metrics import r2_score
r2_score(y_true, y_pred, multioutput='uniform_average')