< Sissejuhatus | 2. OSA sisukord | järgmine > |
2.1 Tunnused ja andmestikud autor: Ardi Tampuu
Kogu masinõppe valdkonna aluseks on andmed. Kui pole, millest õppida, ei saa ka õppida. “Mis on andmed?”, “Mis kujul arvutid neid näevad?” ja kõike sellega seonduvat vaatame selles peatükis. Andmetest rääkides mainime küll siin ja seal ka nende põhjal “õppimist”, aga ei seleta veel, kuidas see toimub. Õppimiseni jõuame alles järgmistes alapeatükkides.
Tunnused ja tunnuste tüübid
Omadusi, mis kirjeldavad teatud objekti, kutsutakse selle objekti tunnusteks (ingl features). Näiteks võib kirjeldada inimest tema vanuse, kasvu, kehakaalu, nime, soo, kodulinna abil. Igaüks neist tunnustest erineb teistest selle poolest, milliseid väärtusi ta omada võib. Kõige kardinaalsem erinevus on arvuliste tunnuste (ingl numerical features; näiteks kasv ja kaal) ja kategooriliste tunnuste (ingl categorical features; näiteks sugu) vahel. Kategoorilised tunnused saavad väärtusi mingist piiratud võimalike väärtuste hulgast. Näiteks sugu märgitakse enamasti valides kahe võimaliku variandi vahel. Kodulinna variantide arv on suurem, aga siiski piiratud, ning valik tuleb teatud hulga variantide seast.
Joonisel 2 kujutame mõningaid inimesi ja mõnda tunnust, mida me nende kohta teame. Mõned neist tunnustest on arvulised, mõned kategoorilised.
Objektide tunnuste väärtustest moodustubki andmestik, mida saab kujutada tabelina. Tabel organiseeritakse alati nii, et iga rida vastab ühele “näitele”, meie puhul siis ühele inimesele. Iga veerg vastab teatud tunnusele (Joonis 3).
Masinõppe algoritmidel on vaja erinevate näidete tunnuste väärtusi võrrelda, et leida seoseid. Arvuliste tunnuste puhul on selge, kui sarnased on kaks väärtust või milline väärtus on suurem (saab lihtsalt arvutada nende vahe). Näiteks, on selge, et Toomase ja Peetri pikkused on sarnased, samas kui Karli pikkus on mõlemast märkimisväärselt väiksem (Joonis 3). Samasuguseid sarnasuse hinnanguid saab teha ka kaalude kohta.
Seevastu kategooriliste tunnuste puhul on võimalik ainult öelda, kas nad on täpselt samad või ei. Igasugused muud võrdlused pole võimalikud. Tehted Tartu miinus Tallinn või Tartu miinus Pärnu ei oma tähendust ja seega me ei saa öelda, millised kaks tunnuse “Elukoht” väärtust on omavahel sarnasemad. Samuti pole võimalik neid väärtusi kuidagi suuruse järgi ritta seada, sest küsimus “Kas Tartu > Tallinn?” ei oma tähendust (Joonis 4). Sama kehtib ka nimede puhul, pole ju võimalik öelda, kas Peeter on nimena sarnasem Toomasele või Karlile või kas ta on neist suurem.
Arvude keel
Kuna masinõppe puhul on tegu algoritmidega, ehk teatud järjekorras teatud matemaatilisi operatsioone tegevate protsessidega, räägivad need algoritmid arvude keelt. Kui me tahame, et tehisintellekt suudaks mõista mingite objektide tunnuseid, on vaja esmalt valida, mil viisil saaks neid asju arvudena kirja panna. Arvuliste väärtuste puhul on see triviaalne – panemegi kirja vastava arvu.
Kategooriliste muutujate (nagu nimi või kodulinn) puhul aga on vaja meeles pidada, et neid ei peaks saama võrrelda ja öelda, et mingid väärtused on omavahel sarnasemad. Kuidas seda arvudega saavutada? Näiteks ei saa me lihtsalt otsustada, et märgime nime Karl numbriga 1, nime Saša numbriga 2 ja nime Mari numbriga 3 jne - sel juhul oleks Mari - Saša = 1, samas kui Mari - Karl = 2. Ühest numbrist ei piisa, kasutada tuleb mitut numbrit.
Seetõttu kasutataksegi kategooriliste tunnuste märkimiseks hoopis üks-mitmest koodi (ingl one-hot encoding). Esiteks paneme tähele, et me saame asendada küsimuse “Mis on selle tunnuse väärtus?” terve hulga küsimustega “Kas selle tunnuse väärtus on …?”. Näiteks küsimuse “Kus sa elad?” saab asendada terve hulga “kas” küsimustega. Kas sa elad Tallinnas? Kas sa elad Tartus? Kas sa elad Pärnus? Ja nii edasi. Need küsimused on üksteist välistavad – kaks vastust ei saa samaaegselt “Jah” olla. Kui küsimus on esitatud kõikide võimalike elukohtade kohta, siis on vastuste hulgas alati täpselt üks “Jah”. Täpselt üks mitmest.
Nende küsimuste vastused koondatakse vektorisse, kus on seega nii palju väärtusi, kui oli võimalikke variante, kusjuures täpselt üks neist on 1 ja ülejäänud nullid (Joonis 5). Sellist vektorit nimetataksegi üks-mitmest vektoriks. See sisaldab täpset infot selle kohta, milline oli algse tunnuse väärtus, sest number 1 asukoht märgib seda, millisele “kas” küsimusele vastati “jah”.
Sel viisil saame asendada iga sõnalise tunnuse terve hulga numbritega. Selline kujutusviis võib tunduda kohmakas, aga sel on oluline eelis – väärtused on kas täpselt samad või erinevad üksteisest täpselt kindlal määral. Kui vastused polnud identsed, siis peab olema täpselt kaks küsimust, millele vastati erinevalt. Erinevate näidete üks-mitmest vektorid on kas identsed või erinevad täpselt kahel positsioonil (Joonis 6). Seega ei teki probleemi, et selliselt kujutledes oleks Anna Peetrile sarnasem nimi kui Karlile või vastupidi.
Vahemärkus: Mis on vektor? Vektorite vaheline kaugus.
Vektorist võime mõelda lihtsalt kui arvude komplektist. Meie elukohtade näites koosneb elukoha vektor neljast arvust, kus esimene arv tähistab Pärnus, teine Tartus, kolmas Tallinnas ja neljas Narvas elamist. Vektorit esitame üldiselt sulgude sees asuvate arvudega. Näiteks Tartus elamist esitab meie näites vektor (0, 1, 0, 0) ja Tallinnas elamist vektor (0, 0, 1, 0). Masinõppes on vektoreid hea kasutada eelkõige seetõttu, et nüüd on arvutil võimalik arvutada kahe kategoorilise tunnuse, meie näites elukoha, erinevust. Ning üks-mitmest vektorite puhul on see erinevus alati arvuliselt sama suur. Vektorite vahelise erinevuse arvutamiseks kasutame eukleidilist kaugust. Seda tehakse, lahutades vektorite samadel positsioonidel olevad arvud ning tõstes need ruutu. Pärast liidetakse kõik need tulemused kokku ja võetakse summast ruutjuur. Teeme selle Tartu ja Tallinna vektorite puhul läbi. Kõigepealt lahutame vektorite samadel positsioonidel olevad arvud, saame 0 - 0 = 0, 1 - 0 = 1, 0 - 1 = -1 ja 0 - 0 = 0. Nüüd tõstame kõik need tulemused ruutu ja saame 02 = 0, 12 = 1, (-1)2 = 1, 02 = 0. Nendest arvudest näeme ka ära, et 0 on kohal, kus vektorid ei erine ja 1 kohal, kus vektorid erinevad. Nüüd liidame need kokku ja saame 0 + 1 + 1 + 0 = 2. Lõpuks võtame ruutjuure ja saame tulemuseks √2. Võid ise kontrollida, et praeguses näites on iga kahe erineva elukoha vektori vaheline kaugus √2, sest kõik vektorid erinevad täpselt kahe koha peal. Lisaks, Tartu erinevus Tartust on 0, sest kõik vektori elemendid on samad, jällegi väga soovitud omadus. Sama loogikaga saab arvutada igasuguste erinevate vektorite vahelisi kauguseid, mis teeb arvuti jaoks võimalikuks erinevate kategooriliste tunnustega töötamise.
Olles otsustanud, et märgime kategoorilisi väärtusi üks-mitmest koodi abil, kasutades paljusid nulle ja ühte ühte, saame oma eelnevalt antud andmestiku uuesti kujutada. Nüüd juba kujul, mis sisaldab ainult arve ja mille põhjal saaks masinõppe algoritmid õppima hakata (Joonis 7).
Edaspidises jätame välja tunnuse “Nimi”, sest sellel on kõik väärtused erinevad ja meie tabel läheb selle tunnuse mõjul väga laiaks. Joonisel 8 oleme üks-mitmel kujule pannud soo ja elukoha. Näeme, et vaatamata nimede eemaldamisele on tabel läinud tüütult suureks. Kui meie andmestik oleks suurem ja sisaldaks rohkem erinevaid elukohtade variante ning võimaldaks rohkem soo variante (näiteks “ei taha avaldada”), siis ei mahuks see laiuses hästi ekraanile ära ning poleks enam visuaalselt hoomatav. Selleks, et andmeid oleks ikkagi võimalik ka visuaalselt tabelina vaadata, toimub kategooriliste muutujate üks-mitmeks vektoriteks tegemine tihti automaatselt masinõppe algoritmi sees. See tähendab, et kui andmeteadlane oma andmeid vaatab, siis ta ikkagi vaatab algset kompaktsemat tabelit, kus on sõnalised väärtused. Ta lihtsalt teab, et hiljem algoritmi jaoks tuleb tabel ümber teha. Ta suudab kategooriliste tunnuste võimalike väärtuste arvu järgi hinnata, kui suur see tabel siis lõpuks tuleb. See suurus omakorda mõjutab muid otsuseid.
Veel üks eriline andmetüüp on nominaalsed nimekirjad, mis on sarnased kategoorilistele tunnustele, selle vahega, et mitu väärtust võivad korraga tõesed olla. Näiteks võib inimene olla samaaegselt nii näitleja kui laulja või nii poliitik kui ettevõtja. Sel juhul kujutame tunnust “Amet” ühtede ja nullide reana (vektorina), mille iga element vastab kindlale ametile. Erinevalt üks-mitmest vektoritest, võib siin ühtesid olla rohkem kui üks. Sellist vektorit kutsutakse binaarseks vektoriks (Joonis 9), sest iga vektori element on binaarne (väärtusega kas 1 või 0).
Oleme nüüd näinud, kuidas erinevat tüüpi tunnuseid (nende väärtusi) panna ümber arvude keelde. Selline vaid arve sisaldav tabel on masinõppimise eeldus. Kuidas ja mida masinõppe meetodite abil õppida saab, näeme hiljem, peatükkides 2.2 ja 2.4.
Andmestikud
Andmestik moodustub paljude objektide (antud juhul inimeste) tunnused tabelisse kokku kogudes. Igal real on ühe objekti (inimese) tunnused. Andmestiku üheks oluliseks omaduseks ongi ridade arv – mitme asja kohta me infot kogunud oleme. Teine oluline omadus on kogutud info hulk – mitut tunnust me iga asja kohta teame. Ehk siis tabeli veergude arv (see võib küll olla petlik, kui tegu on üks-mitmest kujul kategooriliste tunnustega). Olulised on ka muidugi muud aspektid – näiteks kui täpselt me teatud väärtusi mõõtnud oleme – aga need pole tabelile peale vaadates kohe ilmsed.
Mida suurem on andmestik ridade arvult, seda parem – meil on rohkem näiteid, mille põhjal midagi õppida. Seevastu suurem veergude arv ei pruugi alati tähendada, et andmestik on parem. Näiteks kui lisame oma andmestikule palju tunnuseid, mis dubleerivad üksteist või on lihtsalt vähe-informatiivsed, siis andmestiku kvaliteet pigem kahaneb. Mida rohkem tunnuseid, seda arvutuslikult kulukamaks muutub masinõppe mudelite treenimine. Seega peab andmeteadlane ise hakkama otsustama, millised tunnused (veerud) tabelist välja visata, et mudel ei raiskaks õppides aega kasututest tunnustest info otsimisele. Ka inimesel on ju lihtsam õppida, kui talle räägitakse asjast ja teda ei koormata üle tähtsusetute detailidega.
Tihti oleks veergude arvu vähendamiseks mõistlik mitme tunnuse põhjal mingi uus tunnus arvutada, mis võtaks ühe arvuga kokku kõik algsetes tunnustes sisalduva info. Kui meil on näiteks teada pikkus ja kehakaal, siis meditsiinilistel eesmärkidel võib olla efektiivne nende kahe tunnuse asemel kirjutada tabelisse hoopis kehamassi-indeks. Seega asendaksime kaks veergu ühega. Selline kasulikumate, mitut arvu kokkuvõtvate tunnuste välja mõtlemine on eriti oluline teatud andmetüüpide puhul, mis sisaldavad väga-väga palju tunnuseid. Näiteks ka keskmise suurusega foto on arvutis kirjeldatud miljonite arvude abil (pildi piksliväärtuste kaudu, millest räägime lähemalt järgmisel nädalal). Kui tahame õppida näiteks ennustama, kes on pildil, on igal pildil (objektil, näitel) miljoneid tunnuseid. Miljonite tunnuste põhjal õppimine on ajakulukas ja võib teatud põhjustel sootuks ebaõnnestuda. Selleks, et kuidagi tunnuste (veergude) arvu vähendada, peab andmeteadlane ise otsustama, kuidas seda teha. See on tüütu ja tänamatu töö, sest universaalseid vastuseid pole. Mis töötab piltidelt nägude tuvastamise jaoks, ei pruugi töötada pildil olevate objektide ära tundmiseks. Õnneks on olemas mõned masinõppe algoritmid, mis suudavad siiski ka miljonite tunnustega hakkama saada. Need algoritmid otsivad ise viise, kuidas tunnuseid kombineerida, et saada väiksem hulk kasulikumaid tunnuseid (nendeni jõuame peatükis 2.5).
Kui ennist mainisime, et rohkem ridu on alati hea, siis lihtsalt suurest hulgast näidetest reaalelulisteks rakendusteks alati ei piisa. Need näited peavad ka olema esinduslikud (moodustama esindusliku valimi). Esinduslik andmestik sisaldab kõiki näiteid, mis päriselus ette tulla võivad, ja sisaldab neid samas proportsioonis, kui neid päriselus kohata võiks. Ehk siis, kui me võtame juhusliku rea andmestikust, siis on see võrdväärne juhusliku uue näite võtmisega reaalelust. See on eriti oluline, kui kasutame seda andmestikku juba olemasoleva mudeli võimekuse hindamiseks ehk mudeli testimiseks (sellest lähemalt peatükis 2.3). Kui hindame suutlikust kallutatud andmetel, ei peegelda tulemus seda, kui usaldusväärne see mudel tegelikult pärismaailmas rakendades oleks. Näiteks, kui kogume andmeid ainult tudengite hulgas, siis ei saa neil andmetel saadud tulemusi üldistada kogu elanikkonnale.
Päris inimeste poolt reaalsest elust kogutud andmestike puhul on veel üks oluline kvaliteedinäitaja – puuduvate või vigaste väärtuste arv. Andmeid tabelisse sisestades võib juhtuda, et mingit tunnuse väärtust lihtsalt ei teata (nt. kehakaalu unustati küsida või inimene keeldus seda avaldamast) või on kogemata sisestatud vale arv (nt. koma pandud valesse kohta, Joonis 10).
Puuduvaid väärtusi on lihtne tuvastada, tabeli väli on lihtsalt tühi, aga mida sel juhul teha? Üks võimalus on lihtsalt tabelist eemaldada kõik read, kus on mõni tühi väli. Kuid nagu eelnevalt mainisime, siis mida rohkem ridu (näiteid), seda parem. Teine variant on eemaldada kõik tunnused, millel on puuduvaid väärtusi. Aga ka see võib olla liiga range kriteerium ja viia liiga paljude oluliste veergude eemaldamiseni. Võib leida kompromissi nende kahe vahel – eemaldada nii ridu kui veerge, nii et võimalikult palju tabelist ikkagi alles jääks.
Alternatiivina võib arvuliste väärtuste puhul puuduva arvu asendada näiteks veeru keskmise väärtusega. Kategooriliste väärtuste puhul võime lisada võimalike väärtuste hulka variandi “teadmata”. Milline lahendus, kas eemaldamine või asendamine, on parem, sõltub andmestikust ja selle valiku tegemine on andmeteadlase töö osa.
Valesti sisestatud väärtuste puhul on asi keerulisem, neid pole alati lihtne tuvastada. Kui keegi on pannud koma valesse kohta või unustanud nulli arvu lõppu panemata, siis võib tulemuseks olla ekstreemne väärtus, mis eristub nii selgelt, et seda on võimalik tuvastada. Aga kui sisestaja vajutas kogemata klahvi “4” asemel klahvi “5”, siis on tagantjärele viga tuvastada võimatu. Seega on andmestikku mingil määral võimalik “puhastada”, aga tema puhtus on pigem peidetud, raskesti mõõdetav omadus.
Märgendid ehk sildid
Mõningatel juhtudel on andmestiku üks tunnusest teatud viisil teistest erinev ja olulisem. See erilisus võib seisneda mitmes erinevas aspektis. Näiteks:
- Teatud tunnuste väärtusi võib olla raske või kulukas koguda. Näiteks kui meil on hulk keemilisi ühendeid, mille puhul me suudame hinnata nende kaalu, ehitust, keemilisi omadusi ja isegi 3D struktuuri, kuid nende mürgisuse hindamine on kulukas. Tunnuse “mürgisus” väljaselgitamiseks on vaja teha esmalt loom- ja siis vajadusel inimkatseid. Ilmselgelt on see kulukas ja ohtlik.
- Teatud tunnuste väärtused saame teada hiljem, tagantjärele. Näiteks on meil andmestik, mis koosneb hetkel turul olevate kinnisvaraobjektide tunnustest – tubade arv, pindala, asukoht jne. Tunnus “müügihind”, seevastu selgub alles siis, kui objekt maha müükse.
- Teatud tunnused on oma olemuselt teistest erinevad. Näiteks kui pildid on arvutis kirjeldatud piksli väärtuste kaudu, siis lisades pilte sisaldavasse andmestikku lisaks piksli väärtustele ka tunnuse “mis on pildil?”, on see tunnus selgelt eristuv ja teise tähendusega.
Kui mingi tunnus on eriline, oluline või vähemalt konkreetsel hetkel raskesti otse mõõdetav, tekib küsimus – kas oleks võimalik selle tunnuse väärtust teiste tunnuste väärtuste põhjal ennustada? Kui suudaksime seda tunnust täpselt ennustada, ei olekski meil vaja seda mõõta ja saaksime selle teada ajaliselt varem.
Kui otsustame, et soovime üht tunnust teiste põhjal ennustada ja anname sellele tunnusele eristaatuse, siis muutub see, kuidas me seda tunnust kutsume. Me nimetame teda nüüd sildiks või märgendiks (ingl target response, label). Meie andmestik koosneb nüüd tunnustest (kõik ülejäänud, tavalised tunnused) ja märgenditest. Sellist andmestikku kutsutakse märgendatud andmestikuks (ingl labeled dataset; Joonis 11).
Näiteks saab õpetada mudeli kinnisvara objektide tunnuste põhjal ennustama nende hinda. Mudel näeb andmestikus olevaid näiteid, mille oleme kogunud pikema aja jooksul ja mille müügihinnad on teada. Nende põhjal suudab ta õppida reeglid, mis võimaldavad ka uute, veel müümata objektide jaoks ennustada, mis hinnaga nad müüakse.
Kordame veelkord: märgendatud andmestikus koosneb iga rida, see tähendab iga näide, tunnuste väärtustest ja märgendi väärtusest. Selliste näidete põhjal suudavad juhendatud masinõppe algoritmid õppida ennustama tunnustest märgendeid. Juhendatud õppest räägime detailselt järgmises peatükis.
< Sissejuhatus | 2. OSA sisukord | järgmine > |