Główny projekt prognozowania chorób serca w 2022 r.

Opublikowany: 2021-05-26

Witamy w tym samouczku krok po kroku naszego projektu przewidywania chorób serca. Tutaj stworzysz model uczenia maszynowego, który przewiduje, czy u pacjenta można zdiagnozować chorobę serca, czy nie.

Aby pracować nad tym projektem, powinieneś znać podstawy uczenia maszynowego i analizy danych. Ten projekt wymaga znajomości wielu algorytmów ML, w tym Random Forest, K-NN (K-najbliższy sąsiad) i wielu innych.

Przeprowadzimy wymianę danych, filtrowanie i testujemy sześć różnych algorytmów ML, aby znaleźć ten, który oferuje optymalne wyniki dla naszego zbioru danych. Zaczynajmy:

Spis treści

Cel projektu prognozowania chorób serca

Celem naszego projektu przewidywania chorób serca jest ustalenie, czy u pacjenta należy zdiagnozować chorobę serca, czy nie, co jest wynikiem binarnym, a więc:

Wynik pozytywny = 1, u pacjenta zostanie zdiagnozowana choroba serca.

Wynik ujemny = 0, u pacjenta nie zostanie zdiagnozowana choroba serca.

Musimy ustalić, który model klasyfikacji ma największą dokładność i zidentyfikować korelacje w naszych danych. Na koniec musimy również określić, które cechy mają największy wpływ na diagnozę naszej choroby serca.

Cechy

Używamy następujących 13 funkcji (X), aby określić nasz predyktor (Y):

  1. Wiek.
  2. Płeć: 1 = mężczyzna, 0 = kobieta.
  3. (cp) rodzaj bólu w klatce piersiowej (4 wartości – Porządkowe), I wartość: typowa dławica piersiowa, II wartość: nietypowa dławica piersiowa, III wartość: ból niedławicowy, IV wartość: bezobjawowy.
  4. (trestbps) spoczynkowe ciśnienie krwi.
  5. (chol) cholesterol w surowicy.
  6. (Fbs) – poziom cukru we krwi na czczo > 120 mg/dl.
  7. (restecg) – spoczynkowe wyniki elektrokardiografii.
  8. (talach) – osiągnięte maksymalne tętno.
  9. (exang) – dusznica bolesna wywołana wysiłkiem fizycznym.
  10. (oldpeak) – obniżenie odcinka ST spowodowane wysiłkiem fizycznym w stosunku do odpoczynku.
  11. (slope) – nachylenie szczytowego odcinka ST ćwiczenia.
  12. (ca) – liczba głównych naczyń zabarwionych fluoroskopowo.
  13. (thal) – maksymalne osiągnięte tętno (Porządkowe), 3 = normalne, 6 = wada stała, 7 = wada odwracalna.

Krok 1: Walka o dane

Najpierw przyjrzymy się zbiorowi danych, z którym pracujemy, konwertując go na prostszy i bardziej zrozumiały format. Pomogłoby nam to w bardziej odpowiednim wykorzystaniu danych.

importuj numer jako np

importuj pandy jako PD

importuj matplotlib jako plt

importuj seaborn jako sns

importuj matplotlib.pyplot jako plt

filePath = '/Users/upgrad/Downloads/datasets-33180-43520-heart.csv'

dane = pd.read_csv(ścieżka pliku)

data.head(5)

wiek seks cp Trestbps chol fbs restecg talach eksang stary szczyt nachylenie może thal cel
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

Tak jak powyższy kod pomógł nam wyświetlić nasze dane w formie tabelarycznej, użyjemy następującego kodu do dalszej wymiany danych:

print(“(Wiersze, kolumny): ” + str(data.shape))

dane.kolumny

Powyższy kod pokaże całkowitą liczbę wierszy i kolumn oraz nazwy kolumn w naszym zbiorze danych. Łączna liczba wierszy i kolumn w naszych danych to odpowiednio 303 i 14. Teraz znajdziemy liczbę unikalnych wartości dla każdej zmiennej za pomocą następującej funkcji:

data.nunique(oś=0

Podobnie, następująca funkcja podsumowuje średnią, liczbę, odchylenie standardowe, minimum i maksimum dla zmiennych liczbowych:

dane.opis()

Krok #2: Przeprowadzanie EDA

Teraz, gdy zakończyliśmy wymianę danych, możemy przeprowadzić eksploracyjną analizę danych. Oto podstawowe zadania, które wykonamy na tym etapie naszego projektu przewidywania chorób serca:

Znajdowanie korelacji

Stworzymy macierz korelacji, która pomoże nam zobaczyć korelacje między różnymi zmiennymi:

corr = dane.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=Prawda,

cmap=sns.diverging_palette(220, 20, as_cmap=True))

Aby znaleźć bezpośrednie korelacje między cechami, możemy również utworzyć wykresy parami. Użyjemy małych wykresów par zawierających tylko zmienne ciągłe, aby przyjrzeć się bliżej relacjom:

subData = data[['wiek','trestbps','chol','thalach','stary szczyt']]

sns.pairplot(subData)

Korzystanie z wykresów skrzypcowych i skrzynkowych

Dzięki wykresom skrzypcowym i skrzynkowym możemy zobaczyć podstawowe statystyki i rozkład naszych danych. Możesz go użyć do porównania rozkładu określonej zmiennej w różnych kategoriach. Pomoże nam to również zidentyfikować wartości odstające w danych. Użyj następującego kodu:

plt.figure(figsize=(12,8))

sns.violinplot(x= 'cel', y= 'stary szczyt',hue=”płeć”, inner='kwartyl',data= dane )

plt.title(„Poziom Thalach a choroba serca”, fontsize=20)

plt.xlabel(„Cel choroby serca”, rozmiar czcionki=16)

plt.ylabel(„Poziom Talach”, rozmiar czcionki=16)

Na pierwszym wykresie skrzypiec i pudełka stwierdzamy, że pacjenci z wynikiem dodatnim mają niższą medianę obniżenia ST niż pacjenci z ujemnym wynikiem testu. Tak więc użyjemy wykresu do porównania poziomu obniżenia ST i choroby serca.

plt.figure(figsize=(12,8))

sns.boxplot(x= 'cel', y= 'thalach',hue=”seks”, data=dane )

plt.title(„Poziom depresji ST a choroba serca”, rozmiar czcionki=20)

plt.xlabel(„Cel choroby serca”, fontsize=16)

plt.ylabel("Obniżenie odcinka ST wywołane wysiłkiem fizycznym w stosunku do odpoczynku", fontsize=16)

W tym przypadku pacjenci z wynikiem dodatnim mieli wyższą medianę poziomu obniżenia ST w porównaniu z pacjentami z ujemnym wynikiem badania.

Filtrowanie danych

Teraz przefiltrujemy dane według pacjentów z dodatnimi i ujemnymi chorobami serca. Zaczniemy od filtrowania danych według pacjentów z dodatnimi chorobami serca:

poz_data = dane[dane['cel']==1]

pos_data.describe()

Podobnie przefiltrujemy dane według pacjentów z ujemnymi chorobami serca:

poz_data = dane[dane['cel']==0]

pos_data.describe()

Krok 3: Korzystanie z algorytmów uczenia maszynowego

Przygotowanie

Tutaj przygotujemy dane do trenowania, przypisując cechy do X, a ostatnią kolumnę do predyktora Y:

X = dane.iloc[:, :-1].wartości

Y = dane.iloc[:, -1}.wartości

Następnie podzielimy dane na dwa zestawy, zestaw uczący i zestaw testowy:

ze sklearn.model_selection importuj train_test_split

x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0,2, random_state = 1)

Na koniec znormalizujemy dane, aby ich rozkład miał średnią 0:

ze sklearn.preprocessing import StandardScaler

sc = Standardowy skaler()

x_train = sc.fit_transform(x_train)

x_test = sc.transform(x_test)

Szkolenie modelki

W tej sekcji użyjemy wielu algorytmów uczenia maszynowego i znajdziemy ten, który oferuje najwyższą dokładność:

1. model: regresja logistyczna

ze sklearn.metrics importu Classification_report

ze sklearn.linear_model import LogisticRegression

model1 = LogisticRegression(random_state=1) # pobierz instancję modelu

model1.fit(x_train, y_train) # Train/Fit model

y_pred1 = model1.predict(x_test) # uzyskaj y prognoz

print(classification_report(y_test, y_pred1)) # dokładność wyjściowa

Dokładność tego modelu wyniosła 74%.

Drugi model: K-NN (K-Najbliżsi sąsiedzi)

ze sklearn.metrics importu Classification_report

from sklearn.neighbours import KNeighboursClassifier

model2 = KNeighboursClassifier() # pobierz instancję modelu

model2.fit(x_train, y_train) # Train/Fit model

y_pred2 = model2.predict(x_test) # uzyskaj y prognoz

print(classification_report(y_test, y_pred2)) # dokładność wyjściowa

Dokładność tego modelu wyniosła 75%.

Trzeci model: maszyna wektorów nośnych (SVM)

ze sklearn.metrics importu Classification_report

z sklearn.svm import SVC

model3 = SVC(losowy_stan=1) # pobierz instancję modelu

model3.fit(x_train, y_train) # Train/Fit model

y_pred3 = model3.predict(x_test) # uzyskaj y prognoz

print(classification_report(y_test, y_pred3)) # dokładność wyjściowa

Dokładność tego modelu wyniosła 75%.

Czwarty model: naiwny klasyfikator Bayesa

ze sklearn.metrics importu Classification_report

z sklearn.naive_bayes import GaussianNB

model4 = GaussianNB() # pobierz instancję modelu

model4.fit(x_train, y_train) # Train/Fit model

y_pred4 = model4.predict(x_test) # uzyskaj y prognoz

print(classification_report(y_test, y_pred4)) # dokładność wyjściowa

Dokładność tego modelu wyniosła 77%.

Piąty model: losowy las

ze sklearn.metrics importu Classification_report

z sklearn.ensemble import RandomForestClassifier

model6 = RandomForestClassifier(random_state=1)# pobierz instancję modelu

model6.fit(x_train, y_train) # Train/Fit model

y_pred6 = model6.predict(x_test) # uzyskaj y prognoz

print(classification_report(y_test, y_pred6)) # dokładność wyjściowa

Model ten miał najwyższą dokładność 80%.

Szósty model: XGBoost

z xgboost import XGBClassifier

model7 = XGBClassifier(losowy_stan=1)

model7.fit(x_train, y_train)

y_pred7 = model7.predict(x_test)

drukuj(raport_klasyfikacji(y_test, y_pred7))

Dokładność tego modelu wyniosła 69%.

Po przetestowaniu różnych algorytmów ML odkryliśmy, że najlepszym z nich był Losowy Las, ponieważ zapewniał nam optymalną dokładność 80%.

Należy pamiętać, że jakikolwiek procent dokładności wyższy niż 80% jest zbyt dobry, aby był prawdziwy i może to wynikać z nadmiernego dopasowania. Dlatego 80% to optymalna liczba do osiągnięcia.

Krok 4: Znajdowanie wyniku funkcji

Tutaj znajduje się wynik funkcji, który pomaga nam podejmować ważne decyzje, informując nas, która funkcja była najbardziej użyteczna dla naszego modelu:

# zyskać na znaczeniu

ważność = model6.cecha_ważność_

# podsumuj znaczenie funkcji

dla i, v w enumerate (ważność):

print('Funkcja: %0d, Wynik: %.5f' % (i,v))

Stwierdziliśmy, że cztery najważniejsze cechy to rodzaj bólu w klatce piersiowej (cp), osiągnięte maksymalne tętno (talach), liczba głównych naczyń (ca) i obniżenie odcinka ST spowodowane wysiłkiem fizycznym w stosunku do odpoczynku (oldpeak).

Wniosek

Gratulacje, pomyślnie zakończyłeś projekt przewidywania chorób serca. Mieliśmy 13 cech, z których najważniejsze to rodzaj bólu w klatce piersiowej i osiągnięte tętno maksymalne.

Przetestowaliśmy sześć różnych algorytmów ML i stwierdziliśmy, że najdokładniejszym algorytmem był losowy las. Powinieneś przetestować ten model za pomocą zestawu testowego i zobaczyć, jak dobrze ten model działa.

Z drugiej strony, jeśli chcesz dowiedzieć się więcej o uczeniu maszynowym i sztucznej inteligencji, zalecamy zapoznanie się z naszymi kursami AI . Będziesz uczyć się bezpośrednio od ekspertów branżowych i pracować nad projektami branżowymi, które pozwolą Ci sprawdzić swoją wiedzę. Sprawdź je, jeśli interesuje Cię kariera w uczeniu maszynowym i sztucznej inteligencji.

Jeśli chcesz dowiedzieć się więcej o uczeniu maszynowym, zapoznaj się z programem IIIT-B i upGrad Executive PG w zakresie uczenia maszynowego i sztucznej inteligencji, który jest przeznaczony dla pracujących profesjonalistów i oferuje ponad 450 godzin rygorystycznych szkoleń, ponad 30 studiów przypadków i zadań, IIIT Status -B Alumni, ponad 5 praktycznych praktycznych projektów zwieńczenia i pomoc w pracy z najlepszymi firmami.

W jaki sposób uczenie maszynowe pomaga sektorowi opieki zdrowotnej?

Obecnie w sektorze opieki zdrowotnej istnieje wiele interesujących zastosowań uczenia maszynowego. Jednym z jego podstawowych zastosowań jest wykrywanie i diagnozowanie chorób. Począwszy od wykrywania rzadkich schorzeń genetycznych do wczesnych stadiów raka, uczenie maszynowe okazało się bardzo pomocne w tym zakresie. Istnieje wiele innych zastosowań, takich jak odkrywanie leków, diagnostyka obrazowa, prowadzenie inteligentnej dokumentacji medycznej, medycyna prewencyjna, taka jak modyfikacja behawioralna, przewidywanie wybuchów i nawrotów choroby, ulepszanie radioterapii, wydajne badania kliniczne i próby pacjentów i wiele innych.

Jak mogę zostać naukowcem zajmującym się danymi medycznymi?

Biorąc pod uwagę, że branża opieki zdrowotnej jest jednym z najbardziej masywnych źródeł danych na świecie, oczekuje się, że zapotrzebowanie na naukowców zajmujących się danymi w opiece zdrowotnej wzrośnie. Połączenie opieki zdrowotnej i nauki o danych jest obiecującą i owocną ścieżką, a początkujący naukowcy zajmujący się danymi zdrowotnymi mogą skorzystać z tej sytuacji. Nauka o danych w opiece zdrowotnej jest stosunkowo nową dziedziną; to mieszanka statystyki, matematyki, bioinformatyki, informatyki i epidemiologii. Podstawa i zestaw umiejętności do zostania naukowcem danych są takie same, ale skupisz się wyłącznie na danych i aplikacjach opieki zdrowotnej. Pomocna będzie znajomość programowania komputerów z wykorzystaniem Python, R i SAS. Najlepsze światowe uniwersytety oferują specjalistyczne programy podyplomowe w zakresie nauki o danych w opiece zdrowotnej.

Czy lekarze muszą znać się na data science?

Ponieważ sztuczna inteligencja i nauka o danych szybko zdobywają popularność, są to coś więcej niż tylko modne hasła w sektorze opieki zdrowotnej. Ogromne znaczenie tych technologii w wydobywaniu klinicznie użytecznych informacji z ogromnych zbiorów danych zachęca lekarzy i lekarzy do ponownego zainteresowania tymi dziedzinami. Znajomość nauki o danych zapewnia lekarzom dodatkową korzyść, ponieważ mogą szybko i dokładnie diagnozować rzadkie choroby, korzystając z wieloparametrowych informacji i ogromnych zbiorów danych uzyskanych z ciągłego monitorowania. Sztuczna inteligencja wspomaga diagnozę dzięki skutecznym technikom wizualizacji danych i pomaga im docenić statystyczne znaczenie badań klinicznych.