偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

機(jī)器學(xué)習(xí)實(shí)戰(zhàn):糖尿病預(yù)測(cè)及可視化分析

人工智能 機(jī)器學(xué)習(xí)
在本文中,我們將深入探討一個(gè)專注于預(yù)測(cè)患者糖尿病的機(jī)器學(xué)習(xí)項(xiàng)目。該項(xiàng)目的主要目標(biāo)是利用患者健康指標(biāo)準(zhǔn)確預(yù)測(cè)罹患糖尿病的可能性,從而促進(jìn)早期發(fā)現(xiàn)并改善患者預(yù)后。

你一生中可能已經(jīng)多次聽說過糖尿病。它如此普遍地流行。根據(jù)國際糖尿病聯(lián)合會(huì)的數(shù)據(jù),2024年有超過340萬人死于糖尿病。這相當(dāng)于全球各類死亡人數(shù)的9.3%。2024年,20-79歲成年人糖尿病患者最多的國家是中國、印度和美國。世界衛(wèi)生組織(WHO)進(jìn)一步指出,這種嚴(yán)重的疾病是2021年女性死亡的主要原因之一(具體而言,位列第八)。

那么,糖尿病到底是什么呢?糖尿病并非像常見的誤區(qū)所說的那樣,只是吃太多糖或碳水化合物而引起的疾病。

糖尿病是一種嚴(yán)重的慢性疾病,當(dāng)人體無法產(chǎn)生足夠的胰島素或無法有效利用已產(chǎn)生的胰島素時(shí),就會(huì)引發(fā)血糖升高。糖尿病的主要類型包括1型糖尿病、2型糖尿病和妊娠期糖尿病。1型糖尿病是一種自身免疫性疾病,會(huì)導(dǎo)致胰腺中胰島素分泌細(xì)胞的破壞,而2型糖尿病主要與胰島素抵抗有關(guān)。妊娠期糖尿病發(fā)生在懷孕期間,通常在分娩后消退。

在本文中,我們將深入探討一個(gè)專注于預(yù)測(cè)患者糖尿病的機(jī)器學(xué)習(xí)項(xiàng)目。該項(xiàng)目的主要目標(biāo)是利用患者健康指標(biāo)準(zhǔn)確預(yù)測(cè)罹患糖尿病的可能性,從而促進(jìn)早期發(fā)現(xiàn)并改善患者預(yù)后。

我們?cè)趫?zhí)行此項(xiàng)目時(shí)采取的步驟如下:

  1. 理解數(shù)據(jù)
  2. 收集數(shù)據(jù)
  3. 數(shù)據(jù)清洗和驗(yàn)證
  4. 探索性數(shù)據(jù)分析
  5. 特征預(yù)處理
  6. 模型訓(xùn)練
  7. 模型評(píng)估
  8. 特征重要性
  9. 測(cè)試虛擬數(shù)據(jù)

理解數(shù)據(jù)

我必須戴上我的偵探眼鏡,深入醫(yī)療保健領(lǐng)域——不僅以學(xué)生和專業(yè)人士的身份,也以患者的身份。對(duì)我來說,這才是數(shù)據(jù)科學(xué)的真正意義所在:從微觀和宏觀兩個(gè)層面,全面理解你正在解決的問題。它還需要深厚的同理心——將人置于你構(gòu)建的每一個(gè)解決方案的核心。

背景:一家流動(dòng)醫(yī)療診所希望使用基本健康指標(biāo)對(duì)糖尿病患者進(jìn)行預(yù)篩查,以減少醫(yī)院擁擠并關(guān)注高危人群。

問題描述:使用 EDA 發(fā)現(xiàn)顯著影響糖尿病風(fēng)險(xiǎn)的因素。開發(fā)一個(gè)分類模型,根據(jù) BMI、血糖水平、胰島素水平和年齡等屬性預(yù)測(cè)一個(gè)人是否患有糖尿病。

收集數(shù)據(jù)

一旦確定了最終目標(biāo),下一步就是收集與該目標(biāo)相符的標(biāo)記數(shù)據(jù)。[因版面限制,只展示部分代碼,本項(xiàng)目的數(shù)據(jù)集和完整代碼獲取:@公眾號(hào):數(shù)據(jù)STUDIO 原文《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):糖尿病預(yù)測(cè)分析及可視化》 文末打賞任意金額便可獲取]。該數(shù)據(jù)集最初來自美國國家糖尿病、消化和腎臟疾病研究所。需要特別指出的是,這里的所有患者均為至少 21 歲的皮馬印第安血統(tǒng)女性。

工作流程的第一步是導(dǎo)入必要的庫。我們首先導(dǎo)入進(jìn)行分析所需的模塊和庫。

# 用于數(shù)值運(yùn)算、數(shù)據(jù)操作和數(shù)組處理
import pandas as pd 
import numpy as np 

import matplotlib.pyplot as plt 
import seaborn as sns 

# 用于導(dǎo)入規(guī)范化和分類器特征
from sklearn.preprocessing import StandardScaler 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LogisticRegression 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.model_selection import GridSearchCV 
from sklearn.model_selection import RandomizedSearchCV   
from sklearn.neighbors import KNeighborsClassifier 
from scipy.stats import randint, uniform 
!pip install xgboost 
import xgboost as xgb 

# 用于評(píng)估模型指標(biāo)
from sklearn.metrics import accuracy_score, classified_report, confusion_matrix, ConfusionMatrixDisplay, roc_curve, roc_auc_score 

# 用于清除所有警告對(duì)話框
import warnings
warnings.filterwarnings( 'ignore' )

然后將數(shù)據(jù)加載到notebook中

df = pd.read_csv("diabetes.csv") 
# 本項(xiàng)目的數(shù)據(jù)集和代碼獲?。篅公眾號(hào):數(shù)據(jù)STUDIO 原文《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):糖尿病預(yù)測(cè)及可視化分析》 文末打賞任意金額便可獲取
df

圖片圖片

數(shù)據(jù)集中字段含義:

  • Pregnancies:懷孕次數(shù)
  • Glucose:口服葡萄糖耐量試驗(yàn)(OGTT)中2小時(shí)血漿葡萄糖濃度
  • BloodPressure:舒張壓(毫米汞柱)
  • SkinThickness:三頭肌皮褶厚度(毫米)
  • Insulin:2小時(shí)血清胰島素(μU/ml)。
  • BMI:(體重(公斤)/(身高(米)2)
  • DiabetesPedigreeFunction:根據(jù)家族史,對(duì)個(gè)人糖尿病遺傳易感性進(jìn)行數(shù)值估計(jì)。范圍從 0.08 到 2.42。
  • Age:數(shù)據(jù)集中患者的年齡
  • Outcome:類別變量(0 或 1)指示患者是非糖尿病患者(0)還是糖尿病患者(1)

我們從數(shù)據(jù)集的形狀中獲得了 768 個(gè)觀測(cè)值(行)和 9 個(gè)屬性(列)

數(shù)據(jù)清洗和驗(yàn)證

在開始任何建?;蚍治鲋?,必須仔細(xì)驗(yàn)證和清理數(shù)據(jù)——這是數(shù)據(jù)科學(xué)中經(jīng)常被低估的關(guān)鍵步驟。首先,我們用放大鏡檢查是否存在空值或缺失值、重復(fù)值或異常值。

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Pregnancies               768 non-null    int64  
 1   Glucose                   768 non-null    int64  
 2   BloodPressure             768 non-null    int64  
 3   SkinThickness             768 non-null    int64  
 4   Insulin                   768 non-null    int64  
 5   BMI                       768 non-null    float64
 6   DiabetesPedigreeFunction  768 non-null    float64
 7   Age                       768 non-null    int64  
 8   Outcome                   768 non-null    int64  
dtypes: float64(2), int64(7)
memory usage: 54.1 KB

乍一看,所有 768 行數(shù)據(jù)在所有屬性上都顯示為非空。然而,這并不一定意味著數(shù)據(jù)集是干凈的。它僅僅意味著沒有表示為NaN的缺失值。在類似的醫(yī)學(xué)數(shù)據(jù)集中,可以使用諸如 之類的占位符值0來表示缺失數(shù)據(jù),尤其是在葡萄糖、胰島素或 BMI 等領(lǐng)域,因?yàn)?的值0在生理學(xué)上是不可信的。

我們已經(jīng)在數(shù)據(jù)集中觀察到了一些異常零,為了確認(rèn)這一點(diǎn),我們做了以下操作:

df.describe().T

圖片圖片

數(shù)據(jù)集中數(shù)值屬性的統(tǒng)計(jì)分析

我們可以看到,盡管患者0懷孕的可能性很大,但情況不應(yīng)該如此,尤其是在血糖、胰島素或BMI、血壓和皮膚厚度等領(lǐng)域。

進(jìn)一步探究,我們制作了一個(gè)匯總表,顯示了這些異常值的頻率

# 制作一個(gè) DataFrame 來讓我對(duì)數(shù)值有更多的了解

summary_table = pd.DataFrame({ 
    'Dtype': df.dtypes,    # 字典在內(nèi)部
    'Count': df.count(), 
    'Unique': df.nunique(), 
    'Null Values': df.isnull().sum (), 
    'Zero Values': [ 
        (df[col] == 0 ).sum() for col in df.columns], 
    'Frequent Value (and number of appearences)' : [ 
        f"{df[col].mode()[0]} ({df[col].value_counts().max ()})"for col in df.columns 
    ] 
}) 

summary_table

匯總表匯總表

這些0值在 SkinThickness 和 Insulin 等屬性中出現(xiàn)很多次,并且可能極大地影響其數(shù)據(jù)分布

檢查重復(fù)行檢查重復(fù)行

我們的數(shù)據(jù)集中沒有重復(fù)的行

屬性的直方圖分布屬性的直方圖分布

上圖旨在檢查每個(gè)屬性分布的偏度,以確定用什么統(tǒng)計(jì)量來填充這些0值。對(duì)于對(duì)稱分布(例如,SkinThickness & Glucose),我們稍后會(huì)用平均值替換這些缺失值NaN,然后再用平均值填充這些空值;而對(duì)于偏斜分布(例如,Insulin, BloodPressure 和 BMI),我們使用中位數(shù)來最小化誤差。

左偏(負(fù)偏): 如果低端(左側(cè))的尾部比右側(cè)長(zhǎng)或更長(zhǎng),則該分布被視為左偏分布。在這種情況下,大多數(shù)數(shù)據(jù)值會(huì)向高端(右側(cè))聚集,而少數(shù)低異常值會(huì)使均值向下傾斜。因此,平均值通常小于中位數(shù)。

右偏(正偏): 右偏分布的尾部(右側(cè))較長(zhǎng)或拉伸。這表明大多數(shù)數(shù)據(jù)點(diǎn)都集中在低端(左側(cè)),而一些高離群值會(huì)將平均值向上拉高。在這種情況下,平均值通常大于中位數(shù)。

正態(tài)分布:關(guān)于均值對(duì)稱的概率分布

還可以用以下圖表示:

圖片

  • 懷孕高峰期約為 1-2 次。平均懷孕次數(shù)約為 3.85 次,標(biāo)準(zhǔn)差為 3.37 次。這一特征表現(xiàn)為正偏度,偏度為 0.90。
  • 葡萄糖水平大多在 100 至 125 毫克/分升之間,平均值約為 120 毫克/分升,標(biāo)準(zhǔn)差為 32。分布接近對(duì)稱,偏度為 0.17。
  • 舒張壓的中心傾向接近 60-80mmHg,平均值為 69mmHg,分布(標(biāo)準(zhǔn)差)約為 。它顯示出負(fù)偏度,其偏度值為 -1.84
  • 皮膚厚度平均值約為 20.54 毫米,標(biāo)準(zhǔn)偏差為 。數(shù)據(jù)接近對(duì)稱,偏度值為 0.11
  • 胰島素水平主要集中在 0 左右,但平均值上升到 79.80 左右,表明數(shù)據(jù)呈正偏度分布。偏度值為 2.27,標(biāo)準(zhǔn)偏差為 115.24,相對(duì)較高。
  • 體重指數(shù)值集中在 30-40 附近,平均體重指數(shù)為 32,標(biāo)準(zhǔn)差為 7.88。根據(jù)-0.43的偏度值,分布呈現(xiàn)輕微的負(fù)偏斜
  • 糖尿病譜系系數(shù) 在 0.3-0.4 附近最為常見,平均值為 0.47,標(biāo)準(zhǔn)差為 0.33。
  • 年齡在 20-30 歲左右達(dá)到峰值,平均年齡約為 33.27 歲,標(biāo)準(zhǔn)偏差為 11.76。數(shù)據(jù)分布呈右偏態(tài),偏度值為 1.13。
columns_with_zeros = ['Glucose', 'BMI', 'Insulin', 'SkinThickness', 'BloodPressure']  #將不可能的零值替換為它們的空值

for column in columns_with_zeros:
  df[column] = df[column].replace(0, np.nan)


binomial_columns_with_zeros = ['Glucose', 'SkinThickness']  #用空值替換不可能為零的值 - 平均值(近似對(duì)稱)

for column in binomial_columns_with_zeros:
  df[column] = df[column].fillna(df[column].mean())

skewed_columns_with_zeros = ['BloodPressure', 'Insulin', 'BMI']  #用空值替換不可能為零的值 - 中位數(shù)(偏態(tài))

for column in skewed_columns_with_zeros:
  df[column] = df[column].fillna(df[column].median())

df

探索性數(shù)據(jù)分析

探索性數(shù)據(jù)分析 (EDA) 就像拼圖游戲一樣——數(shù)據(jù)科學(xué)家需要運(yùn)用他們的分析直覺。在這個(gè)階段,我們開始使用可視化、匯總和統(tǒng)計(jì)工具來解答數(shù)據(jù)背后的what, how, where以及why。在這個(gè)階段,我分析了數(shù)據(jù)集的結(jié)構(gòu)、分布和關(guān)系,以發(fā)現(xiàn)有意義的模式并識(shí)別糖尿病的潛在預(yù)測(cè)因子。

圖片圖片

  • 懷孕: 懷孕次數(shù)的平均值約為 4 次,中位數(shù)為 3 次,模式為 1 次,數(shù)值范圍為 0 至 17 次,標(biāo)準(zhǔn)差為 3.37 次。
  • 葡萄糖: 葡萄糖水平平均約為 120.89 mg/dl,中位數(shù)為 117.00 mg/dl,模式為 99.00 mg/dl。數(shù)值范圍從 0 到 199 mg/dl,標(biāo)準(zhǔn)差為 31.97 mg/dl。
  • 血壓:平均血壓約為 69.105 毫米汞柱,中位數(shù)為 72.00 毫米汞柱,模式為 70.00 毫米汞柱。測(cè)量范圍為 0 至 122 mmHg,標(biāo)準(zhǔn)差為 19.356 mmHg。
  • 皮膚厚度: 皮膚厚度的平均值為 20.536 毫米,中位數(shù)為 23.00 毫米,模式為 0.00 毫米。范圍為 0 至 99 毫米,標(biāo)準(zhǔn)差為 15.95 毫米。
  • 胰島素:胰島素水平平均約為 79.80 單位,中位數(shù)為 30.50 單位,模式為 0.00 單位。范圍為 0 至 846 單位,標(biāo)準(zhǔn)差為 115.24 單位。
  • 體重指數(shù): 平均體重指數(shù)(BMI)為 31.993,中位數(shù)和模式均為 32.00。數(shù)值范圍從 0 到 67.10,標(biāo)準(zhǔn)差為 7.884。
  • 糖尿病譜系函數(shù): 糖尿病血統(tǒng)函數(shù)的平均值為 0.472,中位數(shù)為 0.372,模式為 0.254。數(shù)值介于 0.08 和 2.42 之間,標(biāo)準(zhǔn)差為 0.331。
  • 年齡:平均年齡為 33.24 歲,中位數(shù)為 29.00 歲,模式為 22.00 歲。年齡范圍在 21 至 81 歲之間,標(biāo)準(zhǔn)差為 11.76 歲。

圖片圖片

  • 懷孕次數(shù)中位數(shù)約為 3-4,有幾個(gè)較高的離群值(如 15+ 懷孕)。0 這樣的值不是離群值,這是合乎邏輯的。
  • 葡萄糖中位數(shù)約為 110-120。由于數(shù)值較高(高達(dá)約 200),出現(xiàn)了明顯的右斜。包括 0 在內(nèi)的極低值為異常值--在醫(yī)學(xué)上難以置信,可能是數(shù)據(jù)缺失或錯(cuò)誤。
  • 血壓中位數(shù)約為 70-75 mmHg。有幾個(gè)值為 0,明顯是異常值,不符合生理學(xué)原理。血壓分布比較對(duì)稱,但這些 0 值需要清理。
  • 皮膚厚度中值約為 23-25 mm。0 的數(shù)量非常多--強(qiáng)烈表明數(shù)據(jù)缺失或有誤。也有一些上限離群值(約 100),但主要問題是 0。
  • 胰島素極度右偏。數(shù)值差異巨大,有許多離群值(高達(dá) 800+)。0 很常見,可能表示數(shù)據(jù)缺失--在現(xiàn)實(shí)世界的數(shù)據(jù)集中,胰島素經(jīng)常缺失。
  • 體重指數(shù)中位數(shù)約為 32。0 值也是異常值--不太可能對(duì)體重指數(shù)有效。其他方面呈右偏分布,但分布相當(dāng)緊湊。
  • 糖尿病譜系系數(shù)中位數(shù)約為 0.4。右偏,有許多輕度和極端異常值(>1.5)。沒有明顯的無效值,但該屬性的差異很大。
  • 年齡中位數(shù)約為 29-30。右偏,尾部延伸至 80 歲。沒有明顯的無效異常值;分布看起來很自然。

  • 懷孕糖尿病患者的懷孕次數(shù)往往較多。結(jié)果 = 1 的懷孕次數(shù)中位數(shù)更高。糖尿病患者的分布范圍更廣。
  • 血糖明顯區(qū)別:糖尿病患者的血糖水平明顯更高。在該數(shù)據(jù)集中,葡萄糖是一個(gè)強(qiáng)有力的指標(biāo)--IQR 的重疊極少。兩組中都有異常值,但非糖尿病組的異常值更大。
  • 血壓中位數(shù)相當(dāng)接近,但糖尿病患者的數(shù)值略高。非糖尿病組的異常值較低。總體而言,血壓可能不是一個(gè)強(qiáng)有力的區(qū)分指標(biāo)。
  • 皮膚厚度糖尿病患者和非糖尿病患者之間的差異很微妙。兩組的中位數(shù)和均方根值相似。糖尿病患者的幾個(gè)異常值延伸得更遠(yuǎn),但這一特征似乎不那么具有決定性。
  • 胰島素兩組的差異都很大,都有很多異常值。糖尿病患者的中位數(shù)似乎略高,但重疊程度較大。
  • 體重指數(shù)糖尿病患者的體重指數(shù)普遍較高。兩組之間的中位數(shù)有明顯變化。分布略偏右,有一些異常值,但這是一個(gè)有用的特征。
  • 糖尿病譜系系數(shù)糖尿病組的平均值較高。糖尿病患者中有許多高值異常值,表明遺傳風(fēng)險(xiǎn)更大。雖然分布有所重疊,但這一特征有助于預(yù)測(cè)。
  • 年齡糖尿病患者往往年齡較大。中位數(shù)和 IQRs 有明顯差異,糖尿病組的高端值更多。這一特征似乎非常相關(guān)。

皮馬印第安人數(shù)據(jù)集中的結(jié)果分布皮馬印第安人數(shù)據(jù)集中的結(jié)果分布

從上圖可以看出,我們有 500 名非糖尿病患者和 268 名糖尿病患者。這使得分布不平衡(即數(shù)據(jù)集中的目標(biāo)變量或類別沒有被平等地表示出來),如果處理不當(dāng),可能會(huì)導(dǎo)致潛在的偏差或泛化能力差。

每個(gè)屬性的平均分布(按結(jié)果著色)

上方的條形圖顯示了每個(gè)數(shù)值特征的平均值,并以O(shè)utcome變量(指示一個(gè)人是否患有糖尿?。┓指糸_。這有助于理解兩組之間每個(gè)健康指標(biāo)的平均值有何差異。我們注意到,糖尿病

患者和非糖尿病患者的胰島素、血糖、年齡和BMI水平之間存在明顯的一致性。這表明上述指標(biāo)是患者患糖尿病的明確指標(biāo)。妊娠期的一致性表明,有過多次妊娠的女性患妊娠期糖尿病的風(fēng)險(xiǎn)更高。

圖片圖片

從非對(duì)角線(散點(diǎn)圖)中發(fā)現(xiàn):

  • 葡萄糖似乎是一個(gè)非常重要的特征。在大多數(shù)涉及葡萄糖的散點(diǎn)圖中,兩個(gè)結(jié)果類別有明顯的分離,橙色/紅色(可能是 “糖尿病”)點(diǎn)一般出現(xiàn)在葡萄糖值較高的地方
  • 葡萄糖與胰島素:存在正相關(guān)。隨著葡萄糖的增加,胰島素也會(huì)增加。糖尿病 "組通常顯示較高的葡萄糖和胰島素值。
  • 葡萄糖與體重指數(shù): 呈正相關(guān)。較高的葡萄糖通常與較高的體重指數(shù)相關(guān)。糖尿病 "組的血糖和體重指數(shù)通常較高。
  • 葡萄糖與年齡的關(guān)系:總體趨勢(shì)是,葡萄糖水平越高,年齡就越大,尤其是 “糖尿病” 結(jié)果。
  • 體重指數(shù)似乎也是一個(gè)很好的區(qū)分特征。
  • 體重指數(shù)與血壓:存在正相關(guān)關(guān)系,體重指數(shù)越高,血壓越高。
  • 體重指數(shù)與年齡: 可能存在微弱的正相關(guān)。
  • 懷孕次數(shù)與年齡:存在正相關(guān),正如預(yù)期的那樣,年齡越大的人懷孕次數(shù)越多。
  • 胰島素及其分布:涉及胰島素的散點(diǎn)圖突顯了其奇特的分布。許多點(diǎn)聚集在零點(diǎn)附近,這是用零值計(jì)算的缺失數(shù)據(jù)。對(duì)于非零胰島素值,與葡萄糖呈正相關(guān),這表明隨著葡萄糖水平的升高,人體會(huì)分泌更多的胰島素來控制葡萄糖水平,但對(duì)于糖尿病患者來說,這種反應(yīng)可能不足或無效。
  • 皮膚厚度與體重指數(shù): 皮膚厚度與體重指數(shù)之間有很強(qiáng)的正相關(guān)性,這在生理學(xué)上是意料之中的,因?yàn)閮烧叨寂c身體脂肪有關(guān)。
  • 血壓及其影響:雖然血壓顯示了一些趨勢(shì),但它本身似乎并不像葡萄糖或體重指數(shù)那樣具有強(qiáng)烈的區(qū)分作用。

相關(guān)性熱圖相關(guān)性熱圖

上圖給出了屬性之間的相關(guān)性矩陣,范圍從 -1(強(qiáng)負(fù)相關(guān)性)、0(無相關(guān)性)和+1(強(qiáng)正相關(guān)性)。

與結(jié)果的相關(guān)性:

  • Glucose和Outcome之間存在中等強(qiáng)度的正相關(guān)性。這是完全可以預(yù)料到的,因?yàn)楦哐撬绞翘悄虿〉闹饕笜?biāo)。這表明,隨著血糖水平的升高,出現(xiàn)積極結(jié)果(糖尿?。┑目赡苄砸矔?huì)增大。
  • BMI和Outcome之間存在中等強(qiáng)度的正相關(guān)性。
  • BMI較高通常意味著患糖尿病的風(fēng)險(xiǎn)較高。
  • Age和Outcome之間存在微弱的正相關(guān)性?;继悄虿〉娘L(fēng)險(xiǎn)通常會(huì)隨著年齡的增長(zhǎng)而增加。
  • Pregnancies和Outcome之間存在微弱的正相關(guān)性,這可能與妊娠期糖尿病或多胎妊娠可能與以后患 2 型糖尿病的風(fēng)險(xiǎn)較高有關(guān)。
# 根據(jù)可靠的健康分類分層,對(duì)年齡、BMI、血壓進(jìn)行分類屬性
# 本項(xiàng)目的數(shù)據(jù)集和代碼獲?。篅公眾號(hào):數(shù)據(jù)STUDIO 原文《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):糖尿病預(yù)測(cè)分析及可視化》 文末打賞任意金額便可獲取
df['AgeGroup'] = pd.cut(df['Age'], bins=[20, 30, 40, 50, 60, 100], labels= ['Young Adult', 'Early Middle Age', 'Late Middle Age', 'Early  Senior', 'Senior'])
df['BMI_Group'] = pd.cut(df['BMI'], bins=[0, 18.5, 25, 30, 100], labels=['Underweight', 'Normal', 'Overweight', 'Obese'])
df['BloodPressure_Group'] = pd.cut(df['BloodPressure'], bins=[0, 60, 80, 90, 120, 200], labels=['Low', 'Normal', 'Pre-hypertension', 'Stage 1 Hypertension', 'Stage 2 Hypertension'])
df['Outcome_Group'] = df['Outcome'].map({0: 'No Diabetes', 1: 'Diabetes'})


df['Glucose_Category'] = pd.cut(df['Glucose'], bins=[0, 140, 200], labels=['Normal', 'Impaired glucose tolerance'])

df[['Glucose', 'Glucose_Category']]

# 根據(jù)提供的范圍定義胰島素類別
df['Insulin_Category'] = pd.cut(df['Insulin'],
                                bins=[0, 30, 100, 150, 1000], # Increased upper bound to include high values
                                labels=['< 30 (Possible Deficiency)', '30-100 (Normal)', '100-150 (Early Resistance)', '> 150 (Significant Resistance)'],
                               right=False) # 使用 right=False 使箱體不包括右邊緣,與描述相匹配

# 定義 DiabetesPedigreeFunction 的箱
bins = [0, 0.5, 1.0, 1.5, df['DiabetesPedigreeFunction'].max()]
labels = ['0-0.5', '0.5-1.0', '1.0-1.5', '>1.5']

# 為 DPF 箱體創(chuàng)建新列
df['Pedigree_Bin'] = pd.cut(df['DiabetesPedigreeFunction'], bins=bins, labels=labels, right=False)

為了增強(qiáng)可解釋性并揭示數(shù)據(jù)中更深層次的模式,我根據(jù)既定的醫(yī)療保健分層,將幾個(gè)連續(xù)的健康指標(biāo)轉(zhuǎn)化為具有臨床意義的類別。這一步驟可以實(shí)現(xiàn)更直觀的分析和可視化,尤其是在比較不同人群的糖尿病結(jié)果時(shí)。

  • Age按照生命階段分為以下幾個(gè)組:青年(21-30 歲)、中年早期(31-40 歲)、中年晚期(41-50 歲)、老年早期(51-60 歲)和老年(61 歲以上)。
  • BMI使用 WHO 標(biāo)準(zhǔn)分類對(duì)值進(jìn)行分組:體重過輕(<18.5)、正常(18.5–24.9)、超重(25–29.9)和肥胖(30+)。
  • 根據(jù)Blood Pressure舒張壓截?cái)嘀?,將血壓分為臨床范圍:低血壓、正常血壓、高血壓前期和1-2 期高血壓。
  • 二元變量Outcome被映射到更易讀的標(biāo)簽——糖尿病和非糖尿病,以便圖表和表格更加清晰。
  • Glucose分為兩個(gè)主要診斷范圍:

正常(<140mg/dL)

糖耐量受損(140-199mg/dL)。這些閾值反映了 2 小時(shí)口服葡萄糖耐量測(cè)試 (OGTT) 中使用的標(biāo)準(zhǔn)指南,有助于識(shí)別可能處于糖尿病前期的個(gè)體。

  • 根據(jù)Insulin胰島素敏感性和抵抗性的臨床解釋,將水平分為四類:
  1. < 30 μU/mL — 可能存在胰島素缺乏,

  2. 30–100 μU/mL — 正常2小時(shí)血清胰島素反應(yīng)

  3. 100–150 μU/mL — 胰島素抵抗的早期跡象

  4. 150 μU/mL — 嚴(yán)重的胰島素抵抗。定義的分箱既反映了診斷范圍,也反映了數(shù)據(jù)集中觀察到的分布。使用right=False確保每個(gè)類別的上限不重疊

  • 雖然這DiabetesPedigreeFunction并非傳統(tǒng)意義上的臨床指標(biāo),但它有助于根據(jù)家族史了解患者的糖尿病遺傳易感性。為了更直觀地分析這一特征,我將連續(xù)的DPF值劃分為四個(gè)分類箱。這些分類箱有助于突出顯示遺傳風(fēng)險(xiǎn)的增加與數(shù)據(jù)集中糖尿病患病率之間的關(guān)聯(lián)。

現(xiàn)在,進(jìn)入分類圖表:

按結(jié)果對(duì)葡萄糖進(jìn)行分類按結(jié)果對(duì)葡萄糖進(jìn)行分類

這張堆疊條形圖顯示了兩組血糖類別中糖尿病陽性和陰性結(jié)果的百分比。它告訴我們,血糖受損的糖尿病患者比例要高得多。因此,這再次印證了我們的假設(shè):血糖是最終糖尿病結(jié)果的關(guān)鍵決定因素。所有年齡段的人都應(yīng)定期進(jìn)行血糖檢測(cè),即使患者尚未患糖尿病。

年齡分布——餅圖年齡分布——餅圖

從兩個(gè)餅圖來看,老年人在我們的數(shù)據(jù)集中沒有得到充分體現(xiàn),因此我們可以對(duì)這個(gè)年齡段的分析持保留態(tài)度。

結(jié)果分布——年齡組結(jié)果分布——年齡組

這張水平條形圖展示了各年齡段糖尿病狀況的分布情況。由此可見,患糖尿病的風(fēng)險(xiǎn)較高的人群是中年早期(31-40歲)和老年早期(51-60歲)。因此,強(qiáng)烈建議在40歲這個(gè)門檻上進(jìn)行早期檢測(cè)和監(jiān)測(cè)。

結(jié)果分布 — bmi 集團(tuán)結(jié)果分布 — bmi 集團(tuán)

由此可見,BMI 肥胖人群最容易患糖尿病。因此,對(duì)患者采取積極的體重管理策略是最可行的解決方案。

結(jié)果分布——分級(jí)妊娠結(jié)果分布——分級(jí)妊娠

妊娠次數(shù)與糖尿病患病率之間似乎存在某種關(guān)聯(lián)。隨著妊娠次數(shù)的增加,確診患有糖尿病的女性比例也顯著增加。這進(jìn)一步表明,多次妊娠的女性患妊娠期糖尿病的風(fēng)險(xiǎn)可能更大。

結(jié)果分布——dpf結(jié)果分布——dpf

從上面的多條形圖中可以看出,在譜系功能較高的人群中,糖尿病患者的相對(duì)比例往往較高。這也表明遺傳易感性可能是一個(gè)影響因素。

僅有一次觀察結(jié)果顯示患有 2 期高血壓(數(shù)據(jù)不足)僅有一次觀察結(jié)果顯示患有 2 期高血壓(數(shù)據(jù)不足)

從我理解數(shù)據(jù)的背景來看,糖尿病患者患高血壓的可能性是普通人的兩倍。這更像是糖尿病的后遺癥,而非病因。糖尿病會(huì)損傷腎臟,導(dǎo)致水鹽潴留,進(jìn)而導(dǎo)致血壓升高。因此,糖尿病對(duì)高血壓前期和一期高血壓患者的影響更為顯著。

結(jié)果分布——胰島素結(jié)果分布——胰島素

胰島素抵抗通常是血糖水平受損的先兆。這意味著抵抗力顯著的個(gè)體最容易患糖尿病,超過一半的嚴(yán)重抵抗女性患有糖尿病。這個(gè)問題可以通過定期檢測(cè)患者的胰島素水平來解決。100mU/mL 應(yīng)作為進(jìn)一步監(jiān)測(cè)和采取早期預(yù)防措施的標(biāo)志。

結(jié)果分布——胰島素和葡萄糖結(jié)果分布——胰島素和葡萄糖

由于血糖和胰島素是手動(dòng)設(shè)置的屬性,我們使用了屏蔽函數(shù)、運(yùn)算符和位置尋址來整合先前創(chuàng)建的Glucose_Category和Insulin_Category列中的信息。這可以根據(jù)患者的血糖和胰島素水平識(shí)別特定的亞組,并僅關(guān)注屬于這些定義的高血糖和胰島素抵抗組的患者。

這里的數(shù)字高得驚人,如果病人的血糖水平處于這些高值范圍之間,那么他們患糖尿病的可能性就很大

特征預(yù)處理

完成整個(gè) EDA 后,需要準(zhǔn)備用于建模的數(shù)據(jù)。首先,我們準(zhǔn)備用于訓(xùn)練機(jī)器學(xué)習(xí)模型的特征(自變量)。在監(jiān)督學(xué)習(xí)中,我們將數(shù)據(jù)集分為特征(用于進(jìn)行預(yù)測(cè)的數(shù)據(jù))和目標(biāo)變量(我們想要預(yù)測(cè)的內(nèi)容)。

X = df.drop(columns=df.select_dtypes(exclude=np.number))
X.drop(columns=['Outcome'], inplace=True)
X
y = df['Outcome']
y

特征相關(guān)性特征相關(guān)性

獨(dú)立特征之間的相關(guān)性:Glucose和Insulin之間存在相對(duì)較強(qiáng)的正相關(guān)性。這在生物學(xué)上是合理的,因?yàn)橐葝u素會(huì)根據(jù)血糖水平釋放以調(diào)節(jié)血糖水平。SkinThickness和BMI是獨(dú)立特征之間最強(qiáng)的相關(guān)性之一。這很合理,因?yàn)槠ゑ藓穸葴y(cè)量值通常用于計(jì)算或與BMI相關(guān)。Pregnancies和Age也暗示了強(qiáng)烈的正相關(guān)性。這是合乎邏輯的,因?yàn)榕噪S著年齡的增長(zhǎng)通常會(huì)懷孕更多次。

弱/負(fù)相關(guān)性:注意一些非常弱或接近于零的相關(guān)性,例如BloodPressure和Insulin(0.045)或DiabetesPedigreeFunction和BloodPressure(-0.0024)。這些低值表明這些特征在很大程度上以線性方式相互獨(dú)立(例如Pregnancies和DiabetesPedigreeFunction(0.034))。

特征縮放

scaler = StandardScaler() 

scaledX = scaler.fit_transform(X)

標(biāo)準(zhǔn)化是機(jī)器學(xué)習(xí)中常見的預(yù)處理步驟,旨在確保值較大的特征不會(huì)對(duì)模型造成不成比例的影響。這可以通過將數(shù)據(jù)變換為平均值為 0、標(biāo)準(zhǔn)差為 1 來實(shí)現(xiàn)。

特征指標(biāo)

理解混淆矩陣理解混淆矩陣

再次,你還記得我們說過這個(gè)數(shù)據(jù)集不平衡嗎?你的模型可能傾向于多數(shù)類,即使你獲得了很高的準(zhǔn)確率,也可能在關(guān)鍵的地方表現(xiàn)不佳。95% 的準(zhǔn)確率可能掩蓋了模型從未正確預(yù)測(cè)少數(shù)類(重要的類)的事實(shí)——而當(dāng)它真正重要時(shí),這可能會(huì)帶來災(zāi)難性的后果。因此,我們不應(yīng)該關(guān)注準(zhǔn)確率,而是應(yīng)該評(píng)估這些模型的指標(biāo):精度、準(zhǔn)確率、F-1 分?jǐn)?shù)和 AUC(曲線下面積)。

精確度是:“模型每次說‘糖尿病’時(shí),有多少人實(shí)際上是糖尿病患者?”——如果你的模型說有 10 個(gè)人是糖尿病患者,但實(shí)際上只有 6 個(gè)人是糖尿病患者,那么你的精確度就是 0.6(非糖尿病患者也是如此)

召回率是: “在所有實(shí)際的糖尿病病例中,模型捕獲了多少個(gè)?”——這對(duì)于非糖尿病類別也存在)

F1 分?jǐn)?shù)是: “精確度和召回率之間的平衡點(diǎn)在哪里?”——這通常是不平衡數(shù)據(jù)集的最佳指標(biāo)。它是精確度和召回率的調(diào)和平均值。為了獲得較高的 F1 分?jǐn)?shù),你的召回率和精確度也必須很高。

AUC 是: “模型能多好地區(qū)分類別(例如,是與否)?”——這個(gè)值介于 0 到 1 之間。這往往會(huì)對(duì)模型的整體性能進(jìn)行排名

訓(xùn)練-測(cè)試拆分驗(yàn)證

為了評(píng)估機(jī)器學(xué)習(xí)模型的性能,必須將數(shù)據(jù)集拆分為兩部分:用于訓(xùn)練模型的訓(xùn)練集,以及用于評(píng)估模型在未知數(shù)據(jù)上表現(xiàn)的測(cè)試集。我們將數(shù)據(jù)集的 20% 分配給測(cè)試集,80% 分配給訓(xùn)練集。我們使用 Scikit-learn 的訓(xùn)練-測(cè)試拆分功能來執(zhí)行此操作。

X_train,X_test,y_train,y_test = train_test_split(scaledX,y,test_size= 0.2,random_state= 42)

模型訓(xùn)練

因?yàn)檫@是一個(gè)分類模型,所以我們將使用決策樹、隨機(jī)森林等分類模型。

我們從邏輯回歸開始:

# 訓(xùn)練模型以使其根據(jù)輸入進(jìn)行預(yù)測(cè)
log = LogisticRegression() 
log.fit(X_train, y_train) 

# 使用訓(xùn)練好的對(duì)數(shù)模型對(duì)測(cè)試數(shù)據(jù)集進(jìn)行預(yù)測(cè)
log_preds = log.predict(X_test)

評(píng)估:邏輯回歸的準(zhǔn)確度評(píng)分和分類報(bào)告評(píng)估:邏輯回歸的準(zhǔn)確度評(píng)分和分類報(bào)告

評(píng)估:邏輯回歸的準(zhǔn)確度評(píng)分和分類報(bào)告

隨機(jī)森林分類

現(xiàn)在我們嘗試隨機(jī)森林

forest = RandomForestClassifier(random_state=56) #為了便于復(fù)現(xiàn)
forest.fit(X_train, y_train) #訓(xùn)練模型

forest_preds = forest.predict(X_test) #在未見過的數(shù)據(jù)上測(cè)試模型

評(píng)估:隨機(jī)森林的準(zhǔn)確率得分和分類報(bào)告評(píng)估:隨機(jī)森林的準(zhǔn)確率得分和分類報(bào)告

評(píng)估:隨機(jī)森林的準(zhǔn)確率得分和分類報(bào)告

決策樹分類器

接下來是決策樹:

#初始化決策樹分類器
tree = DecisionTreeClassifier(random_state= 56 ) 

# 將模型擬合到訓(xùn)練數(shù)據(jù)
tree.fit(X_train, y_train) 

# 對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
tree_preds = tree.predict(X_test)

評(píng)估:決策樹的準(zhǔn)確度得分和分類報(bào)告評(píng)估:決策樹的準(zhǔn)確度得分和分類報(bào)告

評(píng)估:決策樹的準(zhǔn)確度得分和分類報(bào)告

KNN分類器

K最近鄰分類器下一步:

# 初始化 KNN 分類器
knn = KNeighborsClassifier(n_neighbors= 25 ) # 您可以選擇鄰居的數(shù)量(k)

# 將模型擬合到訓(xùn)練數(shù)據(jù)
knn.fit(X_train, y_train) 

# 對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
knn_preds = knn.predict(X_test)

評(píng)估:K最近鄰分類器的準(zhǔn)確率和分類報(bào)告評(píng)估:K最近鄰分類器的準(zhǔn)確率和分類報(bào)告

評(píng)估:K最近鄰分類器的準(zhǔn)確率和分類報(bào)告

XGBoost分類器

# 創(chuàng)建 XGBoost 分類器
xgb_model = xgb.XGBClassifier(random_state= 42 ) 

# 訓(xùn)練模型
xgb_model.fit(X_train, y_train) 

# 進(jìn)行預(yù)測(cè)
xgb_preds = xgb_model.predict(X_test)

評(píng)估:xgbclassifier 的準(zhǔn)確率和分類報(bào)告評(píng)估:xgbclassifier 的準(zhǔn)確率和分類報(bào)告

不同模型ROC對(duì)比

我們對(duì)比了多個(gè)模型訓(xùn)練效果如圖所示:

圖片圖片

超參數(shù)調(diào)整

我們對(duì)隨機(jī)森林和決策樹模型執(zhí)行了 GridSearch 和 RandomizedSearchCV,希望在評(píng)估期間獲得更好的 F1 分?jǐn)?shù)。

以下是所有模型的最終表現(xiàn):

模型性能模型性能

調(diào)整隨機(jī)森林(隨機(jī)搜索)在少數(shù)結(jié)果中表現(xiàn)最佳,而 KNN 在多數(shù)結(jié)果中表現(xiàn)最佳。我們選擇部署調(diào)整隨機(jī)森林來測(cè)試我們的虛擬數(shù)據(jù),但這還有待觀察。

這是所有使用的模型的 2*4 混淆矩陣

圖片圖片

特征重要性

這有助于我們對(duì)每個(gè)模型在訓(xùn)練和測(cè)試中使用的屬性進(jìn)行排名,以確定或選擇類別。

特征重要性特征重要性

由此可以肯定的是:血糖是預(yù)測(cè)患者糖尿病的首要決定因素。BMI、年齡和胰島素也是預(yù)測(cè)結(jié)果的關(guān)鍵屬性。

測(cè)試一下:

特征氣泡圖特征氣泡圖

你看到這張氣泡圖了嗎?它告訴我們,在血糖和BMI水平較高時(shí),有一簇大的橙色氣泡(結(jié)果 = 1),這表明BMI和血糖值較高的老年人更有可能獲得積極的結(jié)果。你會(huì)注意到,許多大的紫色圓圈位于血糖軸的下方。這意味著他們可能年齡較大、體重較重——但他們的血糖水平不高,所以他們不是糖尿病患者。

  • 大橙色(上圖) = 高 BMI + 高血糖 + 年齡較大 = 高風(fēng)險(xiǎn)
  • 大紫色(下圖) = 可能年紀(jì)大或 BMI 高,但血糖正?;蛴衅渌Wo(hù)因素

胰島素抵抗氣泡圖胰島素抵抗氣泡圖

最上象限的圓圈大多巨大且呈橙色。這告訴我們,胰島素抵抗和血糖升高(見上圖)的情況不容樂觀。這幾乎肯定會(huì)導(dǎo)致糖尿病,或者至少是定時(shí)炸彈。這里大多數(shù)負(fù)面結(jié)果的血糖和胰島素水平都正常。

現(xiàn)在,令人瞠目結(jié)舌的事情發(fā)生了!因?yàn)槲蚁矚g風(fēng)險(xiǎn)分析,所以我們喜歡用幾率來衡量概率。我們建立了一個(gè)簡(jiǎn)單的風(fēng)險(xiǎn)評(píng)分系統(tǒng),如果BMI > 30,則+1;如果血糖 > 140,則+1;如果年齡 > 40,則+1;如果胰島素 > 150,則+1;如果懷孕次數(shù) > 3,則+1。我們計(jì)算了每個(gè)分?jǐn)?shù)對(duì)應(yīng)的糖尿病發(fā)病率,并將其列在0-1范圍內(nèi)的熱圖上(根據(jù)符合的屬性,分?jǐn)?shù)越接近1,患者患糖尿病的風(fēng)險(xiǎn)就越大)。

# 將基于最重要特征的風(fēng)險(xiǎn)評(píng)分邏輯應(yīng)用于 DataFrame 
def  calculate_risk_score ( row ):
    score = 0   # 初始化為 0 并按條件遞增
    if row['BMI'] > 30:
        score += 1
    if row['Glucose'] > 140:
        score += 1
    if row['Age'] > 40:
        score += 1
    if row['Insulin'] > 150:
        score += 1
    if row['Pregnancies'] > 3:
        score += 1
    return score

df['RiskScore'] = df.apply(calculate_risk_score, axis=1) 

# 計(jì)算每個(gè)風(fēng)險(xiǎn)評(píng)分的糖尿病發(fā)病率
risk_diabetes_rate = df.groupby('RiskScore')['Outcome'].mean().reset_index()

# 創(chuàng)建熱圖
plt.figure(figsize=(10, 6))
sns.heatmap(risk_diabetes_rate.set_index('RiskScore').T, annot=True, cmap='Reds', fmt=".2f", linewidths=.5)
plt.title('Diabetes Rate vs. Risk Score Heatmap')
plt.xlabel('Risk Score')
plt.ylabel('Outcome (1=Diabetes)')
plt.yticks([]) # 隱藏 y 軸標(biāo)簽,因?yàn)樗挥?結(jié)果 (1=糖尿病)'
plt.show()

風(fēng)險(xiǎn)評(píng)分熱圖風(fēng)險(xiǎn)評(píng)分熱圖

即使只超過 3 個(gè)閾值,患者也或多或少有可能患有糖尿病。超過 4 個(gè)閾值是一個(gè)巨大的災(zāi)難性危險(xiǎn)信號(hào),我們希望迅速找到干預(yù)措施,而超過 5 個(gè)閾值幾乎肯定是糖尿病

測(cè)試虛擬數(shù)據(jù)

我們將一個(gè)虛擬數(shù)據(jù)集傳遞給模型,以測(cè)試該患者是陽性還是陰性。我們將數(shù)據(jù)以數(shù)組的形式傳遞,順序與數(shù)據(jù)字典中的順序相同,然后縮放數(shù)據(jù),使用部署的模型執(zhí)行預(yù)測(cè),并評(píng)估兩種結(jié)果的確定性概率。請(qǐng)看下面的代碼:

# 示例患者數(shù)據(jù)作為 NumPy 數(shù)組
# 確保特征的順序與訓(xùn)練數(shù)據(jù)匹配
# 訓(xùn)練數(shù)據(jù) (X) 中的特征為:
# ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age'] 

# 示例患者數(shù)據(jù)(用實(shí)際患者數(shù)據(jù)替換)
# 這只是一個(gè)包含 8 個(gè)值的占位符數(shù)組。
# 您需要在此處提供實(shí)際患者數(shù)據(jù)。
 patient_data_array = np.array([[ 2 , 130 , 70 , 30 , 128 , 35.0 , 0.82 , 43 ]]) 

# 使用與訓(xùn)練數(shù)據(jù)相同的縮放器縮放患者數(shù)據(jù)
scaled_patient_data = scaler.transform(patient_data_array) 

# 使用隨機(jī)搜索模型執(zhí)行預(yù)測(cè)
prediction = best_tree_model.predict(scaled_patient_data) 

# 預(yù)測(cè)結(jié)果是一個(gè) numpy 數(shù)組,訪問第一個(gè)元素
prediction_result = prediction[ 0 ] 

# 解釋預(yù)測(cè)
if prediction_result == 1:
  print("Prediction: The patient is likely to have diabetes.")
else:
  print("Prediction: The patient is likely not to have diabetes.") 

# 獲取每個(gè)類的概率
prediction_proba = best_rs_forest_model.predict_proba(scaled_patient_data)
print(f"Probability of no diabetes (Class 0): {prediction_proba[0][0]:.4f}")
print(f"Probability of diabetes (Class 1): {prediction_proba[0][1]:.4f}")

根據(jù)虛擬數(shù)據(jù)進(jìn)行預(yù)測(cè)根據(jù)虛擬數(shù)據(jù)進(jìn)行預(yù)測(cè)

預(yù)計(jì)這位患者最有可能患有糖尿病——我叫她 Anaya

這是一個(gè)顯示 Anaya 的用戶資料及其病史的儀表板

anaya 的個(gè)人資料anaya 的個(gè)人資料

我們還做了一個(gè)交互式的,要求用戶輸入。我們收集了用戶(例如患者)的醫(yī)療輸入,對(duì)輸入進(jìn)行預(yù)處理,使其與經(jīng)過訓(xùn)練的機(jī)器學(xué)習(xí)模型(例如本例中的 KNN)使用的格式相匹配,預(yù)測(cè)患者是否可能患有糖尿病,并顯示結(jié)果的概率和解釋。

我們利用 try-except 驗(yàn)證塊來確保數(shù)據(jù)float僅在數(shù)據(jù)類型中被接受并附加到列表數(shù)組中patient_data

# 本項(xiàng)目的數(shù)據(jù)集和代碼獲取:@公眾號(hào):數(shù)據(jù)STUDIO 原文《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):糖尿病預(yù)測(cè)分析及可視化》 文末打賞任意金額便可獲取
# 允許用戶輸入進(jìn)行預(yù)測(cè)
def  get_patient_input ():
"""從用戶那里獲取患者屬性作為輸入并進(jìn)行驗(yàn)證。"""
  feature_names = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
  patient_data = []

  print("Please enter the patient's details:")

for feature in feature_names: 
    whileTrue: 
      try: 
        value = float(input(f"Enter {feature}: "))
        # 添加基本驗(yàn)證(例如,非負(fù)值)
        if feature in ['Pregnancies', 'Age'] and value < 0:
            print("Value cannot be negative. Please enter again.")
            continue
        if feature in ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI'] and value < 0:
            print("Value cannot be negative. Please enter again.")
            continue
        if feature == 'DiabetesPedigreeFunction'and value < 0:
            print("Value cannot be negative. Please enter again.")
            continue

        patient_data.append(value) 
        break# 如果輸入有效,則退出循環(huán)
      except ValueError:
        print("Invalid input. Please enter a numerical value.")
      except Exception as e:
        print(f"An error occurred: {e}"))

return np.array([patient_data]) 

# 從用戶那里獲取輸入
user_patient_data = get_patient_input() 

# 使用在訓(xùn)練數(shù)據(jù)上適合的相同縮放器縮放用戶輸入數(shù)據(jù)
scaled_user_data = scaler。transform(user_patient_data) 

user_prediction = knn.predict(scaled_user_data) 

# 解釋預(yù)測(cè)
user_prediction_result = user_prediction[ 0 ] 

if user_prediction_result == 1:
  print("\nPrediction: Based on the input data, the patient is likely to have diabetes.")
else:
  print("\nPrediction: Based on the input data, the patient is likely not to have diabetes.")

  print("\nPrediction: Based on the input data, the patient is likely not to have diabetes.")

# 獲取每個(gè)類的概率
user_prediction_proba = knn.predict_proba(scaled_user_data) 
print(f"Probability of no diabetes (Class 0): {user_prediction_proba[0][0]:.4f}")
print(f"Probability of diabetes (Class 1): {user_prediction_proba[0][1]:.4f}")

用戶輸入——預(yù)測(cè)用戶輸入——預(yù)測(cè)

在這里,你可以看到,即使它預(yù)測(cè)患者可能患有糖尿病,也并不像第一個(gè)例子那樣確定。所以,誰知道呢?這可能是假陽性(也可能不是)。

當(dāng)我們繼續(xù)探索健康與機(jī)器學(xué)習(xí)的交集時(shí),記?。好總€(gè)數(shù)據(jù)點(diǎn)不僅僅是一個(gè)統(tǒng)計(jì)數(shù)據(jù);它代表著一個(gè)人類的故事。

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)STUDIO
相關(guān)推薦

2016-04-29 19:40:20

糖尿病機(jī)器學(xué)習(xí)微軟Azure

2021-11-29 13:29:06

Basemap可視化分析

2020-11-09 10:35:07

諾和諾德微軟智能

2024-07-31 11:48:07

2022-06-15 08:25:07

Python天氣數(shù)據(jù)可視化分析

2016-12-02 17:46:56

機(jī)器學(xué)習(xí)眼疾谷歌

2023-11-21 14:01:29

AI人工智能

2023-07-26 12:38:42

PyGWalker數(shù)據(jù)類型

2016-11-25 11:16:22

阿里支付寶數(shù)據(jù)分析

2020-09-27 10:32:05

開發(fā) Github可視化

2018-01-25 14:34:18

大數(shù)據(jù)可視化工具

2021-05-06 09:57:18

Python 開發(fā)編程語言

2020-09-09 12:15:50

大數(shù)據(jù)互聯(lián)網(wǎng)可視化

2018-01-03 17:22:22

DataHunter數(shù)據(jù)可視化分析

2020-09-27 14:56:33

工具數(shù)據(jù)可視化技術(shù)

2018-11-14 10:15:58

開源技術(shù) 數(shù)據(jù)

2022-11-26 21:34:08

Python可視化世界杯

2016-11-28 15:03:06

Python數(shù)據(jù)可視化網(wǎng)絡(luò)分析

2021-09-09 06:40:28

Pyecharts可視化源碼

2022-05-12 08:58:03

開源日志查詢日志可視化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)