加载中...

机器学习笔记15——多分类混淆矩阵、F1-score指标详解与代码实现(含数据)

推荐阅读

参考文章

前言

之前在逻辑回归的文章中简单提到过F1-score,但并没有详细对其进行说明和代码实现。这里补一下。

混淆矩阵简介

混淆矩阵(又称误差矩阵)是评判模型结果的指标,属于模型评估的一部分。混淆矩阵多用于判断分类器的优劣,适用于分类型数据模型。如分类树、逻辑回归、线性判别分析等方法。

除了混淆矩阵外,常见的分类型模型判别标准还有ROC曲线AUC面积,本篇不对另外两种进行拓展。

二分类混淆矩阵

为了便于理解,我们从二分类混淆模型开始,引出四个基本指标(又称一级指标),并进一步引出其他指标。

一级指标

二级指标

通过混淆矩阵统计出的一级指标,可以进一步衍生出以下二级指标。

准确率(Accuracy)

含义: 分类模型所有判断正确的结果占总观测值的比重。(准确率是针对整个模型)

公式: \[ Acc = \frac{TP+TN}{TP+TN+FP+FN} \]

注意别把准确率和精确率搞混了。

精确率(Precision)

含义:在模型预测为正类的所有结果中,模型预测正确的比重。

公式: \[ Pc = \frac{TP}{TP+FP} \]

召回率(Recall)

召回率又称灵敏度(Sensitivity)

含义:在真实值为正类的所有结果中,模型预测正确的比重。

公式: \[ Rc = \frac{TP}{TP+FN} \]

特异度(Specificity)

含义:在真实值为负类的所有结果中,模型预测正确的比重。

公式: \[ Sc = \frac{TN}{TN+FP} \]

相对于前三个二级指标,特异度用的比较少。

三级指标(F-score)

通过二级指标可以引出三级指标F Score

F-Score是可以综合考虑精确度(Precision)召回率(Recall)的调和值,公式如下: \[ F~Score = (1+\beta^2)\frac{Precision\times Recall}{\beta^2Precision+Recall} \]

F1-score

公式(即\(\beta=1\)): \[ F1~Score = \frac{2Precision\times Recall}{Precision+Recall} \]

多分类混淆矩阵

现在将二分类拓展至多分类混淆矩阵。为了便于理解,这里举一个具体的示例。

准确率(Accuracy)

准确率是对于整体而言的,指分类模型所有预测正确的结果占总观测值的比重。可以很容易看出,对于多分类混淆矩阵,所有预测正确的结果就是对角线之和

于是这个示例的准确率为: \[ \begin{split} Acc & = \frac{23+25+30}{23+3+2+4+25+6+5+2+30} \\ & = \frac{78}{100} \\ & = 0.78 \end{split} \]

精确率(Precision)

精确率是对于单个类别而言。所以这里需要把\(C1,C2,C3\)的精确度都算出来。这里就只举例\(C1\)的精确度如何计算。

某类的精确率:在模型预测为本类的所有结果中,模型预测正确的比重。(分母为对行求和)

\(C1\)的精确率为\(Pc_1\)\[ \begin{split} Pc_1 = & \frac{23}{23+3+2} \\ & = 0.821 \end{split} \]

召回率(Recall)

某类的召回率:在真实值为本类的所有结果中,模型预测正确的比重。(分母为对列求和)

\(C1\)的召回率为\(Rc_1\)\[ \begin{split} Rc_1 = & \frac{23}{23+4+5} \\ & = 0.719 \end{split} \]

特异度(Specificity)

一般都用不着,不过这里还是算一遍吧。

要计算这个东西,需要把上面的图统计为二分类混淆矩阵的形式才好解释。

特异度:在真实值为负类的所有结果中,模型预测正确的比重。

\(C1\)的特异度为\(Sc_1\) : $$ \[\begin{split} Sc_1 & = \frac{TN}{TN+FP} \\ & = \frac{63}{5+63} \\ & = 0.93 \end{split}\]

$$

F1-score

\[ \begin{split} F1~Score_1 &= \frac{2Pc_1Rc_1}{Pc_1+Rc_1} \\ & = \frac{2\times0.821\times0.719 }{0.821+0.719} \\ & = 0.767 \end{split} \]

示例与代码实现(Python)

前景题要:现在已经通过某种多分类器(例如softmax分类器)求出了测试集的预测结果。现在需要对预测结果进行评估。

  • y_predict:样本集的预测结果,维度(1,N)。N代表参加测试的有N个样本。
  • y_true:样本集的真实标签,维度(1,N)。

数据如下:

1
2
y_true is :    [0 1 3 2 3 0 2 2 3 3 3 0 1 4 4 0 1 3 2 2 1 3 2 0 2 4 1 0 1 0 4 3 3 3 2 1 0 3 0]
y_predict is : [0 1 3 0 2 0 2 2 1 2 3 0 0 4 4 0 1 4 2 2 0 3 2 1 2 4 3 1 1 3 4 3 0 2 2 3 2 2 1]

step1:统计混淆矩阵

1
2
3
4
5
6
7
8
9
10
11
12
def statistics_confusion(y_true,y_predict):
"""
统计混淆矩阵

:param y_true: 真实label
:param y_predict: 预测label
:return:
"""
confusion = np.zeros((5, 5))
for i in range(y_true.shape[0]):
confusion[y_predict[i]][y_true[i]] += 1
return confusion

输出:

step2:计算二级指标

准确率(Accuracy)

1
2
3
4
5
6
7
8
def cal_Acc(confusion):
"""
计算准确率

:param confusion: 混淆矩阵
:return: Acc
"""
return np.sum(confusion.diagonal())/np.sum(confusion)

输出:

1
Acc is 0.5641025641025641

精确率(Precision)

1
2
3
4
5
6
7
8
def cal_Pc(confusion):
"""
计算每类精确率

:param confusion: 混淆矩阵
:return: Pc
"""
return confusion.diagonal()/np.sum(confusion,axis=1)

输出:

1
Pc is [0.5        0.42857143 0.58333333 0.57142857 0.8       ]

每列对应一个类的精确率。

召回率(Recall)

1
2
3
4
5
6
7
8
def cal_Rc(confusion):
"""
计算每类召回率

:param confusion: 混淆矩阵
:return: Rc
"""
return confusion.diagonal()/np.sum(confusion,axis=0)

输出:

1
Rc is [0.44444444 0.42857143 0.875      0.36363636 1.        ]

每列对应一个类的召回率。

step3:计算F1-score

1
2
3
4
5
6
7
8
9
def cal_F1score(PC,RC):
"""
计算F1 score

:param PC: 精准率
:param RC: 召回率
:return: F1 score
"""
return 2*np.multiply(PC,RC)/(PC+RC)

输出:

1
F1-score is [0.47058824 0.42857143 0.7        0.44444444 0.88888889]

每列对应一个类的F1 score。

为了让结果和代码更加美观,可以打一下包。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np

class Myreport:
def __init__(self):
self.__confusion = None

def __statistics_confusion(self,y_true,y_predict):
self.__confusion = np.zeros((5, 5))
for i in range(y_true.shape[0]):
self.__confusion[y_predict[i]][y_true[i]] += 1

def __cal_Acc(self):
return np.sum(self.__confusion.diagonal()) / np.sum(self.__confusion)

def __cal_Pc(self):
return self.__confusion.diagonal() / np.sum(self.__confusion, axis=1)

def __cal_Rc(self):
return self.__confusion.diagonal() / np.sum(self.__confusion, axis=0)

def __cal_F1score(self,PC,RC):
return 2 * np.multiply(PC, RC) / (PC + RC)

def report(self,y_true,y_predict,classNames):
self.__statistics_confusion(y_true,y_predict)
Acc = self.__cal_Acc()
Pc = self.__cal_Pc()
Rc = self.__cal_Rc()
F1score = self.__cal_F1score(Pc,Rc)
str = "Class Name\t\tprecision\t\trecall\t\tf1-score\n"
for i in range(len(classNames)):
str += f"{classNames[i]} \t\t\t{format(Pc[i],'.2f')} \t\t\t{format(Rc[i],'.2f')}" \
f" \t\t\t{format(F1score[i],'.2f')}\n"
str += f"accuracy is {format(Acc,'.2f')}"
return str


测试:

1
2
myreport = Myreport()
print(myreport.report(y_true = y_true,y_predict=y_predict,classNames=['C1','C2','C3','C4','C5']))

输出:

使用sklearn对比计算结果是否正确

1
2
3
4
5
6
from sklearn.metrics import classification_report # 结果评估
myreport = Myreport()
print("=====自己实现的结果=====")
print(myreport.report(y_true = y_true,y_test=y_predict,classNames=['C1','C2','C3','C4','C5']))
print("=====使用sklrean的结果=====")
print(classification_report(y_true, y_predict, target_names=['C1','C2','C3','C4','C5']))

结果对比

只能说一模一样。

文章作者: issey
文章链接: https://blog.issey.top/article/f7fe9040ab51/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 issey的博客!

评论
文章归档 文章分类 文章标签
随便逛逛

玻璃钢生产厂家青海玻璃钢景观雕塑定做陕西石雕雕塑玻璃钢福建省玻璃钢大型雕塑福建高质量玻璃钢雕塑市场临江玻璃钢伟人像雕塑江川区玻璃钢雕塑常州玻璃钢人物雕塑厂家玻璃钢雕塑可以现场制作吗玻璃钢雕塑是固定资产吗河西新年商场美陈学校玻璃钢园林艺术雕塑雕塑玻璃钢翻制费用衡水玻璃钢雕塑定制长春人物玻璃钢雕塑价格宛城玻璃钢雕塑加工厂家江门玻璃钢雕塑工艺广东通道商场美陈供应商高淳春季商场美陈商场美陈引流布置焦作仿铜玻璃钢雕塑厂家深圳节庆商场美陈销售厂家玻璃钢彩绘蜗牛雕塑秦皇岛卡通玻璃钢雕塑定做鑫业鑫玻璃钢花盆玻璃钢人物雕塑的制作标准街道宣传玻璃钢雕塑河南通道商场美陈哪里有盐城玻璃钢花盆价格广州玻璃钢卡通雕塑冰雪玻璃钢人物不锈钢动物雕塑定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化