这是我参加11月更文应战的第23天,活动详情查看:2021最后一次更文应战
混杂矩阵
confusion_matrix
函数经过核算每一行对应于实在类别的混杂矩阵来评估分类准确率。
依据定义,混杂矩阵中的条目[i,j]是实际上在类 i 中,但猜测在类 j 中的数量。
示例代码:
from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
print(confusion_matrix(y_true, y_pred))
运转成果:
[[2 0 0]
[0 0 1]
[1 0 2]]
参数normalize
答应陈述成果是比率而不是计数。 混杂矩阵能够经过3种不同的方法进行归一化:’pred’、’true’和’all’,它们别离将计数除以每列、每行或整个矩阵的总和。
示例代码:
y_true = [0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 1, 0, 1, 0, 1, 0, 1]
print(confusion_matrix(y_true, y_pred, normalize='all'))
运转成果:
[[0.25 0.125]
[0.25 0.375]]
对于二分类问题,咱们能够得到真阴性(tn)、假阳性(fp)、假阴性(fn)和真阳性(tp)的计数,如下所示:
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
print(tn, fp, fn, tp) # 2 1 2 3
Kappa系数
cohen_kappa_score
函数核算 Cohen 的 kappa 统计量。 该措施旨在比较不同人类标示者的标签,而不是分类器的猜测值与实在值。
其公式为:
其中,pop_o是分配给任何样本的标签的经验概率(观察到的共同性比率),pep_e是两个标示者随机分配标签时的预期共同性。pep_e 是运用类标签上的每个标示者的经验先验估量的。
上面关于pop_o和pep_e的解说有点不流畅难懂,请看下面:
pop_o是每一类正确分类的样本数量之和除以总样本数,也就是整体分类精度。
咱们假设每一类的实在样本个数别离为a1,a2,…,ana_1,a_2,…,a_n,而猜测出来的每一类的样本个数别离为b1,b2,…,bnb_1,b_2,…,b_n,总样本个数为nn,则有:pe=a1b1+a2b2+…+anbnnnp_e=\frac{a_1b_1+a_2b_2+…+a_nb_n}{nn}
kappa 分数是一个介于 -1 和 1 之间的数字。一般,kappa是落在0与1之间,高于 0.8 的分数一般被认为是杰出的共同性; 零或更低意味着不共同(实际上是随机标签)。
可认为二分类或多分类问题核算 Kappa 分数,但不能为多标签问题核算 Kappa 分数(除非经过手动核算每个标签的分数)而且不能为两个以上的标示者核算。
举例阐明: 学生考试的作文成果,由两个老师给出 好、中、差三档的打分,现在已知两位老师的打分成果,需求核算两位老师打分之间的相关性kappa系数:
从上面的公式中,咱们能够知道,其实只需求核算pop_o,pep_e即可:
po=(10+35+15)/87=0.689p_o = (10+35+15) / 87 = 0.689
a1=10+2+8=20;a2=5+35+5=45;a3=5+2+15=22;a1 = 10+2+8 = 20; a2 = 5+35+5 = 45; a3 = 5+2+15 = 22;
b1=10+5+5=20;b2=2+35+2=39;b3=8+5+15=28;b1 = 10+5+5 = 20; b2 = 2+35+2 = 39; b3 = 8+5+15 = 28;
pe=a1∗b1+a2∗b2+a3∗b387∗87=0.455p_e = \frac{a1*b1 + a2*b2 + a3*b3}{87*87} = 0.455
=po−pe1−pe\kappa = \frac{p_o-p_e}{1-p_e} = 0.4293578
示例代码:
from sklearn.metrics import cohen_kappa_score
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
print(confusion_matrix(y_true, y_pred))
print("-----------")
print(cohen_kappa_score(y_true, y_pred))
运转成果:
[[2 0 0]
[0 0 1]
[1 0 2]]
-----------
0.4285714285714286
核算过程如下:
po=4/6=2/3
a1=2; a2=1; a3=3
b1=3; b2=0; b3=3
pe=(2*3+1*0+3*3)/(6*6)=15/36=5/12
kappa=(2/3-5/12)/(1-5/12)=3/7=0.4285
分类目标陈述
classification_report
函数构建一个显现首要分类目标的文本陈述。
首要参数阐明:
- target_names:显现与标签匹配的称号(相同顺序),可选参数
- labels:选择要包含在陈述中的标签索引列表,可选参数
这是一个带有自定义target_names和推理labels的比如:
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 0]
y_pred = [0, 0, 2, 1, 0]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
运转成果:
precision recall f1-score support
class 0 0.67 1.00 0.80 2
class 1 0.00 0.00 0.00 1
class 2 1.00 0.50 0.67 2
accuracy 0.60 5
macro avg 0.56 0.50 0.49 5
weighted avg 0.67 0.60 0.59 5
下面是一个自定义labels的比如:
print(classification_report(y_true, y_pred, labels=[1, 2]))
运转成果:
precision recall f1-score support
1 0.00 0.00 0.00 1
2 1.00 0.50 0.67 2
micro avg 0.50 0.33 0.40 3
macro avg 0.50 0.25 0.33 3
weighted avg 0.67 0.33 0.44 3
汉明丢失
hamming_loss
核算两组样本之间的均匀汉明丢失或汉明间隔,取值在0~1之间,间隔为0阐明猜测成果与实在成果完全相同,间隔为1就阐明模型与咱们想要的成果完全就是背道而驰。
假如 yj\hat{y}_j 是给定样本的第 j 个标签的猜测值, yjy_j为对应的真值,nlabelsn_\text{labels}为类别或标签的个数,那么实在值与猜测值这两个样本之间的汉明丢失LHammingL_{Hamming}定义为:
其中,1(x)1(x)是目标函数。
示例代码:
from sklearn.metrics import hamming_loss
y_pred = [1, 2, 3, 4]
y_true = [2, 2, 3, 4]
print(hamming_loss(y_true, y_pred)) # (1/4)*(1+0+0+0)
# 在具有二标签指示器的多分类场景
print(hamming_loss(np.array([[0, 1],
[1, 1]]),
np.zeros((2, 2)))
) # (1/2)*(1/2)*((1+0)+(1+1))
运转成果:
0.25
0.75
留意:
在多分类中,汉明丢失对应于 y_true 和 y_pred 之间的汉明间隔,类似于零一丢失函数。 然而,虽然零一丢失赏罚不严厉匹配实在集的猜测集,但汉明丢失赏罚单个标签。 因此,以零一丢失为上限的汉明丢失一直介于0和1之间,包括两者; 而且猜测实在标签的适当子集或超集将给出介于 0 和 1 之间的汉明丢失,不包括0和1。
总结
函数 | 阐明 |
---|---|
cohen_kappa_score |
适用于二分类、多分类场景,一种检验共同性的方法 |
confusion_matrix |
适用于二分类、多分类场景,经过核算每一行对应于实在类别的混杂矩阵来评估分类准确率 |
classification_report |
适用于二分类、多分类、多标签场景,显现首要分类目标的文本陈述 |
hamming_loss |
适用于二分类、多分类、多标签场景,核算两组样本之间的汉明间隔 |
参考文档
- confusion-matrix
- classification-report
- hamming-loss
- cohen’s kappa
- Kappa(cappa)系数只需求看这一篇就够了,算法到python完成