这两个的概念其实很简单,不会涉及到很高深的数学知识。
1. Kappa系数
参考https://baike.baidu.com/item/kappa%E7%B3%BB%E6%95%B0/9385025?fr=aladdin
https://www.cnblogs.com/by-dream/p/7091315.html
1.1 公式介绍
kappa系数是一种衡量分类精度的指标。其计算公式如下
k
=
P
o
−
P
e
1
−
P
e
k = \frac{P_o-P_e}{1-P_e}
k=1−PePo−Pe
其中,
p
0
p_0
p0是每一类正确分类的样本数量之和除以总样本数,也就是总体分类精度 。
假设每一类的真实样本个数分别为
a
1
,
a
2
,
.
.
.
,
a
C
a1,a2,...,aC
a1,a2,...,aC, 而预测出来的每一类的样本个数分别为
b
1
,
b
2
,
.
.
.
,
b
C
b1,b2,...,bC
b1,b2,...,bC
总样本个数为
n
n
n,则有:
p
e
=
a
1
∗
b
1
+
a
2
∗
b
2
+
.
.
.
+
a
C
∗
b
C
n
∗
n
pe = \frac{a_1*b_1+a_2*b_2+...+aC*bC}{n*n}
pe=n∗na1∗b1+a2∗b2+...+aC∗bC
1.2 结果分析
kappa计算结果为[-1,1],但通常kappa是落在 [0, 1] 间,可分为五组来表示不同级别的一致性:
- [0.00, 0.20] 极低的一致性(slight)
- [0.21, 0.40] 一般的一致性(fair)
- [0.41, 0.60] 中等的一致性(moderate)
- [0.61, 0.80] 高度的一致性(substantial)
- [0.81, 1.00] 几乎完全一致(almost perfect)。
1.3 举例
下表为混淆矩阵 (接下来会讲混淆矩阵)
类别 | 实际为A | 实际为B | 实际为C |
---|---|---|---|
预测为A | 239 | 21 | 16 |
预测为B | 16 | 73 | 4 |
预测为C | 6 | 9 | 280 |
首先计算
P
0
P_0
P0, 是每一类正确分类的样本数量之和除以总样本数.
p
o
=
239
+
73
+
280
664
=
0.8916
p_o = \frac{239 +73+280}{664} = 0.8916
po=664239+73+280=0.8916
然后计算
P
e
P_e
Pe
# 竖着相加
239+16+6=261
21+73+9=103
16+4+280=300
# 横着相加
239+21+16 = 276
16+73+4 = 93
6+9+280 = 295
p
e
=
261
×
276
+
103
×
93
+
300
×
295
664
×
664
=
0.3883
p_e = \frac{261×276+103×93+300 ×295}{664 ×664} = 0.3883
pe=664×664261×276+103×93+300×295=0.3883
因此
k
a
p
p
a
=
0.8916
−
0.3883
1
−
0.3883
kappa = \frac{0.8916 -0.3883}{1-0.3883}
kappa=1−0.38830.8916−0.3883
代码
from sklearn.metrics import confusion_matrix
import pandas as pd
import numpy as np
# y_true: 标注数据(真实标签)
# y_pred: 模型预测结果
def get_kappa(y_true, y_pred):
# 计算混淆矩阵
confusion_matrix = confusion_matrix(y_true, y_pred)
# 一个混淆矩阵的例子
# confusion_matrix = np.array(
# [[10, 5, 5],
# [ 2, 35, 2],
# [ 8, 5, 15]])
# 可以调试一下这些分别都是什么
# 该公式主要来自于https://www.cnblogs.com/by-dream/p/7091315.html
all_sum = sum(sum(confusion_matrix))
Po = sum(np.diagonal(confusion_matrix)) / all_sum
a = sum(confusion_matrix)
b = sum(confusion_matrix.T)
Pe = sum(a*b)/ (all_sum*all_sum)
kappa = (Po - Pe)/(1-Pe)
return kappa
y_true = [1,2,3]
y_pred = [1,3,2]
2. 混淆矩阵 (Confusion Matrix)
参考https://baike.baidu.com/item/%E6%B7%B7%E6%B7%86%E7%9F%A9%E9%98%B5/10087822
混淆矩阵中
- 每一列代表了
预测类别
- 每一行代表了·真实类别·
每一列中的数值表示真实数据被预测为该类的数目,如下表所示
类别 | 实际为A | 实际为B | 实际为C |
---|---|---|---|
预测为A | 239 | 21 | 16 |
预测为B | 16 | 73 | 4 |
预测为C | 6 | 9 | 280 |
第一行第一列中的239表示有239个实际归属第一类的实例被预测为第一类;同理,第一行第二列的21表示有21个实际归属为第一类的实例被错误预测为第二类;以此类推