2022年頂級心髒病預測項目
已發表: 2021-05-26歡迎來到我們的心髒病預測項目的分步教程。 在這裡,您將創建一個機器學習模型來預測患者是否可以被診斷出患有心髒病。
您應該熟悉機器學習和數據分析的基礎知識才能參與此項目。 該項目要求您熟悉多種 ML 算法,包括隨機森林、K-NN(K-最近鄰)等。
我們將執行數據整理、過濾和測試六種不同的 ML 算法,以找出哪一種可以為我們的數據集提供最佳結果。 讓我們開始:
目錄
心髒病預測項目的目標
我們的心髒病預測項目的目標是確定患者是否應該被診斷出患有心髒病,這是一個二元結果,因此:
陽性結果=1,患者將被診斷患有心髒病。
陰性結果=0,患者不會被診斷出患有心髒病。
我們必須找到哪個分類模型具有最高的準確性並識別我們數據中的相關性。 最後,我們還必須確定哪些特徵對我們的心髒病診斷影響最大。
特徵
我們使用以下 13 個特徵 (X) 來確定我們的預測器 (Y):
- 年齡。
- 性別:1 = 男性,0 = 女性。
- (cp) 胸痛類型(4 個值 - 序數),第 1 值:典型心絞痛,第 2 值:非典型心絞痛,第 3 值:非心絞痛,第 4 值:無症狀。
- (trestbps) 靜息血壓。
- (chol) 血清膽固醇。
- (Fbs) – 空腹血糖 > 120 mg/dl。
- (retecg) – 靜息心電圖結果。
- (thalach) – 達到的最大心率。
- (exang) – 運動性心絞痛。
- (oldpeak) – 相對於休息,運動引起的 ST 段壓低。
- (斜率) – 峰值運動 ST 段的斜率。
- (ca) – 透視著色的主要血管數量。
- (thal) – 達到的最大心率(Ordinal),3 = 正常,6 = 固定缺陷,7 = 可逆缺陷。
第 1 步:數據整理
我們將首先通過將其轉換為更簡單、更易於理解的格式來查看我們正在使用的數據集。 它將幫助我們更恰當地使用數據。
將 numpy 導入為 np
將熊貓導入為 pd
將 matplotlib 導入為 plt
將 seaborn 導入為 sns
將 matplotlib.pyplot 導入為 plt
filePath = '/Users/upgrad/Downloads/datasets-33180-43520-heart.csv'
數據 = pd.read_csv(文件路徑)
數據頭(5)
年齡 | 性別 | cp | trestbps | 膽 | 臉書 | 重建 | 塔拉赫 | 出口 | 老峰 | 坡 | 約 | 塔爾 | 目標 | |
0 | 63 | 1 | 3 | 145 | 233 | 1 | 0 | 150 | 0 | 2.3 | 0 | 0 | 1 | 1 |
1 | 37 | 1 | 2 | 130 | 250 | 0 | 1 | 187 | 0 | 3.5 | 0 | 0 | 2 | 1 |
2 | 41 | 0 | 1 | 130 | 204 | 0 | 0 | 172 | 0 | 1.4 | 2 | 0 | 2 | 1 |
3 | 56 | 1 | 1 | 120 | 236 | 0 | 1 | 178 | 0 | 0.8 | 2 | 0 | 2 | 1 |
4 | 57 | 0 | 0 | 120 | 354 | 0 | 1 | 163 | 1 | 0.6 | 2 | 0 | 2 | 1 |
正如上面的代碼幫助我們以表格形式顯示數據一樣,我們將使用以下代碼進行進一步的數據整理:
打印(“(行,列):” + str(data.shape))
數據列
上面的代碼將顯示我們數據集中的總行數和列數以及列名。 我們數據中的總行數和列數分別為 303 和 14。 現在我們將使用以下函數找到每個變量的唯一值的數量:
data.nunique(軸=0
同樣,以下函數總結了數值變量的平均值、計數、標準差、最小值和最大值:
數據描述()
步驟 #2:進行 EDA
現在我們已經完成了數據整理,我們可以進行探索性數據分析。 以下是我們將在心髒病預測項目的這一階段執行的主要任務:
尋找相關性
我們將創建一個相關矩陣來幫助我們查看不同變量之間的相關性:
corr = data.corr()
plt.subplots(figsize=(15,10))
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))
sns.heatmap(corr, xticklabels=corr.columns,
yticklabels=corr.columns,
註釋=真,
cmap=sns.diverging_palette(220, 20, as_cmap=True))
為了找到特徵之間的直接相關性,我們還可以創建配對圖。 我們將使用只有連續變量的小對圖來更深入地研究關係:
subData = data[['age','trestbps','chol','thalach','oldpeak']]
sns.pairplot(子數據)
使用小提琴和箱線圖
通過小提琴和箱線圖,我們可以看到數據的基本統計和分佈。 您可以使用它來比較特定變量在不同類別中的分佈。 它還將幫助我們識別數據中的異常值。 使用以下代碼:
plt.figure(figsize=(12,8))
sns.violinplot(x= 'target', y= 'oldpeak',hue=”sex”, inner='quartile',data= data )
plt.title(“Thalach 水平與心髒病”,fontsize=20)
plt.xlabel(“心髒病目標”, fontsize=16)
plt.ylabel(“Thalach 水平”, fontsize=16)
在第一個小提琴和箱線圖中,我們發現陽性患者的 ST 段壓低中位數低於陰性患者。 因此,我們將使用圖表來比較 ST 抑鬱水平和心髒病。
plt.figure(figsize=(12,8))
sns.boxplot(x='target', y='thalach',hue=”sex”, data=data)
plt.title(“ST 抑鬱水平 vs. 心髒病”, fontsize=20)
plt.xlabel(“心髒病目標”,fontsize=16)
plt.ylabel(“運動相對於休息引起的 ST 壓低”, fontsize=16)
在這裡,與陰性患者相比,陽性患者的 ST 壓低水平中位數更高。
過濾數據
現在我們將根據陽性和陰性心髒病患者過濾數據。 我們將從過濾陽性心髒病患者的數據開始:
pos_data = 數據[數據['目標']==1]
pos_data.describe()
同樣,我們將根據陰性心髒病患者過濾數據:
pos_data = 數據[數據['目標']==0]
pos_data.describe()
第 3 步:使用機器學習算法
準備
在這裡,我們將通過將特徵分配給 X 並將最後一列分配給預測變量 Y 來準備訓練數據:
X = data.iloc[:, :-1].values
Y = data.iloc[:, -1}.values
然後,我們將數據分成兩組,訓練集和測試集:
從 sklearn.model_selection 導入 train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 1)
最後,我們將對數據進行歸一化,使其分佈的平均值為 0:
從 sklearn.preprocessing 導入 StandardScaler
sc = 標準縮放器()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)
訓練模型
在本節中,我們將使用多種機器學習算法並找到提供最高準確度的算法:
第一個模型:邏輯回歸
從 sklearn.metrics 導入分類報告
從 sklearn.linear_model 導入 LogisticRegression
model1 = LogisticRegression(random_state=1) # 獲取模型實例
model1.fit(x_train, y_train) # 訓練/擬合模型
y_pred1 = model1.predict(x_test) # 得到y個預測
print(classification_report(y_test, y_pred1)) # 輸出精度
該模型的準確率為 74%。
第二個模型:K-NN(K-最近鄰)
從 sklearn.metrics 導入分類報告
從 sklearn.neighbours 導入 KNeighboursClassifier
model2 = KNeighboursClassifier() # 獲取模型實例
model2.fit(x_train, y_train) # 訓練/擬合模型
y_pred2 = model2.predict(x_test) # 得到y個預測
print(classification_report(y_test, y_pred2)) # 輸出精度
該模型的準確率為 75%。
第三種模型:支持向量機(SVM)
從 sklearn.metrics 導入分類報告
從 sklearn.svm 導入 SVC
model3 = SVC(random_state=1) # 獲取模型實例
model3.fit(x_train, y_train) # 訓練/擬合模型
y_pred3 = model3.predict(x_test) # 得到y個預測
print(classification_report(y_test, y_pred3)) # 輸出精度
該模型的準確率為 75%。
第四模型:樸素貝葉斯分類器
從 sklearn.metrics 導入分類報告
從 sklearn.naive_bayes 導入 GaussianNB
model4 = GaussianNB() # 獲取模型實例
model4.fit(x_train, y_train) # 訓練/擬合模型
y_pred4 = model4.predict(x_test) # 得到y個預測
print(classification_report(y_test, y_pred4)) # 輸出精度
該模型的準確率為 77%。
第五個模型:隨機森林
從 sklearn.metrics 導入分類報告
從 sklearn.ensemble 導入 RandomForestClassifier
model6 = RandomForestClassifier(random_state=1)# 獲取模型實例
model6.fit(x_train, y_train) # 訓練/擬合模型
y_pred6 = model6.predict(x_test) # 得到y個預測
print(classification_report(y_test, y_pred6)) # 輸出精度
該模型的最高準確率為 80%。
第六款:XGBoost
從 xgboost 導入 XGBClassifier
model7 = XGBClassifier(random_state=1)
model7.fit(x_train, y_train)
y_pred7 = model7.predict(x_test)
打印(分類報告(y_test,y_pred7))
該模型的準確率為 69%。
在測試了不同的機器學習算法後,我們發現最好的算法是隨機森林,因為它為我們提供了 80% 的最佳準確度。
請記住,任何高於 80% 的準確率都好得令人難以置信,這可能是因為過度擬合。 這就是為什麼 80% 是達到的最佳數字。
第 4 步:查找特徵分數
在這裡,我們將找到特徵分數,它通過告訴我們哪個特徵對我們的模型最有用來幫助我們做出重要決策:
# 獲取重要性
重要性 = model6.feature_importances_
# 總結特徵重要性
對於枚舉中的 i,v(重要性):
print('特徵:%0d,得分:%.5f' % (i,v))
我們發現前四個特徵是胸痛類型 (cp)、達到的最大心率 (thalach)、主要血管數量 (ca) 和運動相對於休息引起的 ST 段壓低 (oldpeak)。
結論
恭喜,您現在已經成功完成了心髒病預測項目。 我們有 13 個特徵,其中最重要的是胸痛類型和達到的最大心率。
我們測試了六種不同的機器學習算法,發現最準確的算法是隨機森林。 你應該用測試集測試這個模型,看看這個模型的效果如何。
另一方面,如果您想了解更多關於機器學習和 AI 的信息,我們建議您查看我們的AI 課程。 您將直接向行業專家學習,並從事可以測試您知識的行業項目。 如果您對機器學習和人工智能領域的職業感興趣,請查看它們。
如果您有興趣了解有關機器學習的更多信息,請查看 IIIT-B 和 upGrad 的機器學習和 AI 執行 PG 計劃,該計劃專為工作專業人士設計,提供 450 多個小時的嚴格培訓、30 多個案例研究和作業、IIIT -B 校友身份,5 個以上實用的實踐頂點項目和頂級公司的工作協助。
機器學習如何幫助醫療保健行業?
如今,機器學習在醫療保健領域有許多有趣的用途。 總之,它的主要用途之一是檢測和診斷疾病。 從檢測罕見的遺傳疾病到癌症的早期階段,機器學習已被證明在這方面有很大幫助。 還有許多其他用途,如發現藥物、影像診斷、維護智能健康記錄、預防醫學(如行為改變)、預測疾病爆發和復發、改進放射治療、有效的臨床研究和患者試驗等等。
我怎樣才能成為醫療保健數據科學家?
鑑於醫療保健行業是世界上最龐大的數據來源之一,預計對醫療保健數據科學家的需求將會增加。 醫療保健和數據科學的融合是一條充滿希望且富有成效的道路,有抱負的健康數據科學家可以利用這種情況。 醫療數據科學是一個相對較新的領域; 它是統計學、數學、生物信息學、計算機科學和流行病學的混合體。 成為數據科學家的基礎和技能是相同的,但您將只關注醫療數據和應用程序。 使用 Python、R 和 SAS 進行計算機編程的知識會有所幫助。 全球頂尖大學提供醫療數據科學專業的研究生課程。
醫生需要了解數據科學嗎?
隨著人工智能和數據科學迅速進入主流,這些不僅僅是醫療保健領域的流行語。 這些技術在從大量數據集中提取臨床有用信息方面的巨大意義正在鼓勵醫生和醫生對這些領域重新產生興趣。 了解數據科學為醫生提供了額外的優勢,因為他們可以使用多參數信息和從連續監測中獲得的龐大數據集快速準確地診斷罕見疾病。 人工智能通過有效的數據可視化技術輔助診斷,並幫助他們了解臨床研究的統計重要性。