机器学习评价指标+python计算代码

机器学习评价指标


accuracy,precision,recall,F1-score
ROC曲线下面积:ROC-AUC(area under curve)
PR曲线下面积:PR-AUC


1.accuracy,precision,recall

accuracy

ACC:classification accuracy,描述分类器的分类准确率

ACC=(TP+TN)/(TP+FP+FN+TN)

准确率,二分类问题,98个1,2个0,预测全都是1,accuracy也是98%,但没意义。

image

精确率precision

“预测为正例的那些数据里预测正确的数据个数”。

precision= TP  / ( TP + FP )

召回率recall

“真实为正例的那些数据里预测正确的数据个数”。

recall = TP / ( TP + FN ) = TPR (TP rate)

2.F1,F-beta

F1-score ——综合考虑precision和recall的metric

F1=2*P*R/(P+R)

F-beta


image

宏平均和微平均

为了综合多个类别的分类情况,评测系统整体性能,经常采用的还有微平均F1(micro-averaging)和宏平均F1(macro-averaging )两种指标。宏平均F1与微平均F1是以两种不同的平均方式求的全局的F1指标。其中宏平均F1的计算方法先对每个类别单独计算F1值,再取这些F1值的算术平均值作为全局指标。而微平均F1的计算方法是先累加计算各个类别的a、b、c、d的值,再由这些值求出F1值。由两种平均F1的计算方式不难看出,宏平均F1平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均F1平等考虑文档集中的每一个文档,所以它的值受到常见类别的影响比较大。

3.AUC

其中TPR即为敏感度(sensitivity),TNR即为特异度(specificity)。

TPR:true positive rate,描述识别出的正例占所有正例的比例
计算公式为:TPR = TP / (TP+ FN)

TNR:true negative rate,描述识别出的负例占所有负例的比例
计算公式为:TNR = TN / (TN + FP)

TPR = recall = TP / (TP + FN)
TNR          = TN / (TN + FP)  =  1 - FPR

维基百科:


AUC 理解与计算

AUC 的全称是 AreaUnderRoc 即 Roc 曲线与坐标轴形成的面积,取值范围 [0, 1].

Roc (Receiver operating characteristic) 曲线是一种二元分类模型分类效果的分析工具。
Roc 空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。

//TPR: 在所有实际为阳性的样本中,被正确地判断为阳性之比率 
TPR = TP/P = TP/(TP+FN)
//FPR: 在所有实际为阴性的样本中,被错误地判定为阳性之比率
FPR = FP/N = FP/(FP + TN)

AUC 最普遍的定义是 ROC 曲线下的面积。但其实另一种定义更常用,分别随机从正负样本集中抽取一个正样本,一个负样本,正样本的预测值大于负样本的概率。

后一个定义可以从前一个定义推导出来,有兴趣的可以看下 Wilcoxon-Mann-Witney Test。

ROC曲线 和 AUC 直白详解

https://www.jianshu.com/p/11be7ff89d8f

机器学习评估指标AUC与Precision、Recall、F1之间的关系,代码展示

https://blog.csdn.net/yftadyz/article/details/107789574

理解 ROC 和 AUC, 推导过程

http://vividfree.github.io/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/2015/11/20/understanding-ROC-and-AUC




AUC是反映ROC曲线下面的面积,面积越大,模型质量越好。而这个面积是由ROC曲线决定的。而组成ROC曲线的每一个点,是由TPR和FPR来决定。

AUC和F1的区别是什么?

  • AUC关注的是混淆矩阵里左右两边的关系,即放到正类答卷里的数据多,还是放到负类卷子里的数据多.
  • 而F1关注的是正类被误判的多还是漏判的多.

AUC里为什么正类答卷和负类答卷的数据是变化的呢?

因为AUC是在并不假设阈值是固定的前提下判断模型质量。这里的阈值是指,模型判断一行数据是正类还是负类时,是概率大于50%判断为正类?还是大于60%判断为正类?在这个阈值不固定的情况下,AUC仍可以判断模型质量,并且可以使用KS(Kolmogorov-Smirnov)来帮助查找最优阈值:KS=max(TPR-FPR)。

可以说ROC曲线是由多个阈值形成的多个混淆矩阵的结果组合成的。而F1是指在阈值已经固定的前提下,判断模型质量。因而AUC更公正和合理一些。

至于最终正确的阈值是什么,要考虑用户更关注TPR还是FPR,才能取舍。

还有一点,样本确定后,TPR、FPR分母就固定下来了,所以会随TP、FP增长单调递增。但Precision的变化情况会随着阈值调整而变化,且不可预测,或者说不稳定,而AUC会稳定很多。

总结一下,正确的做法是用AUC评价模型能力,选取好的模型之后根据实际需求确定阈值,再用Macro F1计算性能指标。

在很好的记忆训练数据中的正样本的基础下:
auc希望训练一个尽量不误报的模型,也就是知识外推的时候倾向保守估计,而f1希望训练一个不放过任何可能的模型,即知识外推的时候倾向激进,这就是这两个指标的核心区别。

所以在实际中,选择这两个指标中的哪一个,取决于一个trade-off。如果我们犯检验误报错误的成本很高,那么我们选择auc是更合适的指标。如果我们犯有漏网之鱼错误的成本很高,那么我们倾向于选择f1score。
放到实际中,对于检测传染病,相比于放过一个可能的感染者,我们愿意多隔离几个疑似病人,所以优选选择F1score作为评价指标。而对于推荐这种场景,由于现在公司的视频或者新闻库的物料总量是很大的,潜在的用户感兴趣的item有很多,所以我们更担心的是给用户推荐了他不喜欢的视频,导致用户体验下降,而不是担心漏掉用户可能感兴趣的视频。所以推荐场景下选择auc是更合适的。

https://blog.csdn.net/Jerry_Lu_ruc/article/details/107912462

python sklearn计算准确率、精确率、召回率、F1 score

https://blog.csdn.net/hfutdog/article/details/88085878

混淆矩阵

准确率

from sklearn.metrics import accuracy_score

y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
print(accuracy_score(y_true, y_pred))  # 0.5
print(accuracy_score(y_true, y_pred, normalize=False))  # 2

# 在具有二元标签指示符的多标签分类案例中
print(accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))))  # 0.5
准确度分类得分
 
在多标签分类中,此函数计算子集精度:为样本预测的标签集必须完全匹配y_true(实际标签)中相应的标签集。
 
参数
y_true : 一维数组,或标签指示符 / 稀疏矩阵,实际(正确的)标签.
y_pred : 一维数组,或标签指示符 / 稀疏矩阵,分类器返回的预测标签.
normalize : 布尔值, 可选的(默认为True). 如果为False,返回分类正确的样本数量,否则,返回正 确分类的得分.
sample_weight : 形状为[样本数量]的数组,可选. 样本权重.
 
返回值
score : 浮点型
如果normalize为True,返回正确分类的得分(浮点型),否则返回分类正确的样本数量(整型).
当normalize为True时,最好的表现是score为1,当normalize为False时,最好的表现是score未样本数量.

精确率

精确率指模型预测为正的样本中实际也为正的样本占被预测为正的样本的比例。


from sklearn.metrics import precision_score

y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(precision_score(y_true, y_pred, average='macro'))  # 0.2222222222222222
print(precision_score(y_true, y_pred, average='micro'))  # 0.3333333333333333
print(precision_score(y_true, y_pred, average='weighted'))  # 0.2222222222222222
print(precision_score(y_true, y_pred, average=None))  # [0.66666667 0.        

召回率

from sklearn.metrics import recall_score

y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(recall_score(y_true, y_pred, average='macro'))  # 0.3333333333333333
print(recall_score(y_true, y_pred, average='micro'))  # 0.3333333333333333
print(recall_score(y_true, y_pred, average='weighted'))  # 0.3333333333333333
print(recall_score(y_true, y_pred, average=None))  # [1. 0. 0.]

F1 score

F1 score是精确率和召回率的调和平均值,计算公式为:


from sklearn.metrics import f1_score

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

推荐阅读更多精彩内容