Aplikácia MyHealth predstavuje prototyp riešenia pre predikciu rôznych chorôb v domácom prostredí, ktorých diagnostika sa dá vykonať postupom schváleným lekármi. Vyšetrenie je založené na kombinácii výsledku merania a špecifického dotazníka pre konkrétnu chorobu. Merania sú realizované pomocou mobilného telefónu a k nemu pripojených zariadení. Získané údaje sú vyhodnotené pomocou strojového učenia pomocou ktorého sa určuje pravdepodobnosť danej choroby.
Na trhu sa nachádza veľké množstvo softvéru so zameraním na zdravotníctvo a medicínu, pričom v posledných rokoch sa pri smartfónovom boome tento trend nespomaľuje. Na mobilných platformách existuje aplikácia na všetko, od svojpomocných návodov ako si napraviť chrbticu alebo diagnostikovať slepé črevo, až po praktickejšie riešenia ako systémy pre diabetikov ktoré sa prepájajú s inzulínovými perami a riešenia pre lekárov na objednávanie a sledovanie pacientov. V rámci predmetu Tímový Projekt nás ako tím táto téma zaujala prakticky okamžite, nakoľko predstavovala šancu zrealizovať za pomerne krátky čas (trinásť týždňov) skĺbenie funkcionality do takého riešenia, ktoré by ocenili profesionáli v zdravotníckom obore a zároveň by bolo použiteľné pre bežných ľudí rôznych vekových kategórii. Pre úspešné prevedenie do funkčného riešenia v tak krátkom čase je však potrebné zvoliť si jedno ochorenie a implementáciu diagnostiky a funkcionalít okolo tohto ochorenia zrealizovať jednoducho a efektívne. Ako sme pristúpili k tomuto riešeniu z teoretického aj implementačného hľadiska sa dočítate v nasledujúcich odsekoch.
Idea
Z množstva chorôb, ktoré sme mali k dispozícii a prístrojom, ktoré sú použiteľné na takúto diagnostiku sme si vybrali chronickú obštrukčnú chorobu pľúc. Bola vybraná kvôli jej rozšírenosti - podľa svetovej zdravotníckej organizácie WHO jej patrí piate miesto v poradí príčin smrti na celom svete. Navyše spomedzi najčastejších populačných ochorení (napríklad rôzne druhy rakoviny alebo kardiovaskulárne ochorenia) je jej diagnostika pomerne nenáročná, ak pacient spĺňa isté faktory a sú k dispozícii dáta z merania príslušnými prístrojmi. Chronická obštrukčná choroba pľúc je ochorenie, ktoré sa prejavuje postupne zhoršujúcou sa poruchou priechodnosti dýchacích ciest, ktorá môže byť po istom čase život ohrozujúca. Pacient má postupne problém s rozprávaním počas chôdze, pravidelne kašle, v pokročilom štádiu má ťažkosti napríklad aj so zadýchaním sa počas obliekania sa a inými základnými činnosťami. Diagnostika choroby alebo zdravotného stavu má význam jedine vtedy, ak je presná, pričom k jej presnosti by sa mali vyjadrovať odborníci z praxe. Čo sa týka teórie sme celú problematiku konzultovali s odborníkom na spirometriu, slovenským lekárom pracujúcim v Nemecku s pacientmi s touto a ďalšími postihnutiami dýchacích ciest.
Meranie
V rámci tejto konzultácie sme dospeli k záveru, že najefektívnejšie je práve meranie spirometrom, pričom sa hodnoty zo spirometra prepočítavajú pomocou presne určených tabuliek a vzorcov. Namerané hodnoty z hľadiska spirometrie majú rozdielne konštanty a rozdielne vzorce pre mužov a ženy. Zo zaujímavosti uvedieme napríklad to, že vo vzorci pre predpokladanú hodnotu kapacity pri úplnom nadýchnutí a vydýchnutí nie je zakomponovaná hmotnosť, lebo podľa výskumov nemá vplyv na výpočet. Čo sa týka samotného prístroja, bol zapožičaný hosťujúcou firmou GlobalLogic v rámci Tímového projektu.
Rozhovor s virtuálnym lekárom
Na určenie prítomnosti choroby dýchacích ciest meranie spirometrom postačuje, avšak na diagnostikovanie vyššej pravdepodobnosti práve predmetnej obštrukčnej choroby a vylúčenie napríklad astmy a podobných ochorení je potrebný aj rozhovor s lekárom, či pacient spĺňa už spomenuté faktory. Tento úkon je simulovaný v aplikácii jednoducho pomocou krátkeho dotazníka, kde sú zachytené všetky dôležité okolnosti, ktoré by nasvedčovali vysokú pravdepodobnosť choroby. Dotazník bol taktiež konzultovaný a doplnený odborníkmi, a zbiera rôznorodé informácie. Niektoré z trinástich otázok, ktoré sa dostali do aplikácie, sa môžu javiť používateľovi ako triviálne, teda či zvykne kašľať, koľko denne fajčí, či pracuje v nečistom prostredí a podobne. S pribúdajúcimi otázkami však rastie faktor odbornosti diagnostiky, v zmysle, že sa môžu otázky zdať ako nesúvisiace s daným ochorením, pričom ich lekári znalí v danej problematike odobrili. Ako príklad tu patria otázky ohľadom typu vyhrievania domácnosti, o solení jedál, o srdcových problémoch a podobne.
Architektúra serverovej časti
Serverová časť aplikácie je postavená na viacerých technológiách platformy Java EE. Perzistentná vrstva aplikácie komunikuje s DBMS PostgreSQL pomocou štandardu objektovo-relačného zobrazenia JPA a jeho implementácie v podobe Hibernate. Komunikáciu s klientskou časťou aplikácie zabezpečujú webové služby vytvorené pomocou JAX-RS API, ktoré je súčasťou Javy EE od verzie 6. Pomocou neho si klient a server vymieňajú správy vo formáte JSON a vopred dohodnutej forme. Tento prístup umožňuje jednoduché škálovanie systému vo forme pridávania platforiem na strane klientskej časti. Pri takejto REST architektúre je jednoduché implementovať klientsku aplikáciu napríklad pre platformu iOS, keďže koncové zariadenia platformy slúžia len ako aspekty prezentačnej vrstvy a celá biznis logika sa vykonáva na strane servera.
Pre vyhodnocovanie vyplnených formulárov a nameraných hodnôt z pripojených zariadení sú dané hodnoty odoslané z klientskeho zariadenia a spracované naivným Bayesovym klasifikátorom. Tento klasifikátor je na serveri použitý v rámci knižnice pre strojové učenie WEKA. Knižnica WEKA bola vyvinutá na univerzite vo Wakaito na Novom Zélande. Okrem podpory klasifikačných algoritmov spočíva jej sila aj v možnostiach práce s predspracovaním dát.
Strojové učenie
Strojové učenie umožňuje aplikácii “učiť sa”, pričom využíva rôzne štatistické techniky a algoritmy. V našom prípade je táto schopnosť pre aplikáciu kritická. Čím viac trénovacích dát je pre algoritmus k dispozícii, tým presnejšia je finálna diagnostika a pravdepodobnosť ochorenia. Naša aplikácia využíva “dummy” sadu takýchto trénovacích dát, ktorá bola konzultovaná s medicínskym expertom, ktorý sa venuje chronickej obštrukčnej chorobe pľúc. Aplikácia je pripravená na zber užitočných dát o používateľoch, či už z hardvérového merania, alebo vyplnených dotazníkov. Tieto dáta umožnia v budúcnosti presnejší výstup klasifikačného algoritmu.
Pri výbere vhodných algoritmov strojového učenia, sme museli zohľadniť potrebu vyčíslenia výslednej pravdepodobnosti. Záver v podobe binárneho výsledku, t.j. používateľ má, alebo nemá danú chorobu bol pre nás nepostačujúci. Po porade s klientom zo zadávateľskej spoločnosti sme v prvej fáze návrhu a implementácie pracovali s algoritmami z rodiny rozhodovacích stromov, avšak práve kvôli spomínanému binárnemu výstupu, ktoré tieto stromy produkujú, sme boli nútení riešenie zavrhnúť. Konkrétne išlo o stromy typu J48 a M5P. Z množstva dostupných algoritmov, ktoré produkujú pravdepodobnostnú hodnotu sme po porade s klientom usúdili, že pre účely našej aplikácie je najvhodnejší tzv. Naivný Bayesov klasifikátor. Tento klasifikátor je postavený na Bayesovej teoréme, ktorá opisuje pravdepodobnosť udalosti, na základe vopred známych podmienok. Jednoducho povedané, klasifikátor Naive Bayes predpokladá, že prítomnosť konkrétnej funkcie v triede nesúvisí s prítomnosťou žiadnej inej funkcie. Napríklad v našom prípade, závisí pravdepodobnosť chronickej obštrukčnej choroby pľúc, od faktorov ako chronický kašeľ, športové aktivity pacienta, spôsob vykurovania a pod. Tieto faktory sú v od seba nezávislé a v systéme sú reprezentované sadou trénovacích dát. WEKA používa na inicializáciu sady dát, ktoré sú používané na trénovanie klasifikátora súbory vo formáte ARFF. Tento formát má mnoho spoločného so známym formátom CSV. Na nasledujúcom obrázku je príklad takejto sady dát.
@relation chochp_probability
@attribute allergy {yes,no}
@attribute coughing {yes,no}
@attribute heart {yes,no}
@attribute heating {heating_0, heating_1, heating_2}
@attribute heavy_breathing {yes,no}
@attribute pets {yes,no}
@attribute polluted_environment {yes,no}
@attribute repsiratory_infections {yes,no}
@attribute salt {yes,no}
@attribute smoking {smoking_0, smoking_1, smoking_2}
@attribute vitamins {yes,no}
@attribute measurement NUMERIC
@attribute result {Danger,Clear}
@data
yes,yes,no ,heating_0,yes,yes,yes,no ,no ,smoking_0,yes,88 ,Danger
yes,no ,yes,heating_0,no ,no ,yes,no ,yes,smoking_0,no ,86 ,Danger
yes,no ,yes,heating_0,no ,no ,no ,no ,no ,smoking_0,no ,84 ,Clear
yes,yes,no ,heating_0,yes,yes,no ,yes,yes,smoking_1,yes,86 ,Danger
yes,yes,yes,heating_1,no ,no ,yes,no ,yes,smoking_2,no ,80 ,Danger
yes,no ,no ,heating_0,yes,yes,yes,no ,no ,smoking_2,yes,72 ,Danger
no ,yes,yes,heating_0,no ,no ,no ,yes,no ,smoking_0,no ,78 ,Clear
no ,no ,no ,heating_1,yes,yes,yes,no ,no ,smoking_0,yes,120,Clear
no ,yes,yes,heating_0,no ,no ,yes,no ,yes,smoking_1,no ,82 ,Danger
no ,yes,no ,heating_0,yes,yes,no ,yes,no ,smoking_2,yes,89 ,Danger
no ,no ,yes,heating_0,no ,no ,yes,no ,no ,smoking_2,no ,81 ,Clear
Pripomeňme si, že máme dostupnú počiatočnú verziu trénovacích dát od lekára, zaoberajúceho sa CHOCHP. Tieto dáta sú uložené v spomínanom ARFF súbore. Knižnica WEKA neumožňuje čítať vstupné trénovacie dáta v inom formáte ako ARFF (napríklad priamo z databázy). Bolo preto nevyhnutné prísť na spôsob ako uchovať aktuálnu sadu trénovacích dát neustále dostupnú a aktuálnu.
Prvou možnosťou bolo ukladať ARFF súbory v súborovom systéme servera a zapisovať do nich pri každej aktualizácii trénovacích dát. Tento prístup však nekorešponduje s odporúčaniami Oracle o manipulácii súborov v prostredí aplikačného servera Java EE a EJB. Hlavným dôvodom takýchto reštrikcií je to, že súbory nie sú transakčným zdrojom.
Ďalšou možnosťou bolo vytvoriť skript, ktorý tieto naše dáta z ARFF uloží do databázy v jednej, prípadne viacerých tabuľkách. Následne by sa pri každej požiadavke používateľa na vyhodnotenie (po úspešnom vyplnení dotazníka a hardvérovom meraní) vyskladal Bayesov klasifikátor zo všetkých záznamov reprezentujúcich trénovacie dáta. Tento postup by však pri veľkom množstve dát predlžoval odozvy servera, keďže by zakaždým nanovo skladal dáta do formátu, ktorý by WEKA vedela spracovať.
Ako posledná možnosť prichádzalo do úvahy uchovávať trénovacie dáta v podobe ARFF priamo v databáze ako textový záznam. Pri dopyte na server, a žiadosti o vyhodnotenie formulára a merania, sa vyskladá Bayesov klasifikátor z aktuálnej sady dát. Nemusí však spracovávať a agregovať všetky dáta uložené v databáze vo viacerých tabuľkách, ako v predošlom prípade. Jednoducho vyskladá klasifikátor z jediného Stringu z jedinej tabuľky. Pre tento účel bola vytvorená nová JPA entita DecisionTreeState, ktorá vo svojej inštančnej premennej typu String ukladá celý ARFF súbor. Ten následne dokážeme získať z príslušného DAO objektu. Získaný String je potrebné prekovnertovať na vhodný formát, ktorému nami používaná knižnica rozumie. WEKA obsahuje v balíčku weka.core.converters vhodnú triedu na tento účel - ConvertUtils. Pomocou tejto triedy dokážeme staticky konvertovať ByteArrayInputStream, získaný zo Strignu s trénovacími dátami na DataSource pre WEKA. Tento prístup bol náročnejší na implementáciu, avšak jeho aplikovaním sme zaistili transakčný prístup pri úprave sady dát.
Aplikácia pre Android
Aplikácia je navrhnutá modulárne, teda rozširovanie funkcionalít alebo spektrum podporovaných chorôb je realizovateľné pridávaním inštancií odpovedajúcich tried. Predchádza sa tak výrazným zásahom do základnej štruktúry kódu, ako aj jej čitateľnosti. Registrácia a prihlasovanie klienta pre účely personalizácie a získania základných údajov je docielené párovaním účtu v aplikácii s Google+ účtom, a následným doplnením všeobecných zdravotných parametrov, ktoré sú nevyhnutné pri vyšetreniach. Následne sú údaje z aktivity formulára odoslané na server prostredníctvom RESTful služieb.
Hlavná aktivita využíva na zobrazenie kariet chorôb implementáciu triedy RecyclerView, ktorá ponúka oproti klasickému ListView značné výhody, medzi ktoré patrí lepší výkon dosiahnutý presadzovaním „recyklácie” pohľadov pomocou vzoru ViewHolder. Pohľady disponujú integrovanými animáciami a podporou pre vertikálne a horizontálne posúvanie prvkov, na ktorú dohliada trieda LayoutManager.
Využitím implementácie z balíčka android.bluetooth prístupom k fyzickým adresám zariadení je aplikácia nakonfigurovaná na prácu s hardvérom MiBand od spoločnosti Xiaomi a tiež spirometrom. Proces konektivity je vyriešený v konkrétnej aktivite aplikácie, ktorá nás vizuálne sprevádza jednotlivými krokmi, čo nás dovedie k výstupu, ktorý sa následne odošle na serverovú čast, ktorá si ho uchováva v perzistentnej vrstve. Tieto zariadenia nám dodávajú nevyhnutné informácie v diagnostike ochorení a hrajú rolu v finálnom predikovaní chorôb.
Budúcnosť riešenia
Náš vyvinutý systém ukázal, že predikcia chorôb v domácom prostredí je možná aj v rámci mobilnej aplikácie a postačuje pre základnú kontrolu pred návštevou lekára. Systémy na predikciu a prevenciu rôznych ochorení teda má zmysel vyvíjať, nakoľko aj podľa nášho klienta majú svoje miesto na trhu, pretože sú prínosom ako pre pacientov, tak aj pre poisťovne a lekárov. Ich kvalita závisí jedine od rozširovania podpory pre ďalšie možnosti diagnostiky ochorení a pre nasadenie do praxe a testovanie.