模型评估指标

评估指标用于反映模型效果。在预测问题中,要评估模型的效果,就需要将模型预测结果f(X)和真实标注Y进行比较,评估指标定义为f(X)和Y的函数。

score = metric(f(X),Y)
模型的好坏是相对的,在对比不同的模型效果时,使用不同评估指标往往会导致不同的结论。
通常,线下使用的是机器学习评估指标,线上使用的是业务指标。如果线下指标和线上指标不同,则可能会出现线下指标变好而线上指标变差的现象,所以我们需要找到和线上业务指标一致的线下指标,尽可能使线下指标的变化趋势跟线上指标一致。没有一个跟线上一致的线下指标,意味着线下指标没有参考价值,想判断此次试验是否有效,只能上线试验。而上线试验成本远高于离线试验成本,通常需要在线试验较长时间并对效果进行可信度检验(如t-test)之后才能得出结论,这必然会导致模型迭代进度变慢。
评估指标根据任务类型分类,可分为分类指标、回归指标、聚类指标和排序指标等。

  1. 分类指标
    常用分类指标有精确率、召回率、F1、AUC与对数损失(Logistic Loss,logloss)
    精确率和召回率多用于二分类问题,需要结合混淆矩阵介绍,如下所示:
    image.png

    其中,TP(真正,True Positive)表示真实结果为正例,预测结果也为正例;FP(假正,False Positive)表示真实结果为负例,预测结果却是正例;TN(真负,True Negative)表示真实结果为负例,预测结果是负例;FN(假负,False Negative)表示真实结果为正例,预测结果是负例。
    显然,TP+FP+FN+TN=样本总数。

根据混淆矩阵可以引出如下指标定义:

准确率(Acc):所有的样本中预测正确的比例,计算公式如下:

image.png

召回率(Recall)也称查全率、敏感度(Sensitive):所有正样本中预测正确的比例,即正样本的准确率,计算公式如下:
image.png

特异性(Specificity):所有负样本中预测正确的比例,即负样本的准确率,计算公式如下:
image.png

精确率(Precision)也称查准率:所有预测为正样本的集合中预测正确的比例,计算公式如下:
image.png

F1 Score:综合精确率和召回率指标,计算公式如下:

image.png

通过F1的计算公式我们可以看出,F1值是介于Precision和Recall之间的。Precision一定情况下反映了模型控制假阳FP个数的能力,Recall值反映了正样本的检出率,F1值综合了两方面。
下面来介绍分类模型特别是二分类模型最重要的评估指标:
ROC与AUC
ROC的全称是“接收者操作特征”(Receiver Operating Characteristic)曲线,是在二战中被发明用于信号检测的,之后很快被引入心理学领域,再后来被引入机器学习领域,用来评估分类、检测结果的指标,如下是一个ROC曲线的图例:

image.png

AUC(Area Under Curve)就是上述ROC曲线下的面积,那么如何计算AUC了,有很多种计算方法,其中绘制ROC曲线是比较通用的方法,首选确定下ROC曲线图的横坐标和纵坐标含义:
横坐标(FPR,即假正率)=1-Specificity=FP/(FP+TN)
纵坐标(TPR,即真正率)=TP/(FP+FN)

但是ROC曲线是由很多个点(FPR,TPR)绘制的曲线,这些点如何计算?
首先对所有样本按预测概率排序,再以每条样本的预测概率值作为判断其他所有样本是正例还是反例的阈值,计算对应的FPR和TPR,然后用线段连接即可。当数据量少时,绘制的ROC曲线不平滑;当数据量大时,绘制的ROC曲线会趋于平滑。
从AUC判断分类器(预测模型)优劣的标准

· AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。

· 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值(比如0.5)的话,能有预测价值。

· AUC = 0.5,跟随机猜测一样(例如:抛硬币猜正反面),模型没有预测价值。

· AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

三种AUC值示例:

总结:AUC取值越大说明模型越可能将正样本排在负样本前面,另外AUC还有一些统计特性:AUC等于随机挑选一个正样本和负样本时,模型将正样本排前面的概率;AUC和Wilcoxon Test of Ranks等价;AUC还和基尼(Gini)系数有联系,满足等式Gini + 1 = 2 * AUC。
所以AUC是评估二分类模型效果最重要的指标。

对数损失(LogLoss)
若有n个样本,对于第i个样本,它的真实label为yi为{0,1},预测概率为yi’为{0,1},那么LogLoss计算公式如下:

image.png

LogLoss衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。与AUC不同,LogLoss对预测概率敏感,
经常作为模型的损失函数来做优化,可是,当训练数据正负样本不平衡时,比如我们经常会遇到正样本很少,负样本很多的情况,我们更希望在控制假正例的情况下检出更多的正样本,若不做任何处理,则降低LogLoss会倾向于偏向负样本一方,此时LogLoss很低,可正样本的检出效果却不理想,反映在模型的效果上就是LogLoss很低,但是模型实际线上效果很差。
参考知乎网上的一个例子:假设有100个样本,其中只有一个正样本,如果模型无脑将所有样本都预测为负样本,如下代码:

from sklearn.metrics import f1_score, roc_auc_score, log_loss

y_true = 99 * [0] + [1]
y_pred = 100 * [0]
print('ROC:', roc_auc_score(y_true, y_pred))
print('LogLoss:', log_loss(y_true, y_pred))

上述代码输出如下:
ROC:0.5
LogLoss:0.34538776394910786
我们可以看到,虽然我们的LogLoss值还不错,但是AUC和随机瞎猜的效果没什么区别。

的情况下检出更多的正样本,若不做任何处理,则降低LogLoss会倾向于偏向负样本一方,此时LogLoss很低,可正样本的检出效果却并不理想。
因为sklearn中的log_loss函数不支持单一类别的计算,比如有时候我就想看看正样本的,然后就报错,所以知乎网友自己写了个log_loss计算函数,代码如下:

import math

def log_loss_custom(y_true, y_pred):
    '''
    y_true: 真实类别的index列表
    y_pred:二维数组,每个样本的预测概率列表
    '''
    summ = 0.0
    for i in range(len(y_true)):
        summ -= math.log(max(y_pred[i][y_true[i]], 1e-15))
    return summ / len(y_true)

y_true = 10 * [1]
y_pred = 10 * [[0.1, 0.9]]
print('LogLoss:', log_loss_custom(y_true, y_pred))

上述代码的输出如下:
LogLoss: 0.10536051565782631
这个预测效果明显很差的模型,竟然LogLoss值很低。

  1. 回归指标
    平均绝对误差(Mean Absolute Error,MAE):也叫L1范数损失(L1-norm Loss),其公式为:
    mae.png

    其中,N为样本数,yi为第i条样本的真实值,pi为第i条样本的预测值。MAE是绝对误差的平均值,因为预测误差有正有负,绝对值可以避免正负抵消。MAE能很好地刻画预测值与真实值的偏差。模型使用MAE作为损失函数则是对数据分布的中值进行拟合。某些模型(如XGBoost)必须要求损失函数有二阶导数,所以不能直接优化MAE。
    平均绝对百分误差(Mean Absolute Percentage Error,MAPE):公式如下:
    mape.png

MAPE通过计算绝对误差百分比来表示预测效果,其取值越小越好。如果MAPE=10,这表示预测平均偏离真实值10%。MAPE计算与量纲无关,因此在特定场景下不同问题具有一定可比性。MAPE的缺点也比较明显,在yi=0处无定义,并且如果yi接近0可能导致MAPE大于100%。而且,MAPE对负值误差的惩罚大于正值误差。基于这些缺点也有一些改进的平均指标,如MASE,sMAPE、MDA。

均方根误差(Root Mean Squared Error, RMSE):公式如下:

rmse.png

RMSE代表的是预测值与真实值差值的样本标准差。和MAE相比,RMSE对大误差样本有更大的惩罚;但它对离群点敏感,其健壮性不如MAE。模型使用RMSE作为损失函数则是对数据分布的平均值进行拟合。
基于均方根误差也有一个常用的变种评估指标叫均方根对数误差(Root Mean Squared Logarithmic Error,RMSLE),其公式为:


rmsle.png

RMSLE对预测值偏小的样本比对预测值偏大的样本惩罚更大,比如一个酒店消费均价是200元,预测成150元的惩罚会比预测成250元的大。如果评估指标选用RMSLE,没办法直接优化RMSLE但是能直接优化RMSE的模型,通常会先对预测目标进行对数变换ynew=log(y+1),最后预测值再还原p=exppnew-1。

参考资料:

1.https://www.plob.org/article/12476.html
2.https://zhuanlan.zhihu.com/p/87260891

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343