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

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

  • 混淆矩阵
  • 精准率和召回率
  • ROC曲线

混淆矩阵

(1)对于二分类
TP(True Positive):将正类预测为正类数,真实为0,预测也为0
FN(False Negative):将正类预测为负类数,真实为0,预测为1
FP(False Positive):将负类预测为正类数, 真实为1,预测为0
TN(True Negative):将负类预测为负类数,真实为1,预测也为1
则混淆矩阵如下:
机器学习 | 混淆矩阵和ROC曲线_第1张图片
(2)对于多分类
多分类不再有正例与反例之分,我们设为类别1,类别2,类别3,混淆矩阵如下:
机器学习 | 混淆矩阵和ROC曲线_第2张图片

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)对于二分类
精确率Precision=TP/(TP+FP),召回率recall= TP/(TP+FN)
(2)对于多分类
多分类不再拥有正例与反例之分,因此精确率与召回率必须针对具体某一类别,但在计算某一类别的精确率和召回率依旧可以将一个nn的混淆矩阵压缩成二分类的混淆矩阵去求。以上述三分类混淆矩阵为例,求类别1的精确率与召回率。33混淆矩阵转换成如下2*2混淆矩阵:
机器学习 | 混淆矩阵和ROC曲线_第3张图片

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()

简单测试一下

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)

机器学习 | 混淆矩阵和ROC曲线_第4张图片
完整代码:https://github.com/robin-hlt/Machine-Learning-Confusion-Matrix-and-ROC

你可能感兴趣的:(机器学习系列,机器学习,矩阵,人工智能)