Uczenie maszynowe
w medycynie
Michał Bieroński
Mateusz Burniak
Agenda
-
Czym jest uczenie maszynowe?
- Kategorie
-
Algorytmy
- Regresja liniowa
- Drzewa decyzyjne
- Random Forest
- KNN
-
Zastosowania
- Obrazowanie siatkówki
- Rak skóry
- Rak piersi + demo
-
Ciekawostki
- Kaggle, YOLO, MarI/O, Muzyka
Uczenie maszynowe
Dziedziny zastosowania
- Usługi finansowe (np. oszutwa, analiza giełdy)
- Rząd (np. przestępstwa, analiza budżetu)
- Medycyna (np. diagnozowanie chorób)
- Rynek (np. spersonalizowane reklamy)
- Przemysł energetyczny (np. posz. nowych źr. energii)
Kategorie
- Nadzorowane (Supervised)
- Nienadzorowane (Unsupervised)
- Przez wzmacnianie (Reinforcement)
Uczenie nadzorowane
Znane są poprawne wartości dla danych uczących.
- regresja
- drzewa decyzyjne
- random forest
- KNN
Uczenie nienadzorowane
Nie są znane dane wyjściowe.
Uczenie przez wzmacnianie
Metoda prób i błędów.
Regresja liniowa
Szukamy funkcji opisującej zależność jednej zmiennej w zależności od innych zmiennych (często pozornie nie związanych ze sobą)
Drzewa decyzyjne
Podział danych względem
najbardziej znaczących atrybutów.
Drzewa decyzyjne
Random Forest
Połączenie wielu drzew decyzyjnych w multiklasyfikator.
KNN
- Jeden z najprostszych klasyfikatorów
- Dobra jakość predykcji, lecz wolny
A teraz przykłady...
Obrazowanie siatkówki
Retinopatia cukrzycowa
Obrazowanie siatkówki
Retinopatia cukrzycowa
Obrazowanie siatkówki
Retinopatia cukrzycowa
Obrazowanie siatkówki
Retinopatia cukrzycowa
Rak piersi
Jednym z zastosowań uczenia maszynowego w medycynie jest klasyfikacja raka piersi
Procentowy rozkład zachorowań na nowotwory
ML w praktyce
Problem klasyfikacji złośliwości raka piersi
- złośliwy
- łagodny
Zestaw cech w pliku csv
- id
- diagnoza (M = złośliwy, B = łagodny)
- promień
- tekstura
- obwód
- obszar
- gładkość
- zawartość
- wklęsłość
- punkty wklęsłe
- symetria
- wymiar fraktalny
#header oznacza, że wiersz 0 będzie zawierać etykiety dla naszych danych
data = pd.read_csv("../input/data.csv",header=0)
#możemy teraz wypisać sobie przykładowo 2 wiersze danych
print(data.head(2))
#teraz chcielibyśmy uzyskać trochę informacji o wczytanych danych
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 569 entries, 0 to 568
Data columns (total 33 columns):
id 569 non-null int64
diagnosis 569 non-null object
radius_mean 569 non-null float64
texture_mean 569 non-null float64
perimeter_mean 569 non-null float64
area_mean 569 non-null float64
smoothness_mean 569 non-null float64
...
texture_worst 569 non-null float64
concave points_worst 569 non-null float64
symmetry_worst 569 non-null float64
fractal_dimension_worst 569 non-null float64
Unnamed: 32 0 non-null float64
dtypes: float64(31), int64(1), object(1)
memory usage: 146.8+ KB
Let's code!
#usuwamy pustą, nadmiarową kolumnę o nazwie "Unnamed: 32"
data.drop("Unnamed: 32",axis=1,inplace=True)
#sprawdźmy czy kolumna została porzucona
data.columns
Index(['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean',
'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',
'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',
'fractal_dimension_se', 'radius_worst', 'texture_worst',
'perimeter_worst', 'area_worst', 'smoothness_worst',
'compactness_worst', 'concavity_worst', 'concave points_worst',
'symmetry_worst', 'fractal_dimension_worst'],
dtype='object')
#analogicznie pozbywamy się kolumny id
data.drop("id",axis=1,inplace=True)
Selekcja cech
#Dzielimy cechy według odpowiednich kategorii
features_mean= list(data.columns[1:11])
features_se= list(data.columns[11:20])
features_worst=list(data.columns[21:31])
print(features_mean)
print("-----------------------------------")
print(features_se)
print("------------------------------------")
print(features_worst)
['radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean', 'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean']
-----------------------------------
['radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se']
------------------------------------
['radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst']
#Na koniec mapujemy typy diagnozy na łatwiejsze do przetwarzania
data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})
Selekcja cech
#Narysujmy sobie wykres częstości występowania danego typu diagnoz
sns.countplot(data['diagnosis'],label="Count")
Analiza danych
#Teraz wykorzystamy funkcje corr do znalezienia korelacji pomiędzy cechami
corr = data[features_mean].corr()
#A następnie utworzymy sobie tzw. heatmap'e,
#która ładnie nam też zależności przedstawi
plt.figure(figsize=(14,14))
sns.heatmap(corr, cbar = True,
square = True,
annot=True,
fmt= '.2f',
annot_kws={'size': 15},
xticklabels= features_mean,
yticklabels= features_mean,
cmap= 'coolwarm')
Analiza danych
#od teraz będziemy używać tylko tych cech
prediction_var = ['texture_mean','perimeter_mean','smoothness_mean',
'compactness_mean','symmetry_mean']
#dzielimy zbiór danych
train, test = train_test_split(data, test_size = 0.3)
train_X = train[prediction_var] # cechy wejściowe
train_y=train.diagnosis # spodziewane wyjścia
#tak samo dla zbioru testowego
test_X= test[prediction_var]
test_y =test.diagnosis
- radius, parameter oraz area są mocno skorelowane, więc wystaczy wybrać jedną z nich
- analogicznie compactness_mean, concavity_mean and concavepoint_mean
Odrzucamy nadmiarowe cechy
#Tworzymy model klasyfikatora
model=RandomForestClassifier(n_estimators=100)
#Trenujemy model
model.fit(train_X,train_y)
#dokonujemy predykcji na zbiorze testowym
prediction = model.predict(test_X)
#Mierzymy otrzymaną poprawnosc klasyfikatora
metrics.accuracy_score(prediction,test_y)
0.92982456140350878
Trenujemy i testujemy model
Nowotwór skóry
- Najpopularniejszy nowotwór w USA
- 1 na 5 Amerykanów będzie chorować
- W 2017 będzie 90k nowych zachorowań na czerniaka,
z czego 10k śmiertelnych
- Przeżywalność czerniaka to 98%
- W 2020 będzie w obiegu ponad 6 mld smartfonów
Nowotwór skóry
łagodny
złośliwy
Nowotwór skóry
Ciekawostki
MarI/O
Ciekawostki
YOLO
Ciekawostki
Kaggle
Ciekawostki
Kompozycja muzyki
Copy of im-sem
By bierus
Copy of im-sem
- 270