Główny projekt prognozowania chorób serca w 2022 r.
Opublikowany: 2021-05-26Witamy 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):
- Wiek.
- Płeć: 1 = mężczyzna, 0 = kobieta.
- (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.
- (trestbps) spoczynkowe ciśnienie krwi.
- (chol) cholesterol w surowicy.
- (Fbs) – poziom cukru we krwi na czczo > 120 mg/dl.
- (restecg) – spoczynkowe wyniki elektrokardiografii.
- (talach) – osiągnięte maksymalne tętno.
- (exang) – dusznica bolesna wywołana wysiłkiem fizycznym.
- (oldpeak) – obniżenie odcinka ST spowodowane wysiłkiem fizycznym w stosunku do odpoczynku.
- (slope) – nachylenie szczytowego odcinka ST ćwiczenia.
- (ca) – liczba głównych naczyń zabarwionych fluoroskopowo.
- (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.