机器学习 | 混淆矩阵和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)对于二分类
精确率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()

简单测试一下

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)

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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
交叉验证(Cross Validation)是一种常用的模型评估方法,用于评估机器学习模型的性能。它通过将数据集划分为训练集和验证集,多次训练和验证模型,从而得到模型的平均性能指标。 交叉验证的步骤如下: 1. 将数据集划分为K个大小相等的子集,通常称为折(fold)。 2. 对于每个折,将其作为验证集,其余的折作为训练集。 3. 在每个训练集上训练模型,并在对应的验证集上进行评估。 4. 计算K次验证结果的平均值作为模型的性能指标。 交叉验证可以更准确地评估模型的性能,避免了单次划分数据集可能导致的偶然性结果。常见的交叉验证方法有K折交叉验证、留一交叉验证等。 混淆矩阵(Confusion Matrix)是一种用于衡量分类模型性能的矩阵。它以实际类别和预测类别为基础,将样本分为真正例(True Positive, TP)、真负例(True Negative, TN)、假正例(False Positive, FP)和假负例(False Negative, FN)四种情况。 混淆矩阵的形式如下: 预测为正例 预测为负例 实际为正例 TP FN 实际为负例 FP TN 混淆矩阵可以用于计算多个评估指标,如准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1值等,从而更全面地评估模型的分类性能。 ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估二分类模型性能的曲线。它以真正例率(True Positive Rate, TPR)为纵轴,假正例率(False Positive Rate, FPR)为横轴,绘制出模型在不同阈值下的性能。 ROC曲线的横轴表示模型的假正例率,纵轴表示模型的真正例率。曲线越靠近左上角,说明模型的性能越好。ROC曲线下的面积(Area Under Curve, AUC)可以用来衡量模型的整体性能,AUC值越大,模型性能越好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值