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

这篇具有很好参考价值的文章主要介绍了【机器学习笔记15】多分类混淆矩阵、F1-score指标详解与代码实现(含数据)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

推荐阅读

参考文章

  • 4.4.2分类模型评判指标(一) - 混淆矩阵(Confusion Matrix)_进击的橘子猫的博客-CSDN博客_混淆矩阵

前言

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

混淆矩阵简介

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

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

二分类混淆矩阵

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

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

一级指标

  • TP(True Positive,真阳性):样本的真实类别是正类,并且模型预测的结果也是正类。
  • FP(False Positive,假阳性):样本的真实类别是负类,但是模型将其预测成为正类。
  • TN(True Negative,真阴性):样本的真实类别是负类,并且模型将其预测成为负类。
  • FN(False Negative,假阴性):样本的真实类别是正类,但是模型将其预测成为负类。

二级指标

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

准确率(Accuracy)

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

公式:
A c c = T P + T N T P + T N + F P + F N Acc = \frac{TP+TN}{TP+TN+FP+FN} Acc=TP+TN+FP+FNTP+TN

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

精确率(Precision)

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

公式:
P c = T P T P + F P Pc = \frac{TP}{TP+FP} Pc=TP+FPTP

召回率(Recall)

召回率又称灵敏度(Sensitivity)

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

公式:
R c = T P T P + F N Rc = \frac{TP}{TP+FN} Rc=TP+FNTP

特异度(Specificity)

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

公式:
S c = T N T N + F P Sc = \frac{TN}{TN+FP} Sc=TN+FPTN

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

三级指标(F-score)

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

F-Score是可以综合考虑精确度(Precision)召回率(Recall)的调和值,公式如下:
F   S c o r e = ( 1 + β 2 ) P r e c i s i o n × R e c a l l β 2 P r e c i s i o n + R e c a l l F~Score = (1+\beta^2)\frac{Precision\times Recall}{\beta^2Precision+Recall} F Score=(1+β2)β2Precision+RecallPrecision×Recall

  • 当我们认为精确度更重要,调整 β < 1 \beta<1 β<1
  • 当我们认为召回率更重要,调整 β > 1 \beta>1 β>1
  • β = 1 \beta = 1 β=1时,精确度和召回率权重相同。此时称为F1-Score或F1-Measure

F1-score

公式(即 β = 1 \beta=1 β=1):
F 1   S c o r e = 2 P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1~Score = \frac{2Precision\times Recall}{Precision+Recall} F1 Score=Precision+Recall2Precision×Recall

多分类混淆矩阵

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

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

准确率(Accuracy)

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

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

精确率(Precision)

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

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

C 1 C1 C1的精确率为 P c 1 Pc_1 Pc1
P c 1 = 23 23 + 3 + 2 = 0.821 \begin{split} Pc_1 = & \frac{23}{23+3+2} \\ & = 0.821 \end{split} Pc1=23+3+223=0.821

召回率(Recall)

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

C 1 C1 C1的召回率为 R c 1 Rc_1 Rc1
R c 1 = 23 23 + 4 + 5 = 0.719 \begin{split} Rc_1 = & \frac{23}{23+4+5} \\ & = 0.719 \end{split} Rc1=23+4+523=0.719

特异度(Specificity)

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

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

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

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

C 1 C1 C1的特异度为 S c 1 Sc_1 Sc1
S c 1 = T N T N + F P = 63 5 + 63 = 0.93 \begin{split} Sc_1 & = \frac{TN}{TN+FP} \\ & = \frac{63}{5+63} \\ & = 0.93 \end{split} Sc1=TN+FPTN=5+6363=0.93

F1-score

F 1   S c o r e 1 = 2 P c 1 R c 1 P c 1 + R c 1 = 2 × 0.821 × 0.719 0.821 + 0.719 = 0.767 \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} F1 Score1=Pc1+Rc12Pc1Rc1=0.821+0.7192×0.821×0.719=0.767

示例与代码实现

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

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

数据如下:

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:统计混淆矩阵

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

输出:

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

step2:计算二级指标

准确率(Accuracy)

def cal_Acc(confusion):
    """
    计算准确率

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

输出:

Acc is 0.5641025641025641

精确率(Precision)

def cal_Pc(confusion):
    """
    计算每类精确率

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

输出:

Pc is [0.5        0.42857143 0.58333333 0.57142857 0.8       ]

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

召回率(Recall)

def cal_Rc(confusion):
    """
    计算每类召回率

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

输出:

Rc is [0.44444444 0.42857143 0.875      0.36363636 1.        ]

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

step3:计算F1-score

def cal_F1score(PC,RC):
    """
    计算F1 score

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

输出:

F1-score is [0.47058824 0.42857143 0.7        0.44444444 0.88888889]

每列对应一个类的F1 score。

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

完整代码

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


测试:

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

输出:

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

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

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']))

结果对比

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

只能说一模一样。文章来源地址https://www.toymoban.com/news/detail-415877.html

到了这里,关于【机器学习笔记15】多分类混淆矩阵、F1-score指标详解与代码实现(含数据)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lesson 5.2 混淆矩阵与 F1-Score

    接下来,我们重点讨论关于分类模型评估指标相关内容。 分类模型作为使用场景最为广泛的机器学习模型,相关模型评估指标也伴随着使用场景的拓展而不断丰富。 除了此前所介绍的准确率以外,常用的二分类模型的模型评估指标还有召回率(Recall)、F1 指标(F1-Score)、受

    2024年02月05日
    浏览(32)
  • Python手动输入混淆矩阵,并计算混淆矩阵的准确率、精确率、召回率、特异度、F1-score

    其中json格式的文件如下: {     \\\"0\\\": \\\"13\\\",     \\\"1\\\": \\\"18\\\",     \\\"2\\\": \\\"23\\\",     \\\"3\\\": \\\"28\\\",     \\\"4\\\": \\\"33\\\" } 可以按照以上格式(以5分类为例),先写在记事本上再更改后缀名 *注意最后一个后面没有 “,”  没有扩展名的看下面这个图给它调出来↓ 代码部分参考如下:  参考文献:使用

    2024年02月13日
    浏览(39)
  • 【机器学习】分类器性能度量——混淆矩阵及sklearn实现

    记录一下混淆矩阵的学习心得,不写下来老是容易搞混.. 机器学习中,考量二分类问题的分类器性能时,可以将样本的实际类别与分类器预测类别,划分为如下 TN, FP, FN, TP 四种结果,组合起来就是大名鼎鼎的 confusion matrix 混淆矩阵。其中: True,False 表示预测结果与实际分类

    2024年02月10日
    浏览(43)
  • 混淆矩阵、精确率、召回率和F1值:如何评估分类器的性能?

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由文心一格生成) 在机器学习中,分类是一项非常重要的任务。在

    2024年02月02日
    浏览(50)
  • ML分类模型的评估量 —— 混淆矩阵、查准率、查全率、正确率、F1值

    Some Metrics suitable for machine learning classification model - Confusion Matrix, Precision Score, Recall Score and F1 Score. 本文意在介绍,监督学习(Supervised Learning)中,几个常被用于评估 分类模型 的 指标 (model metric),并讨论它们在二分类模型和多分类模型中的具体计算方法。 图 1 混淆矩阵(

    2024年02月07日
    浏览(32)
  • 图像分类 图像分割的评价指标(混淆矩阵 正确率 精准率 召回率 F1分数 IOU dice系数)

             在图像分类或者图像分割中,为 评价模型的预测效果 ,在训练过程中通常需要比较预测值与真实标签值的差距,即误差。 目录 图像分类过程的评价指标 混淆矩阵 正确率/准确率 精准率 召回率 F1分数 图像分割过程的评价指标 混淆矩阵 混淆矩阵的生成代码 IO

    2024年01月22日
    浏览(32)
  • 详解分类指标Precision,Recall,F1-Score

    在使用机器学习算法的过程中,我们需要对建立的模型进行评估来辨别模型的优劣,下文中主要介绍常见的几种评估指标。以下指标都是对分类问题的评估指标。 在二分类任务中,假设只有正类(1)和负类(0)两个类别,True(1)和False(0)分别表示预测结果对或错;Posi

    2024年02月16日
    浏览(37)
  • 机器学习 | 混淆矩阵和ROC曲线

    (1)对于二分类 TP(True Positive):将正类预测为正类数,真实为0,预测也为0 FN(False Negative):将正类预测为负类数,真实为0,预测为1 FP(False Positive):将负类预测为正类数, 真实为1,预测为0 TN(True Negative):将负类预测为负类数,真实为1,预测也为1 则混淆矩阵如下: (2)对

    2024年01月21日
    浏览(35)
  • 【机器学习】二分类问题中的混淆矩阵、准确率、召回率等 (Python代码实现)

    混淆矩阵(Confusion Matrix):将分类问题按照真实情况与判别情况两个维度进行归类的一个矩阵,如在二分类问题中就是一个2*2的矩阵: TP(True Positive):表示实际为真预测为真 FP(False Positive):表示实际为假预测为真 (误报) TN(True Negative):表示实际为假预测为假 FN(False N

    2024年01月24日
    浏览(36)
  • 机器学习模型优劣评价指标:混淆矩阵,P-R曲线与平均精确度(附代码实现)

    文章参考:Mean Average Precision (mAP) Explained | Paperspace Blog 目录 一. Confusion Metrics混淆矩阵 二. Precision-Recall Curve, Average precision P-R曲线,平均精确度 三. 举例与代码实现 (1)从预测分数到类别标签(From Prediction Score to Class Label) (2)精确度-召回度曲线(Precision-Recall Curve) (3)平均

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包