当前位置:   article > 正文

机器学习 | 混淆矩阵和ROC曲线_混淆矩阵画roc曲线

混淆矩阵画roc曲线

混淆矩阵

(1)对于二分类
TP(True Positive):将正类预测为正类数,真实为0,预测也为0
FN(False Negative):将正类预测为负类数,真实为0,预测为1
FP(False Positive):将负类预测为正类数, 真实为1,预测为0
TN(True Negative):将负类预测为负类数,真实为1,预测也为1
则混淆矩阵如下:
在这里插入图片描述
(2)对于多分类
多分类不再有正例与反例之分,我们设为类别1,类别2,类别3,混淆矩阵如下:
在这里插入图片描述

import numpy as np
import copy
import matplotlib.pyplot as plt
import random


def confusion_matrix(y_true, y_pred, n):
    matrix = np.zeros((n, n))
    if n == 2:  # 二分类
        for i in range(len(y_true)):
            row = int(y_true[i]-1)
            col = int(y_pred[i]-1)
            matrix[row, col] += 1
    else:  # 多分类
        for i in range(len(y_true)):
            row = int(y_true[i])
            col = int(y_pred[i])
            matrix[row, col] += 1
    return matrix
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

精准率和召回率

(1)对于二分类
精确率Precision=TP/(TP+FP),召回率recall= TP/(TP+FN)
(2)对于多分类
多分类不再拥有正例与反例之分,因此精确率与召回率必须针对具体某一类别,但在计算某一类别的精确率和召回率依旧可以将一个nn的混淆矩阵压缩成二分类的混淆矩阵去求。以上述三分类混淆矩阵为例,求类别1的精确率与召回率。33混淆矩阵转换成如下2*2混淆矩阵:
在这里插入图片描述

ROC曲线

(1)对于二分类
生成一个ROC曲线,只需要真正率(TPR)和假正率(FPR)。TPR决定了一个分类器在所有正例样本中能正确区分的正例的性能.而FPR是决定了在所有假例的样本中有多少假正例的判断. ROC曲线中分别将FPR和TPR定义为x和y轴。AUC即ROC曲线下的面积。
(2)对于多分类
对于多分类最大的问题就是没有正例与假例之分,也没有真正率与假正率之说,ROC曲线也需要对应具体的某一类别得出。因此我提出了上述将多分类的混淆矩阵压缩成二分类混淆矩阵的方法,以此来计算真正与假正率。这样和二分类统一起来,方便理解与编代码。

def roc(y_true, y_pred):
    sort_pred = copy.deepcopy(y_pred)
    sort_pred.sort(reverse=True)
    TPR = []
    FPR = []
    for i in range(len(sort_pred)):
        threshold = sort_pred[i]
        label_pred = np.array(copy.deepcopy(y_pred))
        label_true = np.array(copy.deepcopy(y_true))
        label_pred[label_pred > threshold] = 1
        label_pred[label_pred <= threshold] = 0
        label_true[label_true != 1] = 0
        matrix = confusion_matrix(list(label_true), list(label_pred), 2)
        tpr = matrix[0][0]/(matrix[0][0]+matrix[0][1])
        fpr = matrix[1][0]/(matrix[1][0]+matrix[1][1])
        TPR.append(tpr)
        FPR.append(fpr)
    x = np.array(FPR)
    y = np.array(TPR)
    plt.plot(x, y)
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

简单测试一下

random.seed(0)
y_pred = [0.5+random.uniform(-0.2, 0.2) for _ in range(100)]
y_true = [random.randint(0, 3) for _ in range(100)]
roc(y_true, y_pred)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
完整代码:https://github.com/robin-hlt/Machine-Learning-Confusion-Matrix-and-ROC

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/688094
推荐阅读
相关标签
  

闽ICP备14008679号