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.pswp.cn/web/75653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75653.shtml
英文地址,請注明出處:http://en.pswp.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…