Medicina, unul dintre cele mai relevante domenii de studiu, este cunoscută drept destul de conservatoare în ceea ce privește adaptarea de noi tehnologii. Ceea ce este ușor justificabil, întrucât aceasta are ca scop primar prezervarea vieții umane, iar comiterea celei mai mici dintre greșeli, poate avea efecte devastatoare și de lungă durată. Astfel, integrarea de Machine Learning în practica sa este privită cu reticență de către specialiștii în domeniu, chiar dacă diverse aplicații sunt disponibile de zeci de ani.
Prima și poate cea mai simplă utilizare a Machine Learningului în medicină este aceea de a da sens unor date a căror caracteristică principală e complexitatea. Multe afecțiuni grave tind să fie diagnosticate cu ajutorul a diverși factori, respectiv simptome. Cu toate acestea, acest proces de diagnosticare nu este tocmai simplu. În fapt, anticiparea și prevenirea uneia dintre cele mai mari cauze de mortalitate pot fi extrem de dificile sau chiar imposibile. Această problemă este accentuată de faptul că, în încercarea de prevenire a bolii, sunt luați în considerare multipli factori; aceștia au ca atribut primar complexitatea, motiv pentru care este dificil de determinat care dintre aceștia are influența cea mai mare.
Pentru această primă demonstrație, am folosit librăria sklearn în python combinată cu setul de date Cardiovasculare de la Kaggle. În Fig. 1 putem vedea un mic eșantion din acest set de date:
(ap_hi: Systolic blood pressure, ap_lo: Diastolic blood Pressure) Fig. 1. Dataset sample
Scopul inițial al acestui set de date a fost acela de a urmări informațiile despre pacienți și de a vedea ce informații medicale pot fi indici clari ai unei boli de inimă. Ar trebui să se observe instant varietatea de factori care sunt luați în considerare atunci când se diagnostichează prezența unei astfel de boli, reprezentată printr-o valoare binară în coloana "cardio" a setului de date. Și, din păcate, nu pare să existe o distincție clară între persoanele cu boli de inimă și cele fără. Luând în considerare cele 11 variabile independente din tabel, am putea obține un total de 112 diagrame, care ne-ar putea ajuta să înțelegem care sunt factorii determinanți care favorizează apariția bolilor de inimă.
Desigur, acest lucru nu este ușor, deoarece parcurgerea a 121 de diagrame diferite ar necesita prea mult timp sau efort și, în final, s-ar putea să nu existe o distincție clară între cei care suferă și cei care nu suferă de boli de inimă.
Acesta este, de fapt, cazul acestor date. În ciuda faptului că avem peste 121 de diagrame din care să alegem - cu o mare diversitate de reprezentări - nu este posibil să diferențiem pacienții.
Fig. 2. Plots
Cauza acestei dificultăți? Afecțiunile medicale nu sunt rezultatul unui singur factor, ci, mai degrabă, rezultatul interacțiunii mai multor factori. Ca rezultat, astfel de diagrame, care sunt simple în esență nu ar putea să transpună cu exactitate întreaga poveste care, în fapt, poate fi extrem de complexă. Din fericire, există modalități de a elimina acest risc cu ajutorul unuia dintre cele mai utilizate modele de Machine Learning, și anume Random Forest sau o variantă a Random Forest numită Gradient Boosting Machines.
În ciuda simplității modelului și a implementării sale, acesta ne oferă o explicație a factorilor influențatori, care altfel ar fi putut fi omisă.
Codul acesta nu pare semnificativ, dar dacă analizăm explicația de mai jos, vom observa că, de fapt, este.
from sklearn.ensemble
import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
param_grid={
'loss': ['deviance', 'exponential']
, 'learning_rate': np.arange(0.01,0.2, step =0.04)
, 'n_estimators': np.arange(50,200, step =40)
, 'max_features' : ['auto', 'sqrt', 'log2']
}
estimator = GradientBoostingClassifier()
grid = GridSearchCV(estimator=estimator
, param_grid=param_grid
, scoring='accuracy'
, cv=4
, verbose=2)
grid.fit(X_train, y_train)
Fig. 3. Feature Importance
Graficul de mai sus ne arată, în ordinea descrescătoare a relevanței, factorii determinanți care cauzează boli de inimă. "rand_var" este o variabilă aleatorie care este utilizată pentru a stabili dacă un factor este, de fapt, determinant sau nu. Astfel, putem observa că, în mod surprinzător, nivelul de activitate fizică, obiceiul de a fuma, consumul de alcool și sexul nu sunt printre factorii determinați.
În ordine descrescătoare, factorii determinanți sunt următorii: tensiunea arterială, vârsta, nivelul de colesterol, greutatea, nivelul de glucoză și, în mod surprinzător, înălțimea - da, persoanele înalte sunt mai predispuse la boli de inimă.
Fig. 4. Radiografie pulmonară - Pneumonie - PAUL MOONEY, 2018 (Chest X-Ray Images (Pneumonia) | Kaggle )
Fig. 5. Radiografie pulmonară - Pneumonie - PAUL MOONEY, 2018 (Chest X-Ray Images (Pneumonia) | Kaggle )
Când ne gândim la medici, îi asociem instant cu acele persoane care ne tratează afecțiunile, dar, de fapt, cea mai mare parte din timpul unui medic este petrecut pentru a stabili diagnosticul corect, în timp ce partea de tratament se limitează adesea la a prescrie tratamentul corect pentru acel diagnostic. Aceasta este o problemă exacerbată în special în țările în care rata de medici pe cap de locuitor este scăzută, ceea ce duce la crearea unui ciclu în care medicii ajung la epuizare din cauza numărului mare de diagnostice necesare. Astfel, se creează un exod al medicilor, accentuând și mai mult problema.
Acesta este locul unde Machine Learning poate fi de ajutor, prin automatizarea procedurii de diagnosticare, care necesită mult timp. În acest exemplu, am folosit librăria TensorFlow împreună cu un model pe TensorHub și setul de date de radiografii toracice de la Kaggle (Fig. 4 este a unui pacient sănătos, iar Fig. 5 este a unui pacient cu pneumonie). Pentru ochiul neexperimentat și chiar pentru cel al unui medic experimentat, acestea ar părea poate greu de distins, ceea ce este de înțeles. Să ne amintim că un medic dedică cea mai mare parte a timpului diagnosticării pacientului și dacă încercăm să distingem cele două scanări putem înțelege de ce.
Aici Machine Learning poate avea un rol esențial - acest proces consumator de timp ar putea fi redus cu ușurință cu doar câteva linii de cod. Dar, înainte de a face acest lucru, trebuie să stabilim care este sistemul metric de interes. Este vorba de acuratețe? Intuitiv, am spune că da, până când ne gândim că majoritatea persoanelor care intră în cabinetul unui medic nu are pneumonie, astfel încât, dacă am afirma că nimeni are pneumonie, am obține o precizie de peste 99%, care, deși impresionantă, nu este foarte utilă din punct de vedere medical.
Ar fi poate mai ușor dacă am începe analiza din perspectiva obiectivului final. Obiectivul unui medic este de a depista cât mai multe persoane dintre cele ce suferă de pneumonie. Astfel, dorim o rată ridicată de detectare a persoanelor care au pneumonie. Pentru acest tip de detecție, în cazul în care suntem interesați să găsim pacienții cu adevărat pozitivi care suferă de pneumonie, există o astfel de măsurătoare numită "recall".
Codul de mai jos reprezintă elementele necesare pentru a crea un model eficient:
resnet =
'https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/5'
model_4 = create_model(model_url=resnet,
num_classes=2)
model_4.compile(loss=BinaryCrossentropy()
, optimizer=Adam()
, metrics=['accuracy'])
history = model_4.fit(aug_train_data
, validation_data=val_data
, epochs=10
, workers = 16
, use_multiprocessing=True
, steps_per_epoch=len(aug_train_data)
, validation_steps = len(val_data))
Cu o perioadă de "învăţare" de mai puțin de 10 minute, putem observa rezultatele de mai jos care, așa cum am menționat mai devreme, par să fie o realizare a obiectivului nostru declarat de a avea un model cu un "recall" ridicat în ceea ce privește pneumonia.
Fig. 6.
Valoarea de recall pentru clasa 1 (Pneumonie) este de 0,99 (99%), ceea ce înseamnă că peste 99% dintre radiografiile care au prezentat pneumonie au fost detectate corect ca având pneumonie.
Se poate observa că acuratețea (89%), este mai mică decât recallul pentru pneumonie. Pentru a înțelege mai bine acest lucru, putem analiza în continuare rezultatele noastre sub forma unei matrici de confuzie. O matrice de confuzie este utilizată pentru a arăta comparațiile dintre performanța clasificatorului în ceea ce privește predicția de pozitivi și negativi reali față de negativi și pozitivi falși.
Consecințele unei rate de recall ridicate și ale unei precizii ușor mai scăzute pot fi observate mai jos:
Fig. 7. True vs. predicted values
Putem observa că, în timp ce majoritatea persoanelor cu pneumonie a fost identificată corect, aproximativ 10% dintre pacienții care nu aveau pneumonie au fost, de asemenea, clasificați ca având pneumonie.
Acest lucru ne duce la ultimul punct care trebuie subliniat atunci când discutăm despre modelele de Machine Learning în ceea ce privește aplicarea lor în domeniul medical - aceste instrumente nu îi pot înlocui pe medici, deoarece este nevoie de expertiza medicală a acestora pentru a fi create.
Suntem adesea tentați să credem că Machine Learning va face ca anumite profesii să devină irelevante, dar, de multe ori, acest lucru nu se aplică. Cu siguranță nu este cazul în medicină. Motivul fiind, pentru ca aceste modele să fie create, ele au nevoie de istoricul de diagnostice al medicilor pentru stabilirea tiparului - cu cât medicul este mai bun, cu atât mai bună este acuratețea diagnosticului său și cu atât mai bun este modelul atunci când este creat.
Astfel, utilizarea acestor modele nu are ca scop înlocuirea medicilor, ci mai degrabă îmbunătățirea abilităților acestora - abilități de diagnosticare, prin creșterea acurateței diagnosticării și a tratării bolilor. De asemenea, Machine Learning poate crește viteza medicilor în diagnosticare și le oferă șansa de a trata cât mai mulți pacienți.
Imaginați-vă posibilitățile de reformare ale domeniului medical, dacă fiecare medic ar putea aplica cunoștințele tuturor experților în medicină la o simplă apăsare de buton - acesta este, de fapt, potențialul Machine Learning.
Codul sursă poate fi descărcat și vizualizat aici.
de Ovidiu Mățan
de Ovidiu Mățan
de Ovidiu Mățan