Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)

  • 问题
  • 模板
  • 解题思路
    • 1. 导入必要的库
    • 2. 加载数据
    • 3. 划分训练集和测试集
    • 4. 数据预处理
    • 5. 定义算法及其参数
    • 6. 存储算法和对应指标
    • 7. 训练模型并计算指标
    • 8. 找出最佳算法
    • 9. 输出结果
  • 代码

问题

我们建议您使用 4 种不同的算法来解决糖尿病数据集上的二元分类问题:

Decision Tree (1) Logistic Regression (2) KNN (3) SVC (4)
您的任务是找到具有最佳 ROC AUC 分数和 PR AUC 分数的算法。作为答案,请指出数字 a b,其中 a 是 ROC AUC 分数方面的最佳算法,b 是 PR AUC 分数方面的最佳算法。

例如,答案 43 将被解释如下:算法 4(SVM)在 roc_auc_score 方面是最好的,算法 3(KNN)在 pr_auc_score 方面是最好的。

选择默认设置作为参数。对于 KNN,选择 k=5。将随机状态设置为 42。分成训练和测试,参数 test_size=0.3。

不要忘记对数据进行额外的预处理,使用 StandardScaler 将其调整到单一比例。

注意

  1. 请注意,StandardScaler 可能会影响算法的结果。因此,我们建议使用它。

  2. 当我们将数据分成训练和测试时,我们必须明白所有算法都必须仅在训练上进行训练。训练期间不使用测试。而且,在现实生活中我们对测试根本就一无所知。因此,StandardScaler 应该仅在 X_train 上进行训练,并且只应对 X_test 进行变换(而不是 fit_transform)。

模板

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
"""
TODO: make additional imports here
TODO:在此处进行额外导入
"""data = fetch_openml(data_id=42608)
X, y = data['data'].drop(columns='Outcome').values, data['data']['Outcome'].astype(int).valuesX_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42
)"""
In the following part of code specify algorithms with their own parameters by yourself
在下面的代码部分中,您可以自己指定具有自己参数的算法
"""
tree = DecisionTreeClassifier()
lr = LogisticRegression()
knn = KNeighborsClassifier()
svm = SVC(probability=True)"""
TODO: fit estimators and find best one
TODO:拟合估算器并找到最佳估算器
"""

解题思路

1. 导入必要的库

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScalerfrom sklearn.metrics import roc_auc_score, auc
from sklearn.metrics import precision_recall_curve
import numpy as np

这些库的作用分别为:

  • fetch_openml:从 OpenML 平台加载数据集。
  • train_test_split:把数据集划分成训练集和测试集。
  • KNeighborsClassifierLogisticRegressionDecisionTreeClassifierSVC:四种不同的机器学习分类算法。
  • StandardScaler:对数据进行标准化处理。
  • roc_auc_scoreaucprecision_recall_curve:用于计算评估指标。
  • numpy:用于数值计算。

2. 加载数据

data = fetch_openml(data_id=42608)
X, y = data['data'].drop(columns='Outcome').values, data['data']['Outcome'].astype(int).values
  • 借助 fetch_openml 加载 ID 为 42608 的数据集,把特征数据存于 X 中,目标变量存于 y 中,同时将目标变量转换为整数类型。
  • 特征数据 X
    • data['data'] 取出的是数据集的特征数据部分,这是一个 pandasDataFrame 对象。
    • drop(columns='Outcome') 会从特征数据中移除名为 Outcome 的列,因为 Outcome 通常代表目标变量。
    • .valuesDataFrame 转换为 NumPy 数组,这样更适合用于机器学习模型的输入。
  • 目标变量 y
    • data['data']['Outcome'] 提取出 Outcome 列的数据,它同样是一个 pandasSeries 对象。
    • .astype(int) 将目标变量的数据类型转换为整数类型。
    • .valuesSeries 转换为 NumPy 数组。

3. 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42
)

使用 train_test_split 函数按 7:3 的比例将数据集划分为训练集和测试集,并且设置随机种子为 42 以保证结果的可重复性。

4. 数据预处理

scaler = StandardScaler() 
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
  • 利用 StandardScaler 对训练集和测试集的数据进行标准化处理,保证所有特征具有相同的尺度。(StandardScaler 是 sklearn 库中用于数据标准化的类,它可以将数据转换为均值为 0,标准差为 1 的标准正态分布。)
  • fit_transform 方法结合了 fittransform 两个步骤:
    • fit 方法:计算训练集的均值和标准差。具体来说,它会遍历训练集中的每个特征,计算其均值和标准差,这些统计信息会被存储在 scaler 对象中,后续用于对测试集进行转换。
    • transform 方法:使用计算得到的均值和标准差对训练集进行标准化处理。标准化的公式为:
      x s c a l e d = x − μ σ x_{scaled} = \frac{x - \mu}{\sigma} xscaled=σxμ
      其中, x x x 是原始数据, μ \mu μ 是均值, σ \sigma σ 是标准差。经过标准化处理后,每个特征的均值变为 0,标准差变为 1。
  • scaler.transform(X_test):这里只使用了 transform 方法,而没有再次使用 fit 方法。这是因为在机器学习中,我们必须使用训练集的统计信息(均值和标准差)来对测试集进行标准化处理,以保证训练集和测试集具有相同的尺度。如果对测试集也使用 fit_transform 方法,那么 scaler 会重新计算测试集的均值和标准差,这会导致训练集和测试集的尺度不一致,从而影响模型的性能。

5. 定义算法及其参数

tree = DecisionTreeClassifier(random_state=42)
lr = LogisticRegression(random_state=42, max_iter=1000)
knn = KNeighborsClassifier(n_neighbors=5)
svm = SVC(probability=True, random_state=42)

定义了四种分类算法,分别是决策树、逻辑回归、K 近邻和支持向量机,同时设置了相应的参数。

6. 存储算法和对应指标

algorithms = [tree, lr, knn, svm]
roc_aucs = []
pr_aucs = []

把四种算法存于 algorithms 列表中,并且创建两个空列表 roc_aucspr_aucs 用于存储每种算法的 ROC AUC 和 PR AUC 指标。

7. 训练模型并计算指标

for algorithm in algorithms:algorithm.fit(X_train, y_train)y_score = algorithm.predict_proba(X_test)[:, 1]# 计算ROC AUCroc_auc = roc_auc_score(y_test, y_score)roc_aucs.append(roc_auc)# 计算PR AUCprecision, recall, _ = precision_recall_curve(y_test, y_score)pr_auc = auc(recall, precision)pr_aucs.append(pr_auc)
  • 通过循环依次对每种算法进行训练,接着预测测试集的概率得分,计算 ROC AUC 和 PR AUC 指标,并将结果分别存储在 roc_aucspr_aucs 列表中。
  • algorithm.fit(X_train, y_train):对当前算法进行训练,使用训练集的特征数据 X_train 和对应的目标变量 y_train 来学习特征和目标之间的关系。
  • algorithm.predict_proba(X_test)[:, 1]:使用训练好的模型对测试集 X_test 进行预测,得到每个样本属于正类的概率。[:, 1] 表示只取属于正类的概率值

8. 找出最佳算法

best_roc_algorithm = np.argmax(roc_aucs) + 1
best_pr_algorithm = np.argmax(pr_aucs) + 1

运用 np.argmax 函数找出 roc_aucspr_aucs 列表中最大值的索引,加 1 后得到对应的算法编号。

9. 输出结果

result = int(str(best_roc_algorithm) + str(best_pr_algorithm))
print(result)

把最佳 ROC AUC 算法编号和最佳 PR AUC 算法编号拼接成一个字符串,再转换为整数后输出。

代码

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScalerfrom sklearn.metrics import roc_auc_score, auc
from sklearn.metrics import precision_recall_curve
import numpy as np# 加载数据
data = fetch_openml(data_id=42608)
X, y = data['data'].drop(columns='Outcome').values, data['data']['Outcome'].astype(int).values# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42
)# 数据预处理
scaler = StandardScaler() # 对数据进行标准化处理,确保所有特征具有相同的尺度。
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 定义算法及其参数
tree = DecisionTreeClassifier(random_state=42)
lr = LogisticRegression(random_state=42, max_iter=1000)
knn = KNeighborsClassifier(n_neighbors=5)
svm = SVC(probability=True, random_state=42)# 存储算法和对应指标
algorithms = [tree, lr, knn, svm]
roc_aucs = []
pr_aucs = []# 训练模型并计算指标
for algorithm in algorithms:algorithm.fit(X_train, y_train)y_score = algorithm.predict_proba(X_test)[:, 1]# 计算ROC AUCroc_auc = roc_auc_score(y_test, y_score)roc_aucs.append(roc_auc)# 计算PR AUCprecision, recall, _ = precision_recall_curve(y_test, y_score)pr_auc = auc(recall, precision)pr_aucs.append(pr_auc)# 找出最佳算法
best_roc_algorithm = np.argmax(roc_aucs) + 1
best_pr_algorithm = np.argmax(pr_aucs) + 1# 输出结果
result = int(str(best_roc_algorithm) + str(best_pr_algorithm))
print(result)

输出:21

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPU(中央处理器)

一、CPU的定义与核心作用 CPU 是计算机的核心部件,负责 解释并执行指令、协调各硬件资源 以及 完成数据处理,其性能直接影响计算机的整体效率。 核心功能: 从内存中读取指令并译码。执行算术逻辑运算。控制数据在寄存器、内存和I/O设备间的…

上层 Makefile 控制下层 Makefile 的方法

在复杂的项目中,通常会将项目划分为多个模块或子项目,每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例,实现上层 Makefile 对下层 Makefile 的控制。 直接调用&#xff1…

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…

使用python获取电脑硬盘信息

import psutil# 获取硬盘信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"设备: {partition.device}")print(f"挂载点: {partition.mountpoint}")print(f"文件系统类型: {partitio…

HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一种数据库查询优化技术,通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况,因为它可以在索引扫描阶段就排除不符合全部条件的数据行,而不是将所有可能匹配的记录加载到服务器层再进行…

idea在线离线安装插件教程

概述 对于小白来说,刚使用idea时,还有很多不懂的地方,这里,简单介绍下如何安装插件。让小白能容易上手全盘idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安装 3.1、在线安装 输入想搜索的内容&#x…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中,内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新,深入剖析消防体系内部管理的痛点,以自主研发的消防一体化安全管控平台,为行业发展提供了创…

ES6学习03-字符串扩展(unicode、for...of、字符串模板)和新方法()

一、字符串扩展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.

探索Streamlit在测试领域的高效应用:文档读取与大模型用例生成的完美前奏

大模型用例生成前置工作之文档读取——构建你的自动化测试基础 在群友的极力推荐下,开始了streamlit的学习之旅。本文将介绍如何使用Streamlit开发一个多功能文档处理工具,支持读取、预览、格式转换和导出多种测试相关文档(YAML、JSON、DOCX…

flutter 桌面应用之窗口自定义

在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为(大小/位置)✅(基本…

Cyber Weekly #51

赛博新闻 1、英伟达开源新模型,性能直逼DeepSeek-R1 本周,英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型,该模型拥有2530亿参数,在多项基准测试中展现出与6710亿参数的…

【JS】关于原型/原型链

本文会讲解什么是原型,什么是原型链,以及查找原型的方法,最后会实现一个函数:判断某对象是否有某属性。 定义 原型:函数都有prototype属性,称作原型/原型对象 原型可以放一些方法和属性,共享…

deskflow使用教程:一个可以让两台电脑鼠标键盘截图剪贴板共同使用的开源项目

首先去开源网站下载:Release v1.21.2 deskflow/deskflow 两台电脑都要下载这个文件 下载好后直接打开找到你想要的exe desflow.exe 然后你打开他,将两台电脑的TLS都关掉 下面步骤两台电脑都要完成: 电脑点开edit-》preferences 把这个取…

啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!

一、啥是Spring,为啥选择它 我们平常说的Spring指的是Spring全家桶,我们为什么要选择Spring,看看官方的话: 意思就是:用这个东西,又快又好又安全,反正就是好处全占了,所以我们选择它…

正向代理 vs 反向代理:核心区别与应用场景详解

目录 代理服务器是什么? 正向代理(Forward Proxy)详解 工作原理 典型应用场景 优缺点分析 反向代理(Reverse Proxy)详解 工作原理 典型应用场景 优缺点分析 正向代理与反向代理的核心区别 对比表格 架构差异…

Matlab学习笔记五十:循环语句和条件语句的用法

1.说明 循环语句:for…end,while…end 条件语句:if…end,switch…case…end 其中if语句语法还可以是:for…else…end,for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…

容器初始化Spring Boot项目原理,即web项目(war)包涉及相关类对比详解

以下是关于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的对比详解及总结表格: 1. 核心对比详解 (1) SpringBootServletInitializer 作用: S…

Linux 系统中打包与压缩

以下是 Linux 系统中 打包与压缩 的核心操作指南,涵盖常用命令、格式对比及典型场景应用: 一、核心概念 打包(Archiving) 将多个文件或目录合并为一个文件(如 .tar),不改变文件体积。常用工具&a…

计算机组成原理(哈工大,会持续更新)

文章目录 一 计算机组成概述1.1计算机系统简介 一 计算机组成概述 1.1计算机系统简介 计算机软硬件的概念 计算机系统包含两个部分一个部分为硬件,另一个部分为软件 硬件:硬件包括我们能直观看到的东西,也就是我们计算机的实体&#xff0…