机器学习基础08-模型选择02-分类算法矩阵(基于Pima 数据集)

算法评估矩阵(Algorithm Evaluation Metrics)用于评估机器学习算法在特定任务上的性能。不同的任务可能会使用不同的评估矩阵,因为每个任务的优劣衡量标准都不同。

分类算法矩阵

分类问题或许是最常见的机器学习问题,并且有多种评估矩阵来评估
分类算法。以下几种用来评估分类算法的评估矩阵:
· 分类准确度。
· 对数损失函数(Logloss)。
· AUC图。
· 混淆矩阵。
· 分类报告(Classification Report)。

分类准确度

分类准确度就是算法自动分类正确的样本数 除以 所有的样本数得出的结果。

分类准确度 = 算法自动分类正确的样本数 / 所有的样本数

通常,准确度越高,分类器越好。这是分类算法中最常见,也最易被误用的评估参数。准确度确实是一个很好、很直观的评价指标,但是有时候准确度高并不代表算法就一定好。

比如对某个地区某天地震的预测,
假设有一堆的特征作为地震分类的属性,类别却只有两个(0:不发生地震,1:发生地震)。一个不加思考的分类器对每一个测试用例都将类别划分为 0,那它就可能达到 99%的准确度,但真的地震时,这个分类器却毫无察觉,这个分类器造成的损失是巨大的。为什么拥有 99%的准确度的分类器却不是我们想要的,因为数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的准确度,却忽视了需要关注的事实和现象。

代码如下:


import pandas as pd
from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score, ShuffleSplit

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集
n_splits = 10

# 随机数种子
seed = 7
# K折交叉验证,将数据分成10份,9份训练,1份测试,重复10次,取平均值,得到最终模型,评估模型
kfold = ShuffleSplit(n_splits=n_splits, random_state=seed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model = LogisticRegression(solver='lbfgs', max_iter=1000)
# 训练模型
result = cross_val_score(model, X, Y, cv=kfold)
# 记录方法结束时间
print("算法评估结果准确度:%.3f (%.3f)" % (result.mean(), result.std()))


运行结果:

算法评估结果准确度:0.782 (0.052)

对数损失函数

在逻辑回归的推导中,它假设样本服从伯努利分布(0~1分布),然后求得满足该分布的似然函数,再取对数、求极值等。而逻辑回归并没有求似然函数的极值,而是把极大化当作一种思想,进而推导出它的经验风险函数为:最小化负的似然函数

[max F(y,f(x))→min-F(y,f(x))]。

从损失函数的视角来看,它就成了对数(Log)损失函数了。对数损失函数越小,模型就越好,而且使损失函数尽量是一个凸函数,便于收敛计算。

示例代码:


import pandas as pd
from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score, ShuffleSplit

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集
n_splits = 10

# 随机数种子
seed = 7
# K折交叉验证,将数据分成10份,9份训练,1份测试,重复10次,取平均值,得到最终模型,评估模型
kfold = ShuffleSplit(n_splits=n_splits, random_state=seed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model = LogisticRegression(solver='lbfgs', max_iter=1000)

scoring = 'neg_log_loss'
# 训练模型
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 记录方法结束时间
print("neg_log_loss:%.3f (%.3f)" % (result.mean(), result.std()))



运行结果:

neg_log_loss:-0.477 (0.065)

AUC图

ROC AUC是用于评估二分类算法性能的指标。ROC曲线是以不同的分类阈值为基础绘制了真阳性率(True Positive Rate, TPR,也称为召回率)与假阳性率(False Positive Rate, FPR)之间的关系曲线。AUC是ROC曲线下的面积,取值范围在0到1之间。AUC越大表示模型的性能越好,AUC等于1时表示模型完美分类,AUC等于0.5时表示模型的分类能力与随机分类相当。

ROC和AUC是评价分类器的指标。ROC是受试者工作特征曲线 (Receiver Operating Characteristic Curve)的简写,又称为感受性曲线(Sensitivity Curve)。

得此名的原因在于曲线上各点反映相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。ROC是反映敏感性和特异性连续变量的综合指标,用构图法揭示敏感性和特异性的相互关系,通过将连续变量设定出多个不同的临界值计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线。

AUC是ROC曲线下的面积(Area Under ROC Curve)的简称,顾名思义,AUC的值就是处于ROC
Curve下方的那部分面积的大 小。

通常,AUC的值介于0.5到1.0之间,AUC的值越大,诊断准确性越
。在ROC曲线上,靠近坐标图左上方的点为敏感性和特异性均较高的临界值。

ROC AUC是用于评估二分类算法性能的指标。ROC曲线是以不同的分类阈值为基础绘制了真阳性率(True Positive Rate,
TPR,也称为召回率)与假阳性率(False Positive Rate,
FPR)之间的关系曲线。AUC是ROC曲线下的面积,取值范围在0到1之间。AUC越大表示模型的性能越好,AUC等于1时表示模型完美分类,AUC等于0.5时表示模型的分类能力与随机分类相当。

为了解释ROC的概念,让我们考虑一个二分类问题,即将实例分成正类(Positive)或负类(Negative)。对一个二分类问题来说,会出现四种情况:

  • 如果一个实例是正类并且也被预测成正类,即为真正类(True
    Positive);
  • 如果实例是负类却被预测成正类,称之为假正类(False
    Positive)。
  • 如果实例是负类也被预测成负类,称之为真负类(True Negative);
  • 如果实例为正类却被预测成负类,则为假负类(FalseNegative)。

列联表或混淆矩阵如下表所示,“1”代表正类,“0”代表负类。

在这里插入图片描述
基于该列联表,定义敏感性指标为:sensitivity=TP/(TP+FN)。敏感性指标又称为真正类率(True Positive Rate,TPR),计算的是分类器所识别出的正实例占所有正实例的比例。

另外,定义负正类率(False Positive Rate,FPR)的计算公式为:FPR=FP/(FP+TN),负正类率计算的是分类器错认为正类的负实例占所有负实例的比例。

定义特异性指标为:Specificity=TN/(FP+TN)=1-FPR。特异性指标又称为真负类率(True Negative Rate,TNR)。

代码如下:


import pandas as pd
from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score, ShuffleSplit

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集
n_splits = 10

# 随机数种子
seed = 7
# K折交叉验证,将数据分成10份,9份训练,1份测试,重复10次,取平均值,得到最终模型,评估模型
kfold = ShuffleSplit(n_splits=n_splits, random_state=seed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model = LogisticRegression(solver='lbfgs', max_iter=1000)

scoring = 'roc_auc'
# 训练模型
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
# 记录方法结束时间
print("roc_auc:%.3f (%.3f)" % (result.mean(), result.std()))



运行结果:

roc_auc:0.839 (0.054)

ROC AUC(Receiver Operating Characteristic Area Under the Curve)的评估结果为0.839,其中括号内的0.054表示标准差。

在给出的结果中,ROC AUC为0.839,说明模型的分类性能较好,它相对于随机分类有明显的优势。标准差为0.054表示这个评估结果在不同数据集或实验中可能会有一定的波动,但整体上来看,该模型的性能是比较稳定的。

值得注意的是,ROC AUC只适用于二分类问题,对于多类别分类问题,可以考虑使用一些其他的指标,如平均精确率均值(Mean Average Precision, mAP)等。

混淆矩阵

混淆矩阵(Cnfusion Matrix)主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。混淆矩阵是可视化工具,特别适用于监督学习,在无监督学习时一般叫作匹配矩阵。混淆矩阵的每列代表预测类别,每列的总数表示预测为该类别的数据的数目;每行代表数据的真实归属类别,每行的数据总数表示该类别的数据的数目。每列中的数值表示真实数据被预测为该类的数目。

如下表所示,有150个样本数据,这些数据分成 3 类,每类 50 个。
分类结束后得到的混淆矩阵,每行之和为50,表示50个样本

第一行说明类1的50个样本有43个分类正确,5个错分为类2,2个错分为类3。

在这里插入图片描述
代码示例:

  1. 使用Pandas库读取糖尿病数据集,并将数据转换为数组形式。
  2. 将特征和标签分别赋值给X和Y。
  3. 使用train_test_split函数将数据集分割为训练集和测试集,其中测试集占33%。
  4. 创建一个逻辑回归模型,并使用训练集拟合模型。
  5. 使用模型对测试集进行预测,并计算混淆矩阵。
  6. 输出混淆矩阵的DataFrame形式。

代码如下:


import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

from sklearn.model_selection import cross_val_score, ShuffleSplit, train_test_split

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集

test_size = 0.33
# 随机数种子
seed = 7
# 分割数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model = LogisticRegression(solver='lbfgs', max_iter=1000)

# 训练模型
model.fit(X_train, Y_train)

# 评估模型
predictions = model.predict(X_test)

# 混淆矩阵
matrix = confusion_matrix(Y_test, predictions)

classes = ['0', '1']

# 创建混淆矩阵
dataframe = pd.DataFrame(matrix, index=classes, columns=classes)
# 绘制热力图
print(dataframe)

运行结果:

     0   1
0  142  20
1   34  58

根据输出的混淆矩阵,可以解释如下:

  1. 阴性(类别0)的样本中,模型正确地预测了142个样本,但错误地将20个样本预测为了阳性(假阳性)。
  2. 阳性(类别1)的样本中,模型正确地预测了58个样本,但错误地将34个样本预测为了阴性(假阴性)。

通过混淆矩阵,我们可以计算出一系列分类算法的评估指标:

精确率(Precision):对于预测为阳性(类别1)的样本中,有58个样本是真正的阳性,所以Precision为58 / (58 + 20) ≈ 0.7436。

召回率(Recall):对于实际为阳性(类别1)的样本中,有58个样本被正确地预测为阳性,所以Recall为58 / (58 + 34) ≈ 0.6304。

F1分数(F1-Score):综合考虑Precision和Recall的调和平均值,F1-Score = 2 * (Precision * Recall) / (Precision + Recall) ≈ 0.6832。

准确率(Accuracy):计算预测正确的样本数占总样本数的比例,即 (142 + 58) / (142 + 20 + 34 + 58) ≈ 0.7765。

这些评估指标能够帮助我们更全面地了解分类算法在这个特定任务上的性能。根据实际需求,可以选择合适的评估指标来衡量模型的性能。

分类报告

分类报告(classification_report)是一个包含精确率、召回率、F1分数等指标的报告,用于评估分类模型的性能。通常,它会显示每个类别的指标,并在最后提供一个加权平均值或宏平均值。

在 scikit-learn 中提供了一个非常方便的工具,可以给出对分类问题的评估报告,Classification_report()方法能够给出精确率(precision)、召回率(recall)、F1值(F1-score)和样本数目(support)。在这里简单地介绍一下三个指标数据:精确率、召回率、F1值。

在介绍这三个指标数据之前,我们先定义TP、FN、FP、TN四种分类
情况,我们借助下表来说明。

在这里插入图片描述

精确率的 公式P=TP/(TP+FP),计算的是所有被检索到的项目中应该被检索到的项目占的比例。

召回率的公式R=TP/(TP+FN),计算的是所有检索到的项目占所有应该检索到的项目的比例。

F1值就是精确率和召回率的调和均值,也就是2F1=P+R

代码如下:


import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

from sklearn.model_selection import train_test_split

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集

test_size = 0.33
# 随机数种子
seed = 4
# 分割数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
# 逻辑回归,使用lbfgs求解器,最大迭代次数1000,默认是100,如果模型没有收敛,可以适当增大
model = LogisticRegression(solver='lbfgs', max_iter=1000)

# 训练模型
model.fit(X_train, Y_train)

# 评估模型
predictions = model.predict(X_test)

report = classification_report(Y_test, predictions)

print(report)


运行结果:

              precision    recall  f1-score   support

         0.0       0.84      0.87      0.86       171
         1.0       0.71      0.66      0.69        83

    accuracy                           0.80       254
   macro avg       0.78      0.77      0.77       254
weighted avg       0.80      0.80      0.80       254

根据给出的分类报告,逻辑回归模型在测试集上的性能如下:

  • 对于类别0(阴性):精确率(Precision)为0.84,召回率(Recall)为0.87,F1分数为0.86。说明模型在预测阴性样本时,有较高的精确性和召回率,F1分数也较高。

  • 对于类别1(阳性):精确率为0.71,召回率为0.66,F1分数为0.69。说明模型在预测阳性样本时,精确率和召回率相对较低,F1分数也较低。

  • accuracy(准确率)为0.80,表示模型在测试集上的整体准确率为80%。

  • macro avg(宏平均值)是所有类别的平均值,精确率为0.78,召回率为0.77,F1分数为0.77。

  • weighted avg(加权平均值)是根据各类别样本数量加权的平均值,精确率为0.80,召回率为0.80,F1分数为0.80。

综合来看,该逻辑回归模型在阴性样本上表现较好,但在阳性样本上表现相对较差。整体上,模型的准确率为80%,在不同类别上的F1分数在0.69到0.86之间。根据具体任务的要求,可以根据分类报告中的指标来调整模型或优化特征,以改善模型的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/58753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法心得】C++map用不着map.find(arr[j])!=map.end();js的map是map不是哈希;编译器选GNU

https://leetcode.com/problems/count-of-range-sum/ https://vjudge.csgrandeur.cn/problem/CodeForces-459D 这两题都是线段树,很明显的单点修改区间查询 leetcode那题我觉得map用hashmap就行,但是好像js里没有hashmap,那就 Map() 也行吧…

vue、uniapp直传阿里云文档

前端实现文件上传到oss(阿里云)适用于vue、react、uni-app,获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云,保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

SpringCloudAlibaba之Sentinel(一)流控篇

前言: 为什么使用Sentinel,这是一个高可用组件,为了使我们的微服务高可用而生 我们的服务会因为什么被打垮? 一,流量激增 缓存未预热,线程池被占满 ,无法响应 二,被其他服务拖…

阿里云容器服务助力极氪荣获 FinOps 先锋实践者

作者:海迩 可信云评估是中国信息通信研究院下属的云计算服务和软件的专业评估体系,自 2013 年起历经十年发展,可信云服务评估体系已日臻成熟,成为政府支撑、行业规范、用户选型的重要参考。 2022 年 5 月国务院国资委制定印发《…

Linux 快速创建桌面图标

在安装 tar.gz 这类型压缩文件时,通常启动文件是.sh文件。文章主要记录快速添加到桌面图标。 1、解压 tar -zxvf XXX.tar.gz 2、创建桌面图标文件 touch XXX.desktop 3、文件中配置 [Desktop Entry] NameXXX CommentZZZ Exec/软件可执行文件所在目录/可执行文…

SpringBoot核心内容梳理

1.SpringBoot是什么? Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它简化了Spring应用程序的创建和开发过程,使开发人员能够更快速地创建独立的、生产就绪的Spring应用程序。它采用了“约定优于配置”的原则,尽可能地减少开发人员需要进…

为代码生成一个良好可读的API文档-Doxygen简单实战

需求?为什么要有API文档 在代码开发过程中,我们会发现有这样的情况,其他团队的代码和自己团队的代码相异甚大,如果没有一个统一规范的文档来对接,会造成很多交流沟通上的不便,但我们又不想浪费时间去边写说…

C++STL——map/multimap容器详解

纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬文章目录 一.对组(pair)二.map/multimap基本概念三.map容器常用操作①map构造函数②map迭代器获取③map赋值操作④map大小操作⑤map…

转录组下游分析 | 懒人分析推荐

写在前面 今天在GitHub看到一个博主写的RNASeqTool的ShinApp,里面包含了PCA、DESeq2、volcano、NormEnrich、GSEA、Gene tred analysis和WGCNA分析。使用后还是很方便的,就此推荐给大家。感兴趣可以自己操作即可。 GitHub网址 https://github.com/Cha…

C++、python双语言弹窗教程与对比

Messagebox弹窗 MessageBox指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。 例子: 本文介绍了用C、Pytho…

flask服务生成证书文件,采用https访问,开启用户密码验证

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3072开启用户密码验证 auth.verify_password def verify_password(username, password):if username abcdefg and password 1234546:return usernameapp.route(/post_request, methods[POST…

使用Canvas裁剪图片

使用Canvas裁剪图片 概述 在Web开发中,我们经常需要对图片进行裁剪,以满足不同尺寸需求或者实现图片的局部展示。本篇博客将带您深入了解如何使用Canvas技术来实现图片的裁剪功能。我们将通过一个实例来演示如何利用Canvas绘制图片,并通过蒙…

【LeetCode】647. 回文子串

题目链接 文章目录 1. 思路讲解1.1 方法选择1.2 dp表的创建1.3 状态转移方程1.4 填表顺序 2. 代码实现 1. 思路讲解 1.1 方法选择 这道题我们采用动态规划的解法,倒不是动态规划的解法对于这道题有多好,它并不是最优解。但是,这道题的动态…

devops-发布vue前端项目

回到目录 将使用jenkinsk8s发布前端项目 1 环境准备 node环境 在部署jenkins的服务器上搭建node环境 node版本 # 1.拉取 https://nodejs.org/download/release/v20.4.0/node-v20.4.0-linux-x64.tar.gz# 2.解压到/usr/local目录下 sudo tar xf v20.4.0.tar.gz -C /usr/loc…

正则表达式的应用及示例解析

正则表达式(Regular Expression,简称Regex)是由特殊字符组成的模式字符串,用于匹配和搜索文本中的特定模式。它在数据处理、文本搜索和替换等方面广泛应用。本文将介绍正则表达式的基本语法,并提供常见的正则表达式示例…

关于数据权限的设计

在项目实际开发中我们不光要控制一个用户能访问哪些资源,还需要控制用户只能访问资源中的某部分数据。 控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC,但是控制用户只能访问某部分资源(即我们常说的数据权限)使用R…

iTOP-RK3588开发板Ubuntu 系统交叉编译 Qt 工程-命令行交叉编译

使用源码 rk3588_linux/buildroot/output/rockchip_rk3588/host/bin/qmake 交叉编译 QT 工程。 最后烧写编译好的 buildroot 镜像,将编译好的 QT 工程可执行程序在 buildroot 系统上运行。 交叉编译 QT 工程如下所示,首先进入 QLed 的工程目录下。 然后…

什么样的跨网文件安全交换系统 可实现安全便捷的文件摆渡?

进入互联网时代,网络的运算和数据管理能力助力各个行业高速发展,但同样带来了一些网络安全隐患,网络攻击、数据窃取、敏感信息泄露等问题。为此,我国出台了系列政策来全面提升银各行业系统网络安全整体防护水平,其中“…

机器学习笔记之优化算法(四)线搜索方法(步长角度;非精确搜索)

机器学习笔记之优化算法——线搜索方法[步长角度,非精确搜索] 引言回顾:精确搜索步长及其弊端非精确搜索近似求解最优步长的条件反例论述 引言 上一节介绍了从精确搜索的步长角度观察了线搜索方法,本节将从非精确搜索的步长角度重新观察线搜…

纯靠TikTok解压玩具,21岁小伙成功登顶福布斯!

APA的报告说,每年有四千万左右的大人也在受到焦虑的困扰。看来,在Z世代中有90%的人因压力大出现心理或身体症状的现象并不稀奇了。 近几年越来越严重,大家都在四处找寻解压的良方。TikTok上的“#decompression”(减压&#xff09…