@TOC
一、前言
有些东西不记录下来,就会记不清,最近在做分类任务,所以重新总结一下,记录在博客里面,以便后面翻阅。第二章介绍分类的评价指标,第三章使用python实现各类评价指标,第四章为参考文献。
二、评价指标介绍
符号解释:
二分类任务:
T
P
TP
TP -
(
T
r
u
e
P
o
s
i
t
i
v
e
)
(True Positive)
(TruePositive) 真正例
T
N
TN
TN -
(
T
r
u
e
N
e
g
a
t
i
v
e
)
(True Negative)
(TrueNegative) 真负例
F
P
FP
FP -
(
F
a
l
s
e
P
o
s
i
t
i
v
e
)
(False Positive)
(FalsePositive) 假正例
F
N
FN
FN -
(
F
a
l
s
e
N
e
g
a
t
i
v
e
)
(False Negative)
(FalseNegative) 假负例
1. Accuracy(准确率)
准确率是衡量分类器分类准确程度最常见的分类评价指标之一,是指正确分类的样本占总样本的比例。该评价指标优点在于可以综合衡量分类器对每个类别的分类性能;缺点同样,该分类指标只能模糊表示分类器的性能,无法精确描述分类器对某些类别分类性能;在训练分类器时,常用来大概描述分类器的性能,该指标在评价多分类任务中的重要程度要高于二分类任务中。
A c c u r a c y = T P + T N T P + F P + T N + F N = 分 类 正 确 的 样 本 数 量 总 样 本 数 量 Accuracy = \frac{TP+TN}{TP+FP+TN+FN} = \frac{分类正确的样本数量}{总样本数量} Accuracy=TP+FP+TN+FNTP+TN=总样本数量分类正确的样本数量
2. Recall(召回率、查全率)
Recall表示分类器对某一特定类别的召回,是指原本为正例的样本被正确分类的比例(假设正例是目标类别),因此常用于二分类任务中;当然在多分类任务中该指标要针对某一特定类别来计算。
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall = \frac{TP}{TP+FN}
Recall=TP+FNTP
3. Precision(精确度)
Precision表示分类器对某一特定类别的分类精确程度,是指被分类为正例的样本中真正属于正例的比例,同样常用于二分类任务中;在多分类任务中该指标也只能针对某一特定类别来计算。
P
r
e
c
i
s
o
n
=
T
P
T
P
+
F
P
Precison = \frac{TP}{TP+FP}
Precison=TP+FPTP
4.F-score(又称为F-measure)
F-score是衡量分类器性能的综合行指标,由于Recall和Precision是两个相互矛盾的指标,当在衡量两个分离器性能优劣势,往往由于二者相互矛盾导致无法评价两分类器好坏,因此引入该综合性指标来加以判断。
F
−
s
c
o
r
e
=
(
α
2
+
1
)
(
R
e
c
a
l
l
∗
P
r
e
c
i
s
i
o
n
)
α
2
(
R
e
c
a
l
l
+
P
r
e
c
i
s
i
o
n
)
F-score = \frac{(\alpha^2+1)(Recall*Precision)}{\alpha^2(Recall+Precision)}
F−score=α2(Recall+Precision)(α2+1)(Recall∗Precision)
设置不同的
α
\alpha
α值来控制评判倾向,通常使用
α
=
1
\alpha=1
α=1的F1-score来评估分类器性能。
5.FalseAlarmRate(虚警率)
FalseAlarm表示分类器正确预测正样本纯度的指标,是指负例样本中被分类为正例的比例,常用与检测类任务,值越小说明模型性能越好。
F
a
l
s
e
A
l
a
r
m
R
a
t
e
=
F
P
T
N
+
F
P
FalseAlarmRate = \frac{FP}{TN+FP}
FalseAlarmRate=TN+FPFP
三、python代码实现
1. Accuracy、Recall、Precision、F1-score、FalseAlarmRate实现
import numpy as np
# 假设真实标签和预测标签
ground_truth = [1,0,0,1,1,1,0,1,1,0] # 真实标签
predictions = [1,1,0,1,0,1,0,1,0,0] # 预测标签
# 将列表转换为numpy格式,
ground_truth = np.array(ground_truth, dtype=np.int32)
predictions = np.array(predictions, dtype=np.int32)
# 计算tp/tn/fp/fn
tp = np.sum(np.logical_and(predictions == 1, ground_truth == 1))
tn = np.sum(np.logical_and(predictions == 0, ground_truth == 0))
fp = np.sum(np.logical_and(predictions == 1, ground_truth == 0))
fn = np.sum(np.logical_and(predictions == 0, ground_truth == 1))
# 计算accuracy
accuracy = np.mean(predictions == ground_truth)
# 计算recall
recall = tp/(tp+fn)
# 计算precision
precision = tp/(tp+fp)
# 计算f1-score
f1_score = 2*recall*precision/(recall+precision)
# 计算falseAlarmRate
false_alarm_rate = fp/(tn+fp)
四、参考博文
[1] wiki-f-score
[2] TP、FP、TN、FN代码实现