< 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.

Joonis 2. Tunnused. Inimesi on võimalik kirjeldada teatud tunnuste abil. Joonisel olevate isikute kohta teame nende nime, elukohta, sugu, pikkust ja kaalu. On veel väga palju tunnuseid, mida võiks nende kohta teada, aga hetkel piirdume nende tunnustega.
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).

Joonis 3. Tabel eelmisel joonisel kujutatud isikute tunnustega. Esimene rida tabelis pole andmestiku osa, vaid tunnuste nimetuste loend. Seega koosneb see andmestik 6 näitest ja 5 tunnusest. Need tunnused on “nimi”, “sugu”, “elukoht”, “pikkus” ja “kaal. Esimese näite puhul on tunnuse “nimi” väärtuseks “Karl”, tunnuse “sugu” väärtuseks “M” jne.
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.

Joonis 4. Tunnuste võrdlemine. Pikkuste võrdlemine ja nendevaheliste erinevuste arvutamine omab tähendust, sest arve saab nii võrrelda. Sõnalisi tunnuseid ja muid kategoorilisi tunnuseid seevastu ei ole võimalik mingil viisil reastada ega nende erinevust mõõta - saame ainult konstateerida, kas väärtused on samad või ei.
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”.

Joonis 5. Üks-mitmest vektorid. Elukohti saame kujutada üks-mitmest vektoriga, mille iga element vastab teatud “kas elad …?” küsimuse vastusele. Iga inimese elukohavektori esimene number vastab sellele kas ta, jah (=1) elab või ei (=0) ela Pärnus. Teine vektoris olev number vastab alati sellele, kas inimene elab või ei ela Tartus, jne. Kui meie andmestikus esinevate elukohtade hulk oleks suurem, oleks ka igal vektoril rohkem kui 4 elementi, sest peaksime lisama “kas” küsimusi, et kõik variandid läbi küsitud saaksid.
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.

Joonis 6. Üks-mitmest vektorite võrdlemine. Nagu kategooriliste väärtuste puhul soovisimegi, ei saa vektoreid kuidagi suuruse järgi ritta seada. Samuti on erinevate väärtuste (erinevate võimalike vektorite) vahelised kaugused alati samad - suurusega √2 .
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).

Joonis 7. Üks-mitmest kujul tabel. Tabel, kus kõik kategoorilised tunnused on esitatud üks-mitmest kujul. Vaata ka järgmist tabelit, kus on pikemalt seletatud, millele veerud vastavad.
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.

Joonis 8. Andmestik. Andmestik, kui ainukesed võimalikud elukoha väärtused on Pärnu, Tartu, Tallinn ja Narva ning sugude väärtused M ja N. Nii sugu kui elukoht on pandud üks-mitmest koodi. Soole vastavad nüüd kaks veergu (roosakad veerud vasakul). Elukohale vastavad nüüd neli veergu (sinakalt toonitud veerud). Kui erinevaid elukohti oleks rohkem kui 4, peaks ka tabelisse lisama rohkem veerge – üks veerg võimaliku elukoha kohta. Siinkohal oleme tabelist välja jätnud tunnuse “nimi”. Ka see on kategooriline tunnus ja ka seda peaks esitama üks-mitmest kujul.
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).

Joonis 9. Andmestik koos ametitega. Ametid on esitatud binaarse vektoriga (lillalt toonitud veerud). Iga inimene võib olla ühe, mitme või mitte ühegi ameti esindaja. Kas suudad siit tabelist ise välja lugeda, millises linnas elab ja milliseid ameteid peab eelviimane isik? Millises linnas elab kõige rohkemate ametitega inimene? Millises linnas elab kõige pikem inimene? Vastused leiad siit.
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).

Joonis 10. Puuduvad ja vigased väärtused. Meie algne andmestik, aga oleme mõndasid väärtusi muutnud. Kas leiad andmestikust puuduva tunnuse väärtused? Kas leiad andmestikust tõenäoliselt valesti märgitud tunnuse väärtuse? Lahenduse leiad siit
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).

Joonis 11. Märgendatud andmestik. Lõplik hind on arvuline tunnus, aga me käsitleme seda erilisena ja kutsume märgendiks, sest selle väärtus selgub hiljem kui teised tunnused. Pealegi on hinna täpsest ette ennustamisest võimalik majanduslikku kasu saada.
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 > |