Top proiect de predicție a bolilor cardiace în 2022
Publicat: 2021-05-26Bun venit la acest tutorial pas cu pas al proiectului nostru de predicție a bolilor de inimă. Aici, veți crea un model de învățare automată care prezice dacă un pacient poate fi diagnosticat cu boli de inimă sau nu.
Ar trebui să fiți familiarizat cu elementele de bază ale învățării automate și ale analizei datelor pentru a lucra la acest proiect. Acest proiect necesită să fiți familiarizat cu mai mulți algoritmi ML, inclusiv Random Forest, K-NN (K-cel mai apropiat vecin) și multe altele.
Vom efectua dispute, filtrare și testare a datelor a șase algoritmi ML diferiți pentru a găsi care dintre ele oferă rezultatele optime pentru setul nostru de date. Sa incepem:
Cuprins
Obiectivul proiectului de predicție a bolilor cardiace
Scopul proiectului nostru de predicție a bolilor de inimă este de a determina dacă un pacient ar trebui să fie diagnosticat cu boală de inimă sau nu, ceea ce este un rezultat binar, deci:
Rezultat pozitiv = 1, pacientul va fi diagnosticat cu boală cardiacă.
Rezultat negativ = 0, pacientul nu va fi diagnosticat cu boală cardiacă.
Trebuie să găsim care model de clasificare are cea mai mare acuratețe și să identificăm corelații în datele noastre. În cele din urmă, trebuie să stabilim și care caracteristici sunt cele mai influente în diagnosticul bolilor noastre de inimă.
Caracteristici
Folosim următoarele 13 caracteristici (X) pentru a determina predictorul nostru (Y):
- Vârstă.
- Sex: 1 = Masculin, 0 = Femeie.
- (cp) tip de durere toracică (4 valori – Ordinal), 1-a valoare: angină tipică, a 2-a valoare: angina atipică, a 3-a valoare: durere non-anginoasă, a 4-a valoare: asimptomatică.
- (testbps) tensiune arterială în repaus.
- (chol) colesterol seric.
- (Fbs) – glicemia a jeun > 120 mg/dl.
- (restecg) – rezultate electrocardiografie de repaus.
- (talah) – ritmul cardiac maxim atins.
- (exang) – angină pectorală indusă de efort.
- (vârful vechi) – Depresiunea ST cauzată de efort relativ la odihnă.
- (pantă) – panta segmentului ST de vârf de exercițiu.
- (ca) – numărul de vase majore colorate prin fluoroscopie.
- (thal) – ritmul cardiac maxim atins (Ordinal), 3 = normal, 6 = defect fix, 7 = defect reversibil.
Pasul #1: Conflictul de date
Mai întâi ne vom uita la setul de date cu care lucrăm, transformându-l într-un format mai simplu și mai ușor de înțeles. Ne-ar ajuta să folosim datele în mod mai adecvat.
import numpy ca np
importa panda ca pd
import matplotlib ca plt
import seaborn ca sns
import matplotlib.pyplot ca plt
filePath = '/Users/upgrad/Downloads/datasets-33180-43520-heart.csv'
date = pd.read_csv(filePath)
data.head(5)
vârstă | sex | cp | trestbps | col | fbs | restecg | talach | exang | vârful vechi | pantă | ca | thal | ţintă | |
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 |
Așa cum codul de mai sus ne-a ajutat să afișăm datele noastre în formă tabelară, vom folosi următorul cod pentru o discuție ulterioară a datelor:
print(„(Rânduri, coloane): ” + str(data.shape))
date.coloane
Codul de mai sus va afișa numărul total de rânduri și coloane și numele coloanelor din setul nostru de date. Numărul total de rânduri și coloane din datele noastre este de 303, respectiv 14. Acum vom găsi numărul de valori unice pentru fiecare variabilă folosind următoarea funcție:
data.nunique(axa=0
În mod similar, următoarea funcție rezumă media, numărul, abaterea standard, minim și maxim pentru variabilele numerice:
data.describe()
Pasul #2: Efectuarea EDA
Acum, că am finalizat disputele de date, putem efectua o analiză exploratorie a datelor. Iată principalele sarcini pe care le vom îndeplini în această etapă a proiectului nostru de predicție a bolilor de inimă:
Găsirea corelațiilor
Vom crea o matrice de corelație care ne ajută să vedem corelațiile dintre diferite variabile:
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,
annot=Adevărat,
cmap=sns.diverging_palette(220, 20, as_cmap=True))
Pentru a găsi corelații imediate între caracteristici, putem crea și diagrame de perechi. Vom folosi diagrame de perechi mici cu doar variabile continue pentru a analiza mai profund relațiile:
subData = date[['age','testbps','chol','thalach','oldpeak']]
sns.pairplot(subData)
Folosind Vioara și Box Plots
Cu Violin and Box plots putem vedea statisticile de bază și distribuția datelor noastre. Îl puteți folosi pentru a compara distribuția unei anumite variabile în diferite categorii. Ne va ajuta să identificăm și valorile aberante din date. Utilizați următorul cod:
plt.figure(figsize=(12,8))
sns.violinplot(x= 'țintă', y= 'vârf vechi',hue=”sex”, inner='quartilă',data=date)
plt.title(„Nivelul Thalach vs. boli de inimă”,fontsize=20)
plt.xlabel(„Țintă pentru boli de inimă”, fontsize=16)
plt.ylabel(„Thalach Level”, fontsize=16)
În primul grafic Violin and Box, constatăm că pacienții pozitivi au o medie mai mică pentru depresia ST decât pacienții negativi. Deci, vom folosi un grafic pentru a compara nivelul depresiei ST și bolile de inimă.
plt.figure(figsize=(12,8))
sns.boxplot(x= 'țintă', y= 'thalach',hue=”sex”, date=date)
plt.title(„Nivelul depresiei ST vs. boli de inimă”, fontsize=20)
plt.xlabel(„Țintă pentru boli de inimă”,fontsize=16)
plt.ylabel(„Depresiunea ST indusă de exercițiu relativ la repaus”, fontsize=16)
Aici, pacienții pozitivi au avut o medie mai mare pentru nivelul depresiei ST în comparație cu pacienții negativi.
Filtrarea datelor
Acum vom filtra datele în funcție de pacienții cu boli cardiace pozitive și negative. Vom începe cu filtrarea datelor în funcție de pacienții cu boli cardiace pozitive:
pos_data = date[data['target']==1]
pos_data.describe()
În mod similar, vom filtra datele în funcție de pacienții cu boli cardiace negative:
pos_data = date[data['target']==0]
pos_data.describe()
Pasul #3: Utilizarea algoritmilor de învățare automată
Pregătirea
Aici, vom pregăti datele pentru antrenament, atribuind caracteristicile lui X și ultima coloană predictorului Y:
X = date.iloc[:, :-1].valori
Y = date.iloc[:, -1}.valori
Apoi, vom împărți datele în două seturi, set de antrenament și set de testare:
din sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0,2, random_state = 1)
În cele din urmă, vom normaliza datele, astfel încât distribuția lor să aibă o medie de 0:
din sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)
Antrenarea modelului
În această secțiune, vom folosi mai mulți algoritmi de învățare automată și vom găsi pe cel care oferă cea mai mare acuratețe:
Primul model: Regresia logistică
din sklearn.metrics import classification_report
din sklearn.linear_model import LogisticRegression
model1 = LogisticRegression(random_state=1) # obține o instanță a modelului
model1.fit(x_train, y_train) # Antrenează/Fit model
y_pred1 = model1.predict(x_test) # obțineți predicții y
print(classification_report(y_test, y_pred1)) # acuratețea ieșirii
Precizia acestui model a fost de 74%.
Al doilea model: K-NN (K-Cei mai apropiati vecini)
din sklearn.metrics import classification_report
din sklearn.neighbours import KNeighboursClassifier
model2 = KNeighboursClassifier() # obține o instanță a modelului
model2.fit(x_train, y_train) # Antrenează/Fit model
y_pred2 = model2.predict(x_test) # obțineți predicții y
print(classification_report(y_test, y_pred2)) # acuratețea ieșirii
Precizia acestui model a fost de 75%.
Al treilea model: Suport Vector Machine (SVM)
din sklearn.metrics import classification_report
din sklearn.svm import SVC
model3 = SVC(random_state=1) # obține o instanță a modelului
model3.fit(x_train, y_train) # Antrenează/Fit model
y_pred3 = model3.predict(x_test) # obțineți predicții y
print(classification_report(y_test, y_pred3)) # acuratețea ieșirii
Precizia acestui model a fost de 75%.
Al 4-lea model: Naive Bayes Clasifier
din sklearn.metrics import classification_report
din sklearn.naive_bayes import GaussianNB
model4 = GaussianNB() # obține o instanță a modelului
model4.fit(x_train, y_train) # Antrenează/Fit model
y_pred4 = model4.predict(x_test) # obțineți predicții y
print(classification_report(y_test, y_pred4)) # acuratețea ieșirii
Precizia acestui model a fost de 77%.
Al 5-lea model: Random Forest
din sklearn.metrics import classification_report
din sklearn.ensemble import RandomForestClassifier
model6 = RandomForestClassifier(random_state=1)# obține o instanță a modelului
model6.fit(x_train, y_train) # Antrenează/Fit model
y_pred6 = model6.predict(x_test) # obțineți predicții y
print(classification_report(y_test, y_pred6)) # acuratețea ieșirii
Acest model a avut cea mai mare precizie de 80%.
Al șaselea model: XGBoost
de la xgboost import XGBClassifier
model7 = XGBClassifier(random_state=1)
model7.fit(x_train, y_train)
y_pred7 = model7.predict(x_test)
print(raport_clasificare(y_test, y_pred7))
Precizia acestui model a fost de 69%.
După ce am testat diferiți algoritmi ML, am constatat că cel mai bun a fost Random Forest, deoarece ne-a oferit o precizie optimă de 80%.
Rețineți că orice procent de precizie mai mare de 80% este prea bun pentru a fi adevărat și ar putea fi din cauza supraajustării. De aceea, 80% este numărul optim de atins.
Pasul #4: Găsirea scorului caracteristicii
Aici, vom găsi Scorul caracteristicilor, care ne ajută să luăm decizii importante, spunându-ne care caracteristică a fost cea mai utilă pentru modelul nostru:
# obține importanță
importanta = model6.feature_importances_
# rezuma importanța caracteristicii
pentru i,v în enumerate(importanța):
print('Feature: %0d, Scor: %.5f' % (i,v))
Am descoperit că primele patru caracteristici au fost tipul durerii în piept (cp), ritmul cardiac maxim atins (talah), numărul de vase majore (ca) și depresia ST cauzată de efort în raport cu repausul (vârful vechi).
Concluzie
Felicitări, acum ați finalizat cu succes proiectul de predicție a bolilor de inimă. Am avut 13 caracteristici, dintre care am constatat că cele mai importante au fost tipul durerii în piept și ritmul cardiac maxim atins.
Am testat șase algoritmi ML diferiți și am constatat că cel mai precis algoritm a fost Random Forest. Ar trebui să testați acest model cu setul de testare și să vedeți cât de bine funcționează acest model.
Pe de altă parte, dacă doriți să aflați mai multe despre învățarea automată și AI, vă recomandăm să consultați cursurile noastre AI . Veți studia direct de la experți din industrie și veți lucra la proiecte din industrie care vă permit să vă testați cunoștințele. Verificați-le dacă sunteți interesat de o carieră în învățarea automată și AI.
Dacă sunteți interesat să aflați mai multe despre învățarea automată, consultați Programul Executive PG de la IIIT-B și upGrad în Învățare automată și IA, care este conceput pentru profesioniști care lucrează și oferă peste 450 de ore de pregătire riguroasă, peste 30 de studii de caz și sarcini, IIIT -B Statut de absolvenți, peste 5 proiecte practice practice și asistență pentru locuri de muncă cu firme de top.
Cum ajută învățarea automată sectorul sănătății?
Există multe utilizări interesante ale învățării automate în sectorul sănătății astăzi. Dintre toate, una dintre utilizările sale principale este pentru detectarea și diagnosticarea bolilor. Pornind de la detectarea bolilor genetice rare până la stadiile incipiente ale cancerului, învățarea automată s-a dovedit a fi de mare ajutor în acest sens. Există multe alte utilizări, cum ar fi descoperirea medicamentelor, diagnosticarea imagistică, menținerea înregistrărilor medicale inteligente, medicina preventivă, cum ar fi modificarea comportamentului, predicția focarelor și recurențelor bolii, îmbunătățirea radioterapia, cercetarea clinică eficientă și studiile pe pacienți și multe altele.
Cum pot deveni un om de știință în domeniul sănătății?
Având în vedere că industria sănătății este una dintre cele mai masive surse de date din lume, este de așteptat să crească cererea de oameni de știință în domeniul sănătății. Fuziunea dintre asistența medicală și știința datelor este o cale promițătoare și fructuoasă, iar oamenii de știință care aspiră la date despre sănătate pot profita de această situație. Știința datelor în domeniul sănătății este un domeniu relativ nou; este un amestec de statistică, matematică, bioinformatică, informatică și epidemiologie. Fundația și setul de abilități pentru a deveni un om de știință în domeniul datelor sunt aceleași, dar concentrarea dvs. se va concentra exclusiv pe datele și aplicațiile de asistență medicală. Cunoștințele despre programarea computerelor folosind Python, R și SAS vor fi de ajutor. Universitățile de top din lume oferă programe postuniversitare specializate în știința datelor din domeniul sănătății.
Medicii trebuie să cunoască știința datelor?
Cu inteligența artificială și știința datelor câștigând rapid intrarea în masă, acestea sunt mai mult decât cuvinte la modă în sectorul sănătății. Semnificația imensă a acestor tehnologii în extragerea de informații utile din punct de vedere clinic din bucăți masive de seturi de date încurajează medicii și medicii să manifeste un interes reînnoit pentru aceste domenii. Cunoașterea științei datelor oferă un avantaj suplimentar medicilor, deoarece aceștia pot diagnostica rapid și precis bolile rare folosind informații cu mai mulți parametri și seturi uriașe de date obținute din monitorizarea continuă. AI ajută la diagnosticare prin tehnici eficiente de vizualizare a datelor și îi ajută să aprecieze importanța statistică a studiilor clinice.