首页 > 其他分享 >机器学习分类模型评估

机器学习分类模型评估

时间:2024-04-15 20:44:18浏览次数:23  
标签:plt 机器 模型 ROC TP 负例 曲线 评估

1.分类模型介绍
分类模型是机器学习的一种类型,它的任务是通过学习样本的特征来预测样本的类别。

分类模型通常用于那些输出变量是分类或者离散值的任务,例如,判断一封邮件是垃圾邮件还是非垃圾邮件,或者预测一个患者是否患有某种疾病。在训练过程中,分类模型会从标记好的训练数据中学习到如何判断一个样本属于哪个类别,然后在面对新的数据时,根据学习到的知识进行预测。
2.为什么要进行分类模型的评估
评估分类模型的性能非常重要,因为它能帮助我们了解模型的表现如何,以及模型在实际应用中的可能表现。通过使用不同的评估指标,可以从不同的角度理解模型的性能。

作为使用场景最为广泛的机器学习模型,其评估指标也随着使用场景的拓展而不断丰富,例如,可以通过查看模型的准确率来了解模型正确预测的比例,还有精确度、召回率、F1分数、受试者特征曲线(ROC-AUC)等,不同评估指标有对应的不同的计算方法,同时也对应着不同的使用场景。
3.分类模型评估指标
准确率(Accuracy)
查准率(Precision)
召回率(Recall)
F1分数(F1-Score)
P-R曲线、ROC曲线
1.准确率准确率(Accuracy)
准确率:对于给定的测试数据集,分类器正确分类的样本数与总样本数之比,其计算公式为:准确度(Accuracy)= 真正例(TP)+真负例(TN)/真正例(TP)+假正例(FP)+真负例(TN)+假负例(FN)
​2.查准率(Precision)
查准率,又称为精确率,指的是模型预测为正的样本中实际情况也为正的概率,公式如下:
精确度(Precision)=
真正例(TP)/真正例(TP)+假正例(FP)
3. 召回率
召回率,又叫做查全率,指的是实际为正的样本中模型预测为正的概率,公式如下:
召回率= 真正例数/真正例数 + 假负例数
4.F1分数(F1-Score)
可以看出,召回率和查准度是一对相对的概念,它们在关注正类样本的识别过程中,各有侧重点。召回率的目标是尽可能地将正类样本识别出来,而查准率则追求在每次对正类样本的判断都能获得正确的结果。
然而,在大多数情况下,我们的期望是获得一个在两者之间实现“均衡”的模型评估指标,既不希望模型过于冒进,也不希望模型过于保守。特别是对于偏斜的样本,不仅要求模型能够准确地识别出正类样本,同时也希望能尽可能地减小对负类样本准确率的牺牲。因此,在这种情况下,可以考虑使用召回率和查准率的调和平均数作为模型评估指标,这就是F1-Score,其常用的一种计算公式为
F1−Score= 2⋅TP/2⋅TP+FP+FN
其中,P 为查准率,R 为召回率。
F1-Score是综合考虑使用召回率和查准率的指标,F1-Score越高,模型分类效果越好。
​P-R曲线、ROC曲线
1.了解ROC曲线:
ROC曲线就有四个关键的数据

与准确率一样需要用到的 TP 表示真正例,TN 表示真负例,FP 表示假正例,FN 表示假负例

1.FPR
曲线的x轴,表示假阳性率,计算公式为 :FPR=FP/(FP+TN)
2.TPR
曲线的纵坐标,表示真阳性率,也称为召回率,计算公式为 :TPR=TP/(TP+FN)
3. AUC
ROC曲线下方的面积被称为AUC,也就是ROC曲线与x轴围成的面积。AUC的取值范围在0到1之间,AUC越大,越接近1,表示模型性能越好,也就是是相同假阳性下对应的真阳性率标记高,预测的就更准确。那ROC曲线通常会越靠近左上角,AUC值就越大。

4.阈值
阈值代表了分类器将样本判定为正例的概率阈值。阈值决定了分类器如何将样本判定为正例或负例。当样本的预测概率高于阈值时,分类器将其判定为正例,否则判定为负例。

阈值的取值在[0, 1]之间,每个阈值代表的是ROC上的一个点,也就我们在绘制ROC曲线的时候需要选取多个阈值来描绘多个点,用平滑的曲线将这些点连接起来就得到了ROC曲线。

我们拿鸢尾花来举例一下,假设我们的阈值取值为0.3,我们拿本实验的knn算法来解释一下,鸢尾花有三种类别setosa,versicolor和virginica,我们选取测试集中的一个点,用knn算法求得训练集中与该点最近的k个点,这k个点都属于这三种类别,每种类别的预测概率就为该类别在这k个中的占比,这边假设setosa为0.2,versicolor为0.4和virginica为0.4,那么

TP是被正确分类为正例的versicolor和virginica样本数。
FN是实际为正例但被错误分类为负例的versicolor和virginica样本数。
FP是实际为负例但被错误分类为正例的setosa样本数。
TN是被正确分类为负例的setosa样本数。
通过这个我们就可以得到FPR和TPR,然后我们就可以得到ROC上的一个点,把这些点平滑的连接起来就是ROC曲线,不同的k值得到的曲线也不相同。

2.绘制ROC曲线
1.函数解释
我们的函数需要四个变量,y_test 是测试集的真实标签,y_pred_probs 是预测的概率值,k 值,classes 是类别的列表。

我们用y_test_bin记录真实标签进行二值化处理的结果,将其转换为二进制形式。也就是说我们把我们的标签都标号了,便于遍历。
roc_curve(y_test_bin[:, i], y_pred_probs[:, i])中第一个变量是真实标签,第二个是预测概率,得到的是图上的一个点。
for循环中对于每个类别,计算对应的假正例率、真正例率以及ROC曲线下面积。我们利用roc_curve函数来得到该类别在不同阈值下的多个点。用roc_auc[i] = auc(fpr[i], tpr[i])计算该类别的AUC值,再把这些点连接起来得到该类别下的ROC曲线。
使用了 plt.plot 函数来绘制 ROC 曲线上的点,并为每条线条指定了不同的类别标签和颜色。我们没有显式地为每个类别指定颜色,因此 Matplotlib 会自动选择合适颜色。
2.绘制的ROC图像
可以看到我的曲线都不够平滑,那是因为我的数据集太小,预测的结果比较单一,因此得到的点的分布就比较简单。

我们还可以看到当我们的k值取19的时候,我们绘制的ROC曲线就是TPR=1这一条直线。那是因为在鸢尾花数据集中,如果 k 值足够大,KNN 算法会考虑到所有的训练样本,因此最终分类结果将会非常准确。这会导致 ROC 曲线上的所有点都位于左上角,形成一条直线,使得 AUC 的值等于 1

roc函数代码`def plot_roc_curve(y_test, y_pred_probs, k,classes):
# Binarize the output
y_test_bin = label_binarize(y_test, classes=classes)
n_classes = y_test_bin.shape[1]

plt.figure()
fpr = dict()
tpr = dict()
roc_auc = dict()

# Compute ROC curve and ROC area for each class
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test_bin[:, i], y_pred_probs[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

    plt.plot(fpr[i], tpr[i], label=f'类别Class {i} (AUC = {roc_auc[i]:.2f})')

plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.title(f'k值为(k={k})的ROC曲线 ')
plt.legend(loc="lower right")
plt.show()`



标签:plt,机器,模型,ROC,TP,负例,曲线,评估
From: https://www.cnblogs.com/ls111/p/18136873

相关文章

  • Amazon SageMaker: 拓展机器学习边界,塑造未来创新趋势
    授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区,知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。近期在re:Invent2023大会上,亚马逊云科技发布了一组引人注目的新功能,重点强调了生成式人工智能在塑造人工智能未来......
  • 对象模型 - this
    对象模型-this通过一个对象来调用一个函数,那么对象的地址就是this虚函数的模板方法使用方式templatemethod示例代码:#pragma#ifndef__THIS_TEMPLATE_MODEL__#define__THIS_TEMPLATE_MODEL__​classCDocument{public:virtualvoidSerialize();voidOnFileOpen......
  • openGauss DB4AI-Query-模型训练和推断
    DB4AI-Query:模型训练和推断openGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据......
  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • openGauss DB4AI-Query-模型训练和推断
    DB4AI-Query:模型训练和推断openGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据......
  • Pytorch分类模型的训练框架
    Pytorch分类模型的训练框架PhotoDataset数据集是自己定义的数据集,数据集存放方式为:----image文件夹--------0文件夹--------------img1.jpg--------------img2.jpg--------1文件夹--------------img1.jpg--------------img2.jpg....如果是cpu训练的话,就把代码中的.cu......
  • 爆火 AI 硬件遭差评,Ai Pin 上市即翻车;Grok 推出首个多模态模型丨 RTE 开发者日报 Vol.
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • LLM学习(1)——大模型简介
    1.1.1LLM的概念为了区分不同参数尺度的语言模型,研究界为大规模的PLM(例如,包含数百亿或数千亿个参数)创造了术语“大型语言模型”LLM。1.1.2LLM的能力与缩放定律LLM的能力涌现能力LLMs被正式定义为“在小型模型中不存在但在大型模型中出现的能力”,这是LLMs区别于以往PLM的最突......
  • 人工智能大模型的分类-来自智谱清言
    人工智能大模型可以根据不同的维度进行分类,以下是一些主要的分类方式:按照模型架构分类:深度神经网络(DNNs):包括多层感知机(MLPs)、卷积神经网络(CNNs)、循环神经网络(RNNs)、长短期记忆网络(LSTMs)和门控循环单元(GRUs)。Transformer模型:如BERT、GPT系列、Transformer-XL等,这些模型主要基......
  • 人工智能大模型的训练阶段和使用方式来分类
    是的,人工智能大模型也可以根据它们的训练阶段和使用方式来分类。以下是根据模型的阶段性来区分的一些类别:预训练模型:这些模型在大规模数据集上进行训练,以学习通用的特征表示。预训练可以是无监督的(如使用自编码或生成对抗网络),也可以是有监督的(如在大型标注数据集上进行训练)。......