機(jī)器學(xué)習(xí)實(shí)戰(zhàn):糖尿病預(yù)測(cè)及可視化分析
你一生中可能已經(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í)采取的步驟如下:
- 理解數(shù)據(jù)
- 收集數(shù)據(jù)
- 數(shù)據(jù)清洗和驗(yàn)證
- 探索性數(shù)據(jù)分析
- 特征預(yù)處理
- 模型訓(xùn)練
- 模型評(píng)估
- 特征重要性
- 測(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ù)行
我們的數(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é)果分布
從上圖可以看出,我們有 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)性矩陣,范圍從 -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胰島素敏感性和抵抗性的臨床解釋,將水平分為四類:
< 30 μU/mL — 可能存在胰島素缺乏,
30–100 μU/mL — 正常2小時(shí)血清胰島素反應(yīng)
100–150 μU/mL — 胰島素抵抗的早期跡象
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é)果的百分比。它告訴我們,血糖受損的糖尿病患者比例要高得多。因此,這再次印證了我們的假設(shè):血糖是最終糖尿病結(jié)果的關(guān)鍵決定因素。所有年齡段的人都應(yīng)定期進(jìn)行血糖檢測(cè),即使患者尚未患糖尿病。
年齡分布——餅圖
從兩個(gè)餅圖來看,老年人在我們的數(shù)據(jù)集中沒有得到充分體現(xiàn),因此我們可以對(duì)這個(gè)年齡段的分析持保留態(tài)度。
結(jié)果分布——年齡組
這張水平條形圖展示了各年齡段糖尿病狀況的分布情況。由此可見,患糖尿病的風(fēng)險(xiǎn)較高的人群是中年早期(31-40歲)和老年早期(51-60歲)。因此,強(qiáng)烈建議在40歲這個(gè)門檻上進(jìn)行早期檢測(cè)和監(jiān)測(cè)。
結(jié)果分布 — bmi 集團(tuán)
由此可見,BMI 肥胖人群最容易患糖尿病。因此,對(duì)患者采取積極的體重管理策略是最可行的解決方案。
結(jié)果分布——分級(jí)妊娠
妊娠次數(shù)與糖尿病患病率之間似乎存在某種關(guān)聯(lián)。隨著妊娠次數(shù)的增加,確診患有糖尿病的女性比例也顯著增加。這進(jìn)一步表明,多次妊娠的女性患妊娠期糖尿病的風(fēng)險(xiǎn)可能更大。
結(jié)果分布——dpf
從上面的多條形圖中可以看出,在譜系功能較高的人群中,糖尿病患者的相對(duì)比例往往較高。這也表明遺傳易感性可能是一個(gè)影響因素。
僅有一次觀察結(jié)果顯示患有 2 期高血壓(數(shù)據(jù)不足)
從我理解數(shù)據(jù)的背景來看,糖尿病患者患高血壓的可能性是普通人的兩倍。這更像是糖尿病的后遺癥,而非病因。糖尿病會(huì)損傷腎臟,導(dǎo)致水鹽潴留,進(jìn)而導(dǎo)致血壓升高。因此,糖尿病對(duì)高血壓前期和一期高血壓患者的影響更為顯著。
結(jié)果分布——胰島素
胰島素抵抗通常是血糖水平受損的先兆。這意味著抵抗力顯著的個(gè)體最容易患糖尿病,超過一半的嚴(yán)重抵抗女性患有糖尿病。這個(gè)問題可以通過定期檢測(cè)患者的胰島素水平來解決。100mU/mL 應(yīng)作為進(jìn)一步監(jiān)測(cè)和采取早期預(yù)防措施的標(biāo)志。
結(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)性
獨(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)告
隨機(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)告
決策樹分類器
接下來是決策樹:
#初始化決策樹分類器
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)告
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)告
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)告
不同模型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)分熱圖
即使只超過 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è)
預(yù)計(jì)這位患者最有可能患有糖尿病——我叫她 Anaya
這是一個(gè)顯示 Anaya 的用戶資料及其病史的儀表板
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è)患者可能患有糖尿病,也并不像第一個(gè)例子那樣確定。所以,誰知道呢?這可能是假陽性(也可能不是)。
當(dāng)我們繼續(xù)探索健康與機(jī)器學(xué)習(xí)的交集時(shí),記?。好總€(gè)數(shù)據(jù)點(diǎn)不僅僅是一個(gè)統(tǒng)計(jì)數(shù)據(jù);它代表著一個(gè)人類的故事。