Strojno učenje
S Pythonom do prvega klasifikatorja
Avtorja
Sašo Karakatič
Iztok Fister Ml.
Januar 2022
Naslov
Strojno učenje
Title
Machine Learning
Podnaslov
S Pythonom do prvega klasifikatorja
Subtitle
Classification in Python
Avtorja
Sašo Karakatič
Authors
(Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko)
Iztok Fister Ml.
(Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko)
Recenzija
Niko Lukač
Review
(Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko)
Branko Kavšek
(Univerza na Primorskem, Fakulteta za matematiko,
naravoslovje in informacijske tehnologije)
Lektoriranje
Nuša Grah
Language editing
Tehnična urednika
Sašo Karakatič
Technical editors
(Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko)
Jan Perša
(Univerza v Mariboru, Univerzitetna založba)
Oblikovanje ovitka
Jan Perša
Cover designer
(Univerza v Mariboru, Univerzitetna založba)
Grafika na ovitku
Chenspec s Pixabay.com, CC0
Cover graphic
Založnik
Univerza v Mariboru, Univerzitetna založba
Published by
Slomškov trg 15, 2000 Maribor, Slovenija
https://press.um.si, zalozba@um.si Izdajatelj
Univerza v Mariboru, Fakulteta za elektrotehniko,
Issued by
računalništvo in informatiko
Koroška cesta 46, 2000 Maribor, Slovenija
http://feri.um.si, feri@um.si Izdaja
Prva
Edition
Vrsta publikacije
E-knjiga
Publication type
Izdano
Maribor, Slovenija, januar 2022
Published
Dostopno na
http://press.um.si/index.php/ump/catalog/book/643
Available at
© Univerza v Mariboru, Univerzitetna založba
/ University of Maribor, University Press
Besedilo/Text © Karakatič, Fister Ml., 2022
Delo je pod licenco Creative Commons Priznanje avtorstva 4.0 Mednarodna.
/ Work is licensed under the Creative Commons Attribution 4.0 International License.
Uporabnikom je dovoljeno tako nekomercialno kot tudi komercialno reproduciranje, distribuiranje, dajanje v najem, javna priobčitev in predelava avtorskega dela, pod pogojem, da navedejo avtorja izvir-nega dela.
Vsa gradiva tretjih oseb v tej knjigi so objavljena pod licenco Creative Commons, razen če to ni navedeno drugače. Če želite ponovno uporabiti gradivo tretjih oseb, ki ni zajeto v licenci Creative Commons, boste morali pridobiti dovoljenje neposredno od imetnika avtorskih pravic.
https://creativecommons.org/licenses/by/4.0/
CIP - Kataložni zapis o publikaciji
Univerzitetna knjižnica Maribor
004.85(075.8)(0.034.2)
KARAKATIČ, Sašo
Strojno učenje [Elektronski vir] :
s Pythonom do prvega klasifikatorja / avtorja Sašo Karakatič, Iztok Fister Ml.
– 1.
izd.
– E-publikacija.
– Maribor :
Univerza v Mariboru, Univerzitetna
založba, 2022
Način dostopa (URL): https://press.um.si/index.php/ump/catalog/book/643
ISBN 978-961-286-560-3
doi:
10.18690/um.feri.1.2022
COBISS.SI-ID 94628867
ISBN
978-961-286-560-3 (pdf)
DOI
https://doi.org/10.18690/um.feri.1.2022
Cena
Brezplačni izvod
Price
Odgovorna oseba
prof. dr. Zdravko Kačič
založnika
rektor Univerze v Mariboru
For publisher
Citiranje
Karakatič, S. in Fister Ml., I. (2022).
Attribution
Strojno učenje: s Pythonom do prvega klasifikatorja.
Maribor: Univerzitetna založba. doi: 10.18690/um.feri.1.2022
Kazalo
1
Uvod
1
2
Vzpostavitev okolja
7
2.1 Razvojno okolje Jupyter Notebook . . . . . . . . . . .
7
2.2 Uporaba oblačnega okolja . . . . . . . . . . . . . . . .
9
2.3 Namestitev in uporaba lokalnega okolja Anaconda . .
10
2.4 Nalaganje podatkov . . . . . . . . . . . . . . . . . . .
24
3
Klasifikacija
27
3.1 Model znanja . . . . . . . . . . . . . . . . . . . . . . .
27
3.2 Ekspertni sistem . . . . . . . . . . . . . . . . . . . . .
30
3.3 Inteligentni sistem . . . . . . . . . . . . . . . . . . . .
33
3.4 Podatki . . . . . . . . . . . . . . . . . . . . . . . . . .
35
3.5 Strojno učenje . . . . . . . . . . . . . . . . . . . . . . .
35
3.6 Klasifikacija . . . . . . . . . . . . . . . . . . . . . . . .
38
3.7 Matematična definicija pojmov . . . . . . . . . . . . .
39
4
Prvi klasifikator
41
4.1 Računanje razdalj . . . . . . . . . . . . . . . . . . . . .
42
4.1.1 Kreacija indikacijskih atributov v Pythonu . . .
44
4.2 Skupna razdalja . . . . . . . . . . . . . . . . . . . . . .
48
4.2.1 Evklidska razdalja . . . . . . . . . . . . . . . .
48
4.2.2 Mahattanska razdalja . . . . . . . . . . . . . .
49
KAZALO
4.2.3 Kosinusna razdalja . . . . . . . . . . . . . . . .
50
4.3 Klasifikator k najbližjih sosedov . . . . . . . . . . . . .
51
4.3.1 Delovanje k najbližjih sosedov . . . . . . . . . .
51
4.3.2 Standardizacija podatkov . . . . . . . . . . . .
54
4.3.3 Določitev razreda podane instance . . . . . . .
59
4.4 Uporaba k najbližjih sosedov v Pythonu . . . . . . . .
61
4.4.1 Vizualizacija podatkov . . . . . . . . . . . . . .
64
4.4.2 Učenje in uporaba modela znanja . . . . . . . .
65
4.4.3 Vpliv nastavitev na rezultate . . . . . . . . . .
67
4.4.4 Vpliv standardizacije podatkov na rezultate . .
72
4.4.5 Enovit primer klasifikacije več instanc . . . . .
73
4.5 Utrjevanje znanja . . . . . . . . . . . . . . . . . . . . .
75
5
Kakovost klasifikacije
85
5.1 Delitev podatkov . . . . . . . . . . . . . . . . . . . . .
87
5.1.1 Učna in testna množica . . . . . . . . . . . . .
87
5.1.2 Validacijska množica . . . . . . . . . . . . . . .
89
5.1.3 Navzkrižna validacija . . . . . . . . . . . . . . .
92
5.2 Metrike klasifikacije . . . . . . . . . . . . . . . . . . . .
95
5.2.1 Binarna klasifikacija . . . . . . . . . . . . . . .
96
5.2.2 Klasifikacija v več razredov . . . . . . . . . . . 104
5.3 Utrjevanje znanja . . . . . . . . . . . . . . . . . . . . . 109
6
Rešitve nalog
113
6.1 Poglavje Prvi klasifikator . . . . . . . . . . . . . . . . . 113
6.2 Poglavje Kakovost klasifikacije . . . . . . . . . . . . . . 128
7
Zaključek in kako naprej
145
Literatura
149
Stvarno kazalo
157
1 | Uvod
Strojno učenje, umetna inteligenca, podatkovna znanost, podatkovno rudarjenje in velepodatki (ali kar veliki podatki). V zadnjih letih so to precej uporabljeni izrazi, ki jih zasledimo v novicah o revolucionarnih premikih na področjih obdelave podatkov, razpoznave slik ter video-posnetkov in obdelave besedila. S temi izrazi podjetniki zvito opišejo svoje storitve in produkte, da jim dvignejo vrednost ali jih lažje pro-dajo. S temi izrazi razvijalci programske opreme opišejo svoje izdelke, ko so se ti zmožni prilagajati na različne situacije. Pa gre res za re-volucionarne metode ali le za trenutno modo oziroma modne besede (angl. buzzwords)? So algoritmi strojnega učenja res nekaj, kar izraža inteligentnost računalnika, ali pa gre le za kombinacijo if stavkov in statističnih metod?
Žal ni enovitega odgovora. Inteligentnega in samostojnega stroja, kot so prikazani v nekaterih filmskih uspešnicah, ne moremo pričakovati še nekaj časa, če sploh kdaj. Vsekakor pa imajo pristopi strojnega učenja vrednost, kar kaže tudi vztrajnost zanimanja in njihove uporabe tako v industriji kakor tudi raziskovalni sferi. Strojno učenje je danes ključen sestavni del številnih komercialnih informacijskih sistemov in razisko-valnih projektov na različnih področjih — od medicinske diagnoze in zdravljenja [1], avtomatskega trgovanja z vrednostnimi papirji [2], sa-1
movozečih avtomobilov [3], pa do priporočil na družbenih omrežjih in spletnih trgovinah [4]. Mnogi menijo, da je uporaba strojnega učenja primerna za uporabo le v velikih podjetjih z obsežnimi raziskovalnimi skupinami in globokimi žepi. S to knjigo ti avtorja želiva pokazati, kako enostavna je uporaba strojnega učenja, če le že poznaš osnove programiranja.
Kot na drugih področjih, tudi pri strojnem učenju obstajajo tako kompleksni in napredni pristopi, kakor tudi enostavni. Za razumevanje najbolj naprednih pristopov (na primer globokega učenja (angl.
deep learning)) res potrebujemo že kar nekaj semestrov matematike.
Po drugi strani pa razumevanje najenostavnejših pristopov zahteva le izkušnje iz programiranja.
Seveda se največ govori o najbolj naprednih metodah, ki terjajo ekipo dvestotih podatkovnih znanstvenikov (kot se imenujemo) in za dve košarkarski dvorani velik računalnik. V resnici pa večji del informacijskih sistemov, ki so podprti s strojnim učenjem, uporablja zelo ele-mentarne tehnike. Vsakdo pa že ne potrebuje naprednega algoritma, ki identificira človeka iz treh pikslov. V večji meri so za obogati-tev obstoječih sistemov dovolj enostavni pristopi, kar je razvidno iz uporabe umetne inteligence v praksi. Nova storitev, katere razvijalci poudarjajo, da je podprta z naprednimi pristopi umetne inteligence, res nima le nekaj pogojnih if-ov in osnovnih opisno statističnih iz-računov, kljub temu pa navadno ni tako kompleksna, kot se mogoče zdi.
Komu je ta knjiga namenjena?
Ta knjiga služi kot uvod v področje strojnega učenja. Namenjena je tistim, ki že znajo programirati -– idealno v programskem jeziku Python, saj so primeri prikazani z uporabo tega jezika. Zakaj Python?
Ker je to eden izmed najbolj uporabljenih programskih jezikov za namen uporabe strojnega učenja. Knjiga se osredotoča na uporabo Pythona in knjižnice scikit-learn [5], ki je osnovna knjižnica za uporabo strojnega učenja. Seveda se ne gre izogniti uporabi knjižnic 2
STROJNO UČENJE
NumPy in Matplotlib oz. pandas in seaborn [6] -– ampak poudarek vsekakor ni na teh.
Zavestno je bila narejena odločitev, da se knjiga preveč ne osredotoča na matematični vidik strojnega učenja. Drži, matematične formule so še vedno prisotne, ampak le do te mere, da pomagajo (ne pa ovirajo) pri razumevanju posameznih pristopov.
Knjiga se osredotoči le na eno tehniko strojnega učenja — na klasifikacijo. Klasifikacija se predstavi na le enem, po mnenju avtorjev, najbolj intuitivnem algoritmu klasifikacije, imenovanemu k najbližjih sosedov. Ta algoritem je predstavljen nekoliko bolj podrobno, s čimer se ponazori, da ima vsak pristop strojnega učenja svoje posebnosti, ki ga naredijo bodisi primernega ali neprimernega za dan problem.
Komu ta knjiga ni namenjena?
V knjigi avtorja okvirno predstaviva različne tehnike in področja strojnega učenja -– podrobnosti pa izpustiva. Če te zanima regresija, ka-tera izmed tehnik nenadzorovanega učenja ali delo z globokimi nevron-skimi mrežami, ta knjiga ni zate. Vsak dober podatkovni znanstvenik je najprej spoznaval temelje strojnega učenja ter se šele potem posvetil naprednejšim tehnikam. Čemu nam bo napredna globoka nevronska mreža, če pa je ne znamo pravilno ovrednotiti? Knjiga je napisana tako, da bo samostojno nadaljevanje učenja kar se da enostavno.
V knjigi niso omenjene vse možne knjižnice strojnega učenja v Pythonu ali možnosti uporabe strojnega učenja v drugih programskih jezikih.
Četudi te delo na strojnem učenju v Pythonu zanese k uporabi PyTor-cha ali TensorFlowa, je scikit-learn osnova, brez katere ne gre. Četudi te bosta delodajalec ali lastna radovednost v prihodnosti usmerila v uporabo strojnega učenja v drugih jezikih, so tudi ostale knjižnice strojnega učenja spisane po zgledu knjižnice scikit-learn.
Po površnem pregledu knjige bi kdo morda prišel do zaključka, da knjiga pokrije snov, ki bi jo lahko predstavili v eni objavi na blogu.
Drži – če bi snov, predstavljeno v tej knjigi, strnili v programsko kodo, UVOD 3
to ne bi bil kompleksen informacijski sistem, temveč le daljša Python skripta. Namen knjige ni, da predstavi čim več različnih načinov uporabe knjižnice scikit-learn in predela vse možne algoritme v tej
– temu namreč služi dokumentacija te knjižnice. Skozi branje se od bralca te knjige pričakuje, da vsak korak (oziroma vsako vrstico kode) razume – kaj se zgodi in čemu je namenjena. Skozi poglobljeno razumevanje ti avtorja želiva predati sposobnost nadaljnjega samostojnega učenja – kaj je pomembno pri določenem pristopu, kako se uporabi ta pristop, kako nastavitve vplivajo na rezultate in tako naprej. Povedano drugače, s knjigo te avtorja želiva naučiti samostojnega učenja snovi strojnega učenja.
Struktura knjige in kje začeti
Uvodu sledijo štiri poglavja.
Poglavje 2 govori o vzpostavitvi okolja, ki bo primerno za uporabo knjižnic, ki jih knjiga vključuje, za zagon primerov iz knjige in za reševanje praktičnih nalog. Če imaš Python okolje že vzpo-stavljeno na svojem računalniku, lahko to poglavje preskočiš.
Poglavje 3 začne s splošno razlago definicije strojnega učenja in vzpostavi vzporednice tega z našim (človeškim) učenjem novega znanja. Večji del poglavja je namenjen predstavitvi glavne tehnike strojnega učenja v tej knjigi — klasifikaciji podatkov. Opisi in definicije gredo od najenostavnejše razlage na primerih pa do formalne matematične definicije pojmov. To poglavje preskoči, če si z osnovnimi tehnikami že seznanjen/-a in bi se želel/-a hitro posvetiti programiranju.
Poglavje 4 obravnava izbran algoritem klasifikacije v tej knjigi — k najbližjih sosedov. Algoritem je najprej predstavljen neodvisno od programiranja na način, ki ti bo omogočal, da ga znaš rešiti tudi na roko. Predstavljene so nekatere nastavitve tega algoritma, s čimer se predstavi pomembnost poznavanja podrobnosti algoritma, da je uporaba tega kar se da učinkovita. Opisu in 4
STROJNO UČENJE
definicijam pa sledijo primeri v programski kodi. Ti primeri so napisani tako, da se lahko neposredno uporabijo pri testiranju in spoznavanju. Za utrjevanje znanja iz tega poglavja so priložene tudi štiri naloge -– dve preverjata teoretično razumevanje in se rešita na roko, dve pa sta programerskega tipa. Tega poglavja nikar ne preskoči, saj predstavlja osnovo, brez katere ne gre.
Poglavje 5 pa se dotakne pomembnega področja ovrednotenja kakovosti uporabljenih tehnik strojnega učenja. Strojno učenje nam prinese dodatno vrednost le, če deluje pravilno. Kako pa izmerimo, če deluje pravilno? V tem poglavju so predstavljene različne metrike kakovosti klasifikacijskih modelov in pristopi, k pravilni vzpostavi testnega okolja (in podatkov) za vrednotenje modelov. Ker je ovrednotenje kakovosti klasifikacijskih modelov ključnega pomena za razvoj uporabnih modelov, je tudi to poglavje priporočljivo za začetnike.
Dobrodošel oziroma dobrodošla v svet strojnega učenja.
UVOD 5
6
STROJNO UČENJE
2 | Vzpostavitev okolja
Za namen prikaza praktičnih primerov bo v tej knjigi uporabljen programski jezik Python, saj je en izmed bolj priljubljenih programskih jezikov z odličnim naborom knjižnic strojnega učenja. Za razumevanje primerov je vsekakor priporočljivo poznavanje tega programskega jezika ali vsaj splošno poznavanje enega izmed modernih programskih jezikov (Java, Perl, C#, R, C, C++). Sledijo navodila vzpostavitve okolja, primernega za izvedbo praktičnih primerov na svojem računalniku.
2.1
Razvojno okolje Jupyter Notebook
Vsi praktični primeri v knjigi so prikazani tako, da se brez težave izvedejo v JupyterLab 1 okolju. To razvojno okolje omogoča pisanje Python programske kode v tako imenovanih Jupyter zvezkih (angl.
Jupyter notebooks).
Ti zvezki se urejajo v poljubnem spletnem brskalniku in zato za ure-janje ne potrebujejo namenskega orodja. Posebnost kode, zapisane v Jupyter zvezkih, je, da je ta v eni datoteki (zvezku) mešana s ta-
1http://jupyterlab.io/
7
kojšnjimi izpisi kode in navodili, ki jih razvijalci zapišemo sproti za razlago delovanja kode. Zvezki so razdeljeni na tako imenovane celice, kjer je celica bodisi navodilo ali pa programska koda z izpisom rezultata, kot je prikazano na sliki 2.1.
Slika 2.1: Jupyter zvezek na spletni storitvi Google Colab.
Namen takega razvoja je, da je programska koda z navodili enostavno deljiva in razumljiva. Prav tako razvoj v zvezku omogoča inkremen-talno zaganjanje kode, celico za celico – tako se zaženejo le želeni deli kode in ne celotna datoteka. To je idealen način razvoja za učenje in za raziskovanje. Jupyter zvezki so postali privzeti način razvoja na področju podatkovne znanosti, saj zadostijo primarnemu namenu podatkovne znanosti – odkrivanju vzorcev in pregledu podatkov skozi zgodbo. Tako je vsaka celica s kodo in priloženo celico navodil kar en del zgodbe, kjer celica z navodili opiše, kaj bo celica s kodo naredila 8
STROJNO UČENJE
ter povzame njene rezultate.
Alternativnih razvojnih okolij je mnogo. Od popolnoma namenskih za programiranje v Pythonu, kot sta PyCharm 2 in Spyder 3, pa do splo-
šnih razvojnih okolij, kot sta Visual Studio Code 4 in Atom 5.
2.2
Uporaba oblačnega okolja
Prvi način uporabe Jupyter zvezkov za namen strojnega učenja je uporaba ene izmed ponujenih storitev. V ta namen so na voljo številni ponudniki z bodisi zastonjskimi ali plačljivimi storitvami izvajanja Python kode v oblaku. Dober primer take storitve je Google Colab6,
ki vsem svojim uporabnikom ponuja kreacijo Jupyter zvezkov in zagon teh na Googlovih strežnikih, do določene mere zastonj – v času pisanja knjige je uporaba Google Colab zvezkov za namen zagona primerov in nalog bila brezplačna. Google Colab je prikazan prav na sliki 2.1.
Konkurence na področju oblačnih zvezkov je ogromno in uporabnost teh se mesečno spreminja ter je vezana na ceno storitve, dostopnost slovenskim razvijalcem in nabor funkcionalnosti. Preprosto spletno iskanje "Jupyter Notebook service" ali "Google Colab alternative" vrne številne rezultate. V času pisanja knjige so med omembe vrednimi bile storitve drugih gigantov strojnega učenja Microsoft Azure Machine
Learning7 in Amazon SageMaker8 ter s strojno opremo radodarna Paperspace9 in Deepnote10.
2https://www.jetbrains.com/pycharm/
3https://www.spyder-ide.org/
4https://code.visualstudio.com/
5https://atom.io/
6https://colab.research.google.com/
7https://ml.azure.com/
8https://aws.amazon.com/sagemaker/
9https://www.paperspace.com/
10https://deepnote.com/
VZPOSTAVITEV OKOLJA 9
2.3
Namestitev in uporaba lokalnega okolja Ana-
conda
V tej sekciji bo predstavljeno, kako vzpostavimo primerno okolje na svojem računalniku. Da namestimo Python in vse potrebne knjižnice, se bomo zatekli k okolju Anaconda, ki vsebuje tako Python kot sku-pek številnih knjižnic, ki se uporabljajo za namen analize podatkov.
Na uradni spletni strani okolja Anaconda poiščemo predel za pre-nos različice, namenjene za posameznike. V času pisanja knjige se ta različica imenuje Individual Edition in je dosegljiva na spletni strani
https://www.anaconda.com/products/individual ter prikazana na sliki 2.2.
Slika 2.2: Spletna stran Python okolja Anaconda.
Okolje Anaconda poleg programskega jezika Python namesti tudi številne knjižnice, namenjene za podatkovno analizo v tem programskem jeziku. Skozi knjigo bomo uporabili številne izmed teh: 10
STROJNO UČENJE
• NumPy, ki se uporablja za upravljanje s podatki v matričnih in več-dimenzionalnih poljih. Podrobnejšega dela s to knjižnico ne bo, je pa vseeno dobro, da se zavedamo, da je to ena izmed ključnih knjižnic, ko imamo opravek s podatki in analizo teh.
Ta knjižnica je tudi sestavni del sledeče knjižnice.
• pandas je knjižnica, ki je namenjena za manipulacijo in analizo podatkov v tabelarični obliki. Čeprav v zaledju uporablja knji-
žnico NumPy, so določene operacije nad podatki poenostavljene.
• scikit-learn je knjižnica, ki vsebuje implementacije različ-
nih algoritmov, metrik in pristopov pred-procesiranja za strojno učenje. Algoritem klasifikacije, ki bo predstavljen v tej knjigi, je povzet po implementaciji iz te knjižnice.
• Matplotlib, ki se uporablja za prikaz grafov različnih vrst. Je zelo prilagodljiva, saj omogoča velik nabor različnih tipov vizua-lizacij podatkov in prilagoditve teh (tako stilno, kot vsebinsko).
Je pa zaradi svoje prilagodljivost delo s to knjižnico nekoliko težje in zaradi tega uporabljamo ...
• seaborn, ki poenostavi prikaz grafov. V zaledju uporablja knji-
žnico Matplotlib, ampak preko svojih vmesnikov določene pogoste operacije pri risanju grafov poenostavi.
Uporaba Jupyter zvezkov
Za pisanje Jupyter zvezkov na lastnem računalniku je najprej potreben zagon okolja JupyterLab, za kar lahko uporabimo enega izmed dveh načinov. Prvi način je zagon JupyterLaba ročno iz komandne vrstice:
1. Zaženemo komandno vrstico. V Windowsih sta to bodisi Com-mand Prompt ali PowerShell. V Linux in MacOS operacijskih sistemih pa je komanda vrstica največkrat pod imenom Termi-nal.
2. Zaženemo ukaz jupyter lab.
VZPOSTAVITEV OKOLJA 11
3. Odpre se okno brskalnika in pokaže se domača stran JupyterLab, kot je prikazano na sliki 2.3.
Drugi način je preko uporabniškega vmesnika okolja Anaconda.
1. Zaženemo Anaconda Navigator.
2. V seznamu ponujenih aplikacij najdimo JupyterLab in ga s pritiskom možnosti Launch zaženemo.
3. Odpre se okno brskalnika in pokaže se domača stran JupyterLab, kot je prikazano na sliki 2.3.
Slika 2.3: Domača stran JupyterLab okolja.
Po želji naredimo novo mapo, kamor shranimo naše zvezke in druge podporne datoteke. V tej mapi ustvarimo novi zvezek, kot prikazuje slika 2.4.
Odpre se novo okno s praznim zvezkom, kot je prikazano na sliki 2.5.
Jupyter zvezke razvijamo preko spletnega vmesnika, kar je tudi razlog za prikaz spletnega brskalnika.
12
STROJNO UČENJE
Slika 2.4: Kreacija novega zvezka v JupyterLab okolju.
Slika 2.5: Nov prazen Jupyter zvezek.
Slika 2.5 ima označene pomembne dele uporabniškega vmesnika. Oznaka 1 prikazuje naslov zvezka, kar s klikom na napis lahko spremenimo.
Oznaka 2 prikazuje tip celice, ki je trenutno izbrana, oznaka 3 pa prikazuje trenutno izbrano in hkrati zaenkrat še edino celico.
VZPOSTAVITEV OKOLJA 13
Markdown v Jupyter zvezkih
Za začetek spremenimo tip prve celice na Markdown, ki je stil zapisa navodil in druge vsebine v celico. V celico zapišemo sledeč Markdown zapis.
# Prvi primer
V __prvem__ primeru bomo:
− N a r e d i l i p r v i i z p i s ‘ Python ‘ kode .
− N a r e d i l i p r v i g r a f s pomoč j o _seaborn_ k n j i ž n i c e .
S pritiskom na gumb zagona, ki je na sliki 2.5 označen s 4 (ali s pritiskom Shift + Enter), se izbrana celica izvede in izbere se (ter če ne obstaja se tudi ustvari) naslednja celica. Ker je izbrana celica bila tipa Markdown, se je zapisana koda oblikovala po stilu Markdown zapisa. Osnovni ukazi za zapis Markdowna so sledeči.
Z znakom #, čemur sledi presledek definiramo naslov.
• # za glavne naslove,
• ## za podnaslove,
• ### za tretji nivo naslovov, pa vse do šestega nivoja naslovov z
######.
Besedilo lahko tudi poudarimo.
• Poševno zapisano besedilo: _besedilo_ ali *besedilo* ter
• krepko zapisano besedilo: __besedilo__ ali **besedilo**.
Dodamo lahko tudi neurejen seznam, tako da vsak element seznama zapišemo v svoji vrstici, začnemo pa ga bodisi z znakom * ali z -.
Sezname lahko gnezdimo – ugnezdene elemente zamaknemo s tabulatorjem.
− Prvi element .
∗ Drugi element .
− Prvi ugnezden element .
− Pa š e drugi .
14
STROJNO UČENJE
Urejene sezname, kjer si elementi sledijo v vrstnem redu, pa ustvarimo tako, da pred elemente dodamo številko ali oznako vrstnega reda. Tudi take sezname lahko gnezdimo. Številko vrstnega reda lahko podamo poljubno, saj ni potrebno, da so te v pravem vrstnem redu.
1 . Prvi element .
2 . Drugi element .
1 1 . Prvi ugnezden element .
1 2 . Pa š e drugi .
Besedilo v stilu kode pa v besedilo zapišemo med znakoma ‘, ki ga na slovenski tipkovnici izberemo z AltGr + 7.
Spremenljivka ‘ vrednost ‘ in razred ‘ podatki ‘ .
Tabelo vstavimo vrstico po vrstico, vsaka celica v vrstici se začne in konča z znakom | (na slovenski tipkovnici AltGr + W). Tako je ena vrstica s tremi celicami zapisana na sledeč način.
| Prva c e l i c a | Druga c e l i c a | Tretja c e l i c a |
Črte med vrstice pa dodamo kar z znakom - namesto vsebine celice.
Primer tabele s tremi stolpci in tremi vrsticami ter črto med prvo in drugo vrstico izgleda sledeče.
| Prva v r s t i c a in p r v i s t o l p e c | Drugi s t o l p e c | T r e t j i s t o l p e c |
| −| −| −|
| Druga v r s t i c a |12| −42|
| Tretja v r s t i c a | −7|65|
Za lažjo razumevanje kode lahko to nekoliko oblikujemo s presledki.
| Prva v r s t i c a in p r v i s t o l p e c | Drugi s t o l p e c | T r e t j i s t o l p e c |
|−−−−−−−−−−−−−−−−−−−−−−−−−−−−|−−−−−−−−−−−−−|−−−−−−−−−−−−−−|
| Druga v r s t i c a
| 1 2
|−42
|
| Tretja v r s t i c a
|−7
| 6 5
|
VZPOSTAVITEV OKOLJA 15
Hiperpovezave vstavljamo s sledečo kodo [Napis povezave](URL), slike pa z zapisom  – razlika je v klicaju.
[ Povezava do i s k a l n i k a Google ] ( h t t p : //www. google . com/)
! [ Primer s l i k e ] ( / imgs / s l i k a . png ) Če ne gre drugače, pa lahko vsebino celic navodil oblikujemo tudi s preprosto HTML kodo. HTML in Markdown zapis lahko po želji me-
šamo. Končen primer vsega skupaj bi zapisali s sledečo kodo, rezultat pa je prikazan na sliki 2.6.
## Preizkus Markdown z a p i s a
1 . P r e i z k u s i l i smo o b l i k o v a n j e pisav 1 . __krepko__ in
2 . _poš evno_ pisavo
2 . P i s a n j e seznamov
− u r e j e n i h in neurejenih ,
− t e r ugnezdenih
3 . Dodajanje [ povezava ] ( h t t p : //www.um. s i /) 4 . Dodajanje s l i k
! [ FERI ] ( h t t p s : // f e r i .um. s i / s i t e / images / logo−f e r i . png ) 5 . P i s a n j e v s t i l u ‘ programske kode ‘
6 . Dodajanje t a b e l
| Prva v r s t i c a in p r v i s t o l p e c | Drugi s t o l p e c | T r e t j i s t o l p e c |
|−−−−−−−−−−−−−−−−−−−−−−−−−−−−|−−−−−−−−−−−−−|−−−−−−−−−−−−−−|
| Druga v r s t i c a
| 1 2
|−42
|
| Tretja v r s t i c a
|−7
| 6 5
|
7 . Tudi HTML koda d e l u j e .
16
STROJNO UČENJE
Slika 2.6: Rezultat Markdown zapisa.
Python koda v Jupyter zvezkih
Če ima celica vsebino tipa Code, pa se vsebina smatra kot Python koda – primerno je tudi obarvana, deluje avtomatsko dopolnjevanje kode (angl. code auto-completion) in rezultati kode se izpišejo kar takoj pod celico. Sledi primer zapisa programske kode v celico.
V prvi vrstici se uvozi knjižnica NumPy ter se poimenuje kot np za nadaljnjo uporabo. Sledi izpis niza znakov z ukazom print() – izpis VZPOSTAVITEV OKOLJA 17
sledi kar pod celico, kot je prikazano na sliki 2.7. Tretja vrstica vsebuje komentar v kodi, ki opisuje zadnjo vrstico. Zadnja vrstica pa vsebuje klic metode rand() knjižnice NumPy, ki vrne polje naključnih števil po podanih velikostih (v primeru je podana velikost polja s tremi vrsticami in dvema stolpcema). Ker ta vrstica vsebuje tudi zadnji ukaz, ki vrača rezultat, se rezultat tega izpiše tudi pod celico.
i m p o r t n u m p y as np
p r i n t ( ’ S l e d i i z p i s p o l j a n a k l j u č nih š t e v i l ’
’ s t r e m i v r s t i c a m i in d v e m a s t o l p c e m a . ’ )
# R e z u l t a t z a d n j e g a u k a z a v c e l i c i se
# i z p i š e kot r e z u l t a t c e l i c e .
np . r a n d o m . r a n d ( 3 , 2 )
Sledi izpis polja naključnih števil s tremi vrsticami in dvema stolpcema.
array(0.27687911, 0.19824952,
0.06910974, 0.7548379 ,
0.64441325, 0.11951306)
Preizkusimo še uporabo knjižnice pandas, ki se uvozi v prvi vrstici kode. Kot že omenjeno pri prvi predstavitvi knjižnice, ta v zaledju uporablja podatke v obliki NumPy polj. To dejstvo lahko izkoristimo pri kreaciji nove strukture podatkov – v pandas-u je to razpredelnica, poimenovana DataFrame. Sledeča koda ustvari polje naključnih števil s 100 vrsticami in dvema stolpcema, ki pa služi pri kreaciji razpredelnice DataFrame. V DataFrame razpredelnici lahko stolpce in vrstice poimenujemo, kot je prikazano s podanim parametrom columns.
Zadnja vrstica kliče metodo head() naše instance data_df razreda DataFrame, ki vrne prvih pet vrstic te razpredelnice, kot tudi kaže slika 2.8.
18
STROJNO UČENJE
Slika 2.7: Prvi preizkus zapisa Python kode v Jupyter zvezek.
i m p o r t n u m p y as np
i m p o r t p a n d a s as pd
d a t a _ n p = np . r a n d o m . r a n d ( 100 , 2 ) d a t a _ d f = pd . D a t a F r a m e ( data_np , c o l u m n s = [ ’ P r vi s t o l p e c ’ ,
’ D r u g i s t o l p e c ’ ] )
d a t a _ d f . h e a d ()
Prvi stolpec Drugi stolpec
0 0.753358
0.029272
1 0.901894
0.846576
2 0.492876
0.533067
3 0.943245
0.538149
4 0.567161
0.537613
VZPOSTAVITEV OKOLJA 19
Slika 2.8: Preizkus delovanja knjižnice pandas.
Sledi preizkus izrisa grafov s knjižnicama seaborn in Matplotlib.
Sledeča koda prikazuje izris grafa raztrosa (angl. scatter plot) za prej ustvarjeno razpredelnico data_df.
i m p o r t s e a b o r n as sns
sns . s c a t t e r p l o t ( x = d a t a _ d f [ ’ P r v i s t o l p e c ’ ] , y = d a t a _ d f [ ’ D r u g i s t o l p e c ’ ] ) Če za izris grafa uporabimo Matplotlib, pa bo koda sledeča.
i m p o r t m a t p l o t l i b . p y p l o t as plt plt . s c a t t e r ( x = d a t a _ d f [ ’ P r v i s t o l p e c ’ ] , y = d a t a _ d f [ ’ D r u g i s t o l p e c ’ ] ) 20
STROJNO UČENJE
Slika 2.9: Preizkus izrisa grafa raztrosa s knjižnico seaborn.
Na prvi pogled se zdi uporaba seaborn in Matplotlib knjižnic po-dobna, kar tudi v resnici je. Nekatere tehnike grafične predstavitve podatkov je s knjižnico seaborn lažje narediti, medtem, ko je pri izrisu grafov Matplotlib mnogo bolj prilagodljiv. Prikaz uporabe knjižnice seaborn je na sliki 2.9.
Sedaj bomo preizkusili še knjižnico scikit-learn, ki vsebuje različne pristope, metode ter tehnike strojnega učenja in predprocesi-ranja podatkov. Preden se lotimo uporabe metod strojnega učenja, bomo tokrat preizkusili nalaganje priloženih podatkov v knjižnici scikit-learn. Ena izmed priloženih je podatkovna zbirka Iris, ki vsebuje podatke o cvetočih rastlinah perunikah. V prvi vrstici se najprej naloži modul knjižnice scikit-learn, v drugi vrstici pa se naloži podatkovna zbirka Iris ter se shrani v spremenljivko iris_vse. Ker smo pri klicu metode podali as_frame=True, bodo rezultati v obliki VZPOSTAVITEV OKOLJA 21
pandas razpredelnice DataFrame. Če tega ne bi podali, pa bi rezultat podatkov bil v obliki NumPy polja. Shranjeni podatki v spremenljivki iris_vse imajo več vrednosti: vrednost data nam vrne podatke o rožah (višine in širine čašnih in cvetnih listov). Vrednost target pa nam vrne vrednosti razredov te podatkovne zbirke – za kateri tip pe-runike gre. Zadnja vrstica kode izpiše prvih pet vrstic podatkov, kot je tudi prikazano na sliki 2.8.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s i r i s _ v s e = l o a d _ i r i s ( a s _ f r a m e = T r u e ) i r i s _ p o d a t k i = i r i s _ v s e . d a t a i r i s _ r a z r e d i = i r i s _ v s e . t a r g e t i r i s _ p o d a t k i . h e a d ()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1
3.5
1.4
0.2
1 4.9
3.0
1.4
0.2
2 4.7
3.2
1.3
0.2
3 4.6
3.1
1.5
0.2
4 5.0
3.6
1.4
0.2
Za konec preizkusimo z izrisom grafa raztrosa, kjer bodo pike vsake izmed instanc pobarvane glede na podan razred te instance.
sns . s c a t t e r p l o t ( x = ’ s e p a l l e n g t h ( cm ) ’ , y = ’ s e p a l w i d t h ( cm ) ’ ,
d a t a = i r i s _ p o d a t k i ,
hue = i r i s _ r a z r e d i )
Tokrat smo za parameter data podali kar razpredelnico iris_podatki, ki je pandas DataFrame. Parametra x in y smo tokrat zapisali kot niz znakov – imena stolpcev iz podane razpredelnice. S parametrom hue določimo, kako se oznake na grafu pobarvajo. Lahko bi podali tudi 22
STROJNO UČENJE
ime stolpca (ki pa ga tokrat v razpredelnici data nimamo), ali pa kot ločeno spremenljivko razpredelnice s temi podatki (kot smo naredili tokrat z iris_razredi). Rezultat je prikazan na sliki 2.10.
Slika 2.10: Graf raztrosa podatkovne zbirke Iris.
VZPOSTAVITEV OKOLJA 23
2.4
Nalaganje podatkov
Da lahko izvedemo analize in uporabimo algoritme strojnega učenja, pa potrebujemo podatke. Sledeča sekcija pregleda, kako naložimo podatke v naš Python program oziroma Jupyter zvezek.
Nalaganje prostodostopnih podatkov
Že v prejšnji sekciji smo pokazali, kako lahko dostopamo do standardnih podatkovnih zbirk, ki se mnogokrat uporabljajo v procesu učenja.
To smo storili s pomočjo knjižnice scikit-learn, saj so preko te knji-
žnice že nameščene številne podatkovne zbirke. Skozi celotno knjigo bomo največkrat uporabili podatkovno zbirko Iris, v nalogah pa bodo uporabljene tudi Wine in Breast cancer. V vseh primerih gre za podatkovne zbirke, namenjene klasifikaciji. Nabor podatkovnih zbirk, ki so priložene tej knjižnici, je dostopen na https://scikit-learn.org/
stable/datasets/toy_dataset.html za enostavne in majhne zbirke ter https://scikit-learn.org/stable/datasets/real_world.html
za zbirke iz realnega sveta.
Podatkovne zbirke iz scikit-learn vrnejo objekt s sledečimi vrednostmi:
• data je razpredelnica s podatki vseh instanc,
• target je polje z rešitvami vseh instanc,
• feature_names je seznam imen vseh atributov, ki so v data ter
• target_names je seznam imen rešitev (če gre za razrede).
Če nam priložene prostodostopne podatkovne zbirke niso dovolj, lahko uporabimo poljubno podatkovno zbirko iz portala OpenML.org11. Ta portal igra vlogo repozitorija za podatkovne zbirke. Te lahko upo-rabniki portala prosto nalagajo na portal in tudi do njih dostopajo.
Knjižnica scikit-learn ponuja vmesnik za neposredno nalaganje teh
11https://www.openml.org/
24
STROJNO UČENJE
datotek s pomočjo metode fetch_openml, kateri podamo ime zbirke, kot kaže spodnja koda.
f r o m s k l e a r n . d a t a s e t s i m p o r t f e t c h _ o p e n m l p o d a t k i = f e t c h _ o p e n m l ( n a m e = ’ e c o l i ’ ) p r i n t ( p o d a t k i . f e a t u r e _ n a m e s )
[’mcg’, ’gvh’, ’lip’, ’chg’, ’aac’, ’alm1’, ’alm2’]
Tudi pri nalaganju podatkovnih zbirk iz OpenML.org lahko fetch_openml metodi povemo, da želimo razpredelnico DataFrame.
To storimo enako kot pri nalaganju priloženih podatkovnih zbirk, s podajo as_frame=True.
f r o m s k l e a r n . d a t a s e t s i m p o r t f e t c h _ o p e n m l p o d a t k i = f e t c h _ o p e n m l ( n a m e = ’ n u r s e r y ’ , a s _ f r a m e = T r u e ) p r i n t ( p o d a t k i . t a r g e t . he a d () ) 0 recommend
1 priority
2 not_recom
3 recommend
4 priority
Nalaganje lastnih podatkov
Podatke lahko v program oziroma zvezek naložimo s pomočjo knjižnice pandas, ki prepozna podatke v številnih različnih formatih12:
• tekstovne datoteke, kjer so podatki ločeni z znaki (npr. z vejico v CSV, tabulatorjem ali drugim znakom),
12https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
VZPOSTAVITEV OKOLJA 25
• JSON format tekstovne datoteke,
• HTML spletne strani, iz katerih se podatki preberejo iz elementa
,
• Excel ali OpenDocument razpredelnice,
• Lastniške SAS ali SPSS datoteke podatkov,
• podatkovne baze s SQL klicem ter
• lokalne odložišča (angl. clipboard).
Primer nalaganja iz CSV datoteke, kjer so vrednosti ločene s podpi-
čjem ; prikazuje spodnja koda. Vsak format ima svojo metodo za prebiranje datotek, saj so določene nastavitve formatu specifične. Pri prebiranju iz tekstovnih datotek tako lahko podamo znak, ki ločuje vrednosti s sep, znak ločevanja decimalnih mest s dec, vrstico, ki predstavlja imena atributov, s header ali pa podamo ta imena kar v names.
i m p o r t p a n d a s as pd
p o d a t k i = pd . r e a d _ c s v ( ’ d a t o t e k a . txt ’ , sep = ’ ; ’ , dec = ’ , ’ ) S pomočjo tega je po prebiranju knjige mogoče osvojeno znanje apli-cirati na lastne podatke.
26
STROJNO UČENJE
3 | Klasifikacija
Kam gremo po nasvet, ko se počutimo bolni? Se zatečemo k so-sedu, sodelavki, prijatelju ali pa raje obiščemo zdravnika? Vsekakor je najbolje, da obiščemo zdravnika. Premislimo, zakaj. Kaj je pred-nost zdravnika v primerjavi z ostalimi naštetimi v danem problemu?
Zdravnik ima najverjetneje mnogo več znanja in izkušenj pri diagnozi bolezni, saj se je kot študent več let učil prav o tej tematiki in v svoji delovni karieri že pridobil mnogotero izkušenj. Tekom tega procesa pridobivanja znanja in izkušenj tako predpostavimo, da se je zdravnik že usposobil za kakovostno spopadanje z danim problemom diagnoze bolezni.
3.1
Model znanja
Naslednjič, ko srečate zdravnika, ga kar povprašajte o tem, kako se spopade z izzivom diagnoze pacienta na podlagi simptomov obolenj.
Verjetno bo začel s pregledom trenutnega in preteklega stanja pacienta. Naredil bo različne meritve pacientovega telesa (telesna temperatura, krvni pritisk, hormonska slika, krvna slika, rentgen ...) in dodatno pregledal pacientovo kartoteko.
Ob preučevanju novih in preteklih meritev pacienta bo zdravnik naj-27
verjetneje že imel ustaljen postopek razmišljanja pri postavitvi diagnoze. Recimo, da želimo analizirati delo našega zdravnika in ga prosimo, da na kar se da razumljiv način opiše svoj proces odločanja. Najverjetneje zdravnik (ali strokovnjak drugih področij) nima formalno določenega procesa odločanja, ampak se pri tem zateka tudi k svoji intuiciji, ki jo je razvil po vseh letih šolanja in izkušenj. Pa vendar, če bi se zdravnik odločil zapisati svoj proces odločanja na papir, bi ta verjetno izgledal nekako tako:
• Če je telesna temperature pacienta nad 40 °C, je pacient bolan.
• Če je telesna temperature nad 38 °C in je sistolični krvni pritisk nad 140 mHg, je pacient bolan.
• Če je telesna temperature pod 38 °C, je pacient zdrav.
Svoj proces diagnoze bi zdravnik zapisal v obliki pravil, katerim bi sledil bodisi po vrsti ali pa bi jih upošteval vse hkrati. Tem pravilom pravimo model znanja (angl. knowledge model).
Kateri drug zdravnik pa bi svoj proces odločanja mogoče lažje zapisal v obliki odločitvenega drevesa (slika 3.1).
Temp > 40
Drži
Ne drži
Bolan
Temp > 38
Krvni pritisk > 140
Zdrav
Bolan
Zdrav
Slika 3.1: Model znanja v obliki odločitvenega drevesa.
28
STROJNO UČENJE
Pri interpretaciji takega drevesa bi zdravnik začel na vrhu (korenu) drevesa in se z odgovarjanjem na vprašanja v posameznem vozlišču drevesa pri pregledu posameznega pacienta premikal vse do listov drevesa. Listi pa mu povedo odgovor glede diagnoze pacienta.
Nek tretji zdravnik pa boljše razmišlja, ko svoj model znanja predstavi v obliki matematičnih formul. Slika 3.2 prikazuje graf, kjer je na horizontalni X osi telesna temperatura pacienta, na vertikalni Y osi pa je krvni pritisk pacienta. Matematična formula deli prostor na dva dela – na prostor, kjer se nahajajo zdravi in na prostor, kjer se nahajajo bolni pacienti.
Zdrav
Bolan
140
Krvni pritisk
38
40
Temperatura
Slika 3.2: Model znanja v obliki matematične funkcije.
Zadnji zdravnik pa bi deloval popolnoma drugače kot prejšnji trije.
Ta ne bi znal na papir zapisati svojega modela znanja, saj se odloča po drugačnem postopku – pregleda svoje prejšnje paciente iz bogate dvajsetletne kariere in novega pacienta primerja z njimi. Ko najde primere že diagnosticiranih pacientov, ki so novemu pacientu najbolj podobni, preprosto pogleda, kakšna je bila njihova diagnoza in temu KLASIFIKACIJA 29
novemu poda mnenje o njegovem stanju bolezni, ki je skladna s prej-
šnjimi (podobnimi) pacienti. Ta proces je prikazan na sliki 3.3.
Zdrav
Bolan
Brez diagnoze
140
Krvni pritisk
38
40
Temperatura
Slika 3.3: Model znanja v obliki sprotne primerjave z že rešenimi primeri.
Vsi štirje opisani načini odločanja zdravnikov v resnici prikazujejo različne načine predstavitve modela znanja. Teh je v realnosti še mnogo več, tekom te knjige pa bomo podrobneje spoznali zadnji način zapisa modela znanja – primerjavo novih primerov s starimi, že rešenimi.
3.2
Ekspertni sistem
Gradnjo modela znanja zdravnika vizualno prikazuje slika 3.4. Najverjetneje preberejo zdravniki tekom študija medicine in delovne kariere mnogo knjig, znanstvenih in strokovnih člankov ter pridobijo mno-gotere izkušnje. To kaže zgornji del slike. Rezultat takega procesa je model znanja (seveda ne formalno zapisan). Ob pregledu novega 30
STROJNO UČENJE
pacienta uporabijo ta model znanja, da pridejo do končne diagnoze pacienta, kar je ponazorjeno s spodnjim delom slike.
Knjige, članki in
izkušnje
Zdravnica
Učenje modela znanja
Model znanja
Kartoteka
Odločitev
pacienta
Zdravnica
o diagnozi
Uporaba modela znanja
Slika 3.4: Poenostavljen prikaz procesa gradnje in uporabe modela znanja.
Seveda lahko zdravnikov model znanja prepišemo v programsko kodo in tako uporabimo njegov model znanja v vsakdanjih informacijskih sistemih, kot kaže slika 3.5. To je standardni postopek pri gradnji ek-spertnih sistemov (angl. expert systems) tj. informacijskih sistemov, ki uporabijo model znanja, ki so jih zgradili strokovnjaki (na primer KLASIFIKACIJA 31
zdravniki). Z digitalizacijo modela znanja pridobimo zmožnost hi-trejše uporabe modela znanja in posledičnega odločanja, saj računalnik lahko tak model znanja uporabi tudi milijonkrat v sekundi.
Knjige, članki in
izkušnje
Zdravnik
Učenje modela znanja
Model znanja
Kartoteka
Odločitev
pacienta
Računalnik
o diagnozi
Uporaba modela znanja
Slika 3.5: Proces uporabe modela znanja v ekspertnem sistemu.
Pri ekspertnem sistemu še vedno ne govorimo o umetni inteligenci ali strojnem učenju, saj računalnik ni sodeloval pri procesu učenja (gradnje modela znanja), ampak je le neumen stroj, ki sledi modelu znanja, zapisanem v obliki if in for stavkov.
32
STROJNO UČENJE
3.3
Inteligentni sistem
Premislimo, kako bi lahko v prejšnjem procesu vključili računalnik v proces gradnje modela znanja. Namesto da človek postane strokovnjak s pomočjo preučevanja literature in nabiranja izkušenj, bomo tokrat uporabili kar računalnik za gradnjo modela. Ampak kako? Ra-
čunalnik ne razume prebranih knjig in ne more pridobivati izkušenj.
Tukaj pa uporabimo enak pristop učenja, kot ga uporabijo ljudje v situacijah, kjer se učijo s pomočjo opazovanja – pri delu opazujejo strokovnjake in skušajo ugotoviti, kako strokovnjaki delajo, da lahko to kasneje posnemajo.
Podobno pot uberemo, ko želimo pri gradnji modela uporabiti računalnik kar kaže slika 3.6. Namesto iz knjig in izkušenj, računalnik razbere vzorce iz dela strokovnjakov, ki pa je v tem primeru sesta-vljeno iz že rešenih problemov. Če računalniku podamo kartoteke že diagnosticiranih pacientov, bo ta lahko iz teh kartotek razbral vzorce, ki so značilni za bolne paciente in vzorce, ki so značilni za zdrave paciente.
Seveda, enako kot vajenec ne bo postal mojster pri enournem opazova-nju strokovnjaka pri delu, tako tudi računalnik ne uspe najti vzorcev iz le nekaj primerov že diagnosticiranih pacientov. Koliko podatkov pa bo dovolj? Če je delo mojstra zelo zapleteno, bo vajenec potreboval nekaj let opazovanja, da bo ugotovil pravi način dela tega strokovnjaka. Če pa vajencu kažemo, kako nalepiti obliž na rano, pa bo vajenec vzorec za reprodukcijo videnega odkril že po nekaj minutah.
Podobno je tudi pri računalniku.
Količina potrebnih rešenih primerov je odvisna od količine in kom-pleksnosti vzorcev – več kot je vzorcev in bolj so ti kompleksni, več podatkov bo računalnik potreboval, da bo vzorce prepoznal.
Računalniški algoritem, ki iz podatkov razbira vzorce, imenujemo algoritem strojnega učenja (angl. machine learning algorithm). Ta algoritem je zadolžen, da namesto človeka ustvari model znanja, ki ga KLASIFIKACIJA 33
kasneje lahko pri svojem delu uporabita tako človek, kakor tudi ra-
čunalnik. Sistem, ki vključuje algoritem strojnega učenja za gradnjo modela znanja, pa imenujemo inteligentni sistem (angl. intelligent system).
Uporabi algoritem
strojnega učenja
Diagnosticirani pacienti
Računalnik
Učenje modela znanja
Model znanja
Kartoteka
Odločitev
pacienta
Računalnik
o diagnozi
Uporaba modela znanja
Slika 3.6: Proces učenja in uporabe modela znanja v inteligentnem sistemu.
34
STROJNO UČENJE
3.4
Podatki
Podatki, uporabljeni v algoritmu strojnega učenja za namen kreacije modela znanja, so združeni v podatkovne množice (angl. datasets) in so lahko v obliki preproste strukturirane tekstovne datoteke ali podatkovne baze poljubne strukture (relacijske, objektne ali dokumentne podatkovne baze).
Najenostavnejša struktura podatkov, namenjenih za strojno učenje ima obliko, ki je prikazana na sliki 3.7. Vsako vrstico v tekstovnem do-kumentu ali vsak primerek podatkovne baze imenujemo učna instanca ali učni primerek (angl. learning instance ali learning example). Vsaka instanca je opisana z množico karakteristik imenovanih atributi (angl.
features) ali tudi neodvisne spremenljivke oziroma značilnice. Prostor atributov (angl. feature space) F je vektor vseh atributov.
Atributi so v stolpcih
↓
Višina Teža Starost . . .
181
92
45
Instance so
178
71
27
v vrsticah
→
168
73
65
. . .
Slika 3.7: Struktura podatkov, primernih za strojno učenje.
3.5
Strojno učenje
Strojno učenje (angl. machine learning) zajema tehnike, kjer se računalnik nauči reševanja specifičnih in ozko usmerjenih nalog iz podatkov – pravimo, da odločitve strojnega učenja temeljijo na podatkih.
Tehnike strojnega učenja uvrščamo v krovno področje umetne inteligence (angl. artificial intelligence), ki pa pokriva mnogo širše raz-iskovalno področje. Področje, povezano s strojnim učenjem, je tako KLASIFIKACIJA 35
imenovano podatkovno rudarjenje (angl. data mining), kjer s pomo-
čjo različnih tehnik, med drugimi tudi s strojnim učenjem, obdelujemo in preučujemo podatke ter poskušamo iz njih razbrati vzorce in posledično novo znanje. Izraz podatkovno rudarjenje uporabljamo, ko se srečamo s problemom uporabe samih metod strojnega učenja kot orodij za reševanje drugih problemov in ne s samo implementacijo teh.
Strojno učenje delimo na štiri področja glede na stopnjo nadzora nad učenjem [7]:
Nadzorovano učenje (angl. supervised learning) se uporablja, ko želimo, da se računalnik nauči klasificirati (razvrščati) podatke v vnaprej določene razrede ali jim pripisovati številske vrednosti. Temu rečemo nadzorovano učenje, ker se stroj uči na rešenih podatkih (z znanimi razredi ali vrednostmi) in ker lahko nadzo-rujemo kakovost dobljenih modelov znanja. Pri nadzorovanem učenju imamo dve nalogi, ki ju mora stroj opravljati: regresijo in klasifikacijo.
Regresija (angl. regression) se uporablja, ko se računalnik na podlagi podanih karakteristik (neodvisnih spremenljivk) nauči napovedovanja numeričnih vrednosti (odvisne spremenljivke). Primer takega problema bi bil napovedovanje cene delnice ali količine dežja glede na znane podatke. Z
regresijo se v tej knjigi ne bomo ukvarjali, zato se v podrobnejše razlage ne bomo spuščali.
Klasifikacija (angl. classification) pa se uporablja, ko se ra-
čunalnik iz rešenih podatkov nauči te razvrščati v vnaprej določene razrede. Primer smo že omenjali, ko smo govo-rili o diagnozi pacientov in ga bomo podrobneje opisali v nadaljevanju.
Nenadzorovano učenje (angl. unsupervised learning) uporabimo, ko želimo odkriti še neznane povezave med podatki in strukturo teh podatkov. V tem primeru naši podatki ne vsebujejo rešitve, 36
STROJNO UČENJE
saj rešitev še ne poznamo, in posledično kakovosti takih modelov ne moremo nadzirati. Nenadzorovano učenje ima več nalog, ki se jih stroj nauči: gručenje in sprememba strukture podatkov.
Gručenje (angl. clustering) je tehnika, kjer računalnik najde vzorce, ki povezujejo podatke v gruče, in tako najde do-slej neznane povezave med podatki. Definicija teh gruč ni vnaprej znana, a v vsakem primeru računalnik uporabi eno izmed tehnik, da gruče združujejo podobne in povezane podatke skupaj. Število gruč je lahko vnaprej določeno ali pa se odločitev o številu gruč prepusti računalniku. Primer gručenja je iskanje profilov strank v trgovini, kjer imajo stranke v isti gruči podobne nakupovalne navade.
Spreminjanje in preučevanje strukture podatkov pa zdru-
žuje tehnike, ki se ukvarjajo s transformacijo, preslikavo, združevanjem in selekcijo posameznih karakteristik iz podatkov. Podrobneje teh tehnik ne bomo obravnavali v okviru te knjige.
Delno nadzorovano učenje (angl. semi-supervised learning) je srednja pot med nadzorovanim in nenadzorovanim učenjem. Pri tej tehniki še vedno klasificiramo podatke v vnaprej podane razrede, pri čemer si pomagamo z novimi karakteristikami podatkov, ki pa so rezultat nenadzorovanega učenja, ali pa uporabljamo le delno označene podatke (na primer, če imamo v učni množici le bolne paciente). Tipična uporaba delno nadzorovanega učenja je iskanje anomalij, kjer poznamo samo lastnosti normalnih podatkov in iz tega sklepamo, kaj je normalno – vse, kar je drugačno, pa je anomalija.
Okrepitveno učenje (angl. reinforcement learning) je razširjeno nadzorovano ali nenadzorovano učenje, kjer se računalnik uči na podlagi nagrad ali kazni glede na izide učenja. Pri nagrajevanju in kaznovanju lahko sodeluje človek ali pa je nagrada podeljena računsko. V primeru sodelovanja človeka, ta poda dodatne in-KLASIFIKACIJA 37
formacije o samih podatkih, ali pa v iterativnem postopku poda mnenje o kakovosti modela. Tega pristopa strojnega učenja v okviru te knjige ne bomo obravnavali.
3.6
Klasifikacija
Osrednja metoda strojnega učenja te knjige je metoda klasifikacije, kjer se računalnik nauči klasificirati instance v vnaprej določene razrede. Z regresijo napovemo številske vrednosti in so odločitve zvezne, pri klasifikaciji pa napovedujemo nominalne vrednosti – diskretne razrede. Klasifikacija se uporablja v primerih, kot so razpoznava vzorcev na slikah, preprečevanje prevar, zaznavanje nezaželene pošte in dia-gnosticiranje bolezni. Če računalnik podatke deli v dva razreda, govorimo o binarni klasifikaciji, če pa računalnik klasificira v več razredov, pa imamo opravka z večrazredno klasifikacijo. [8]
Obstaja na tisoče različnih algoritmov klasifikacije, ki jih v grobem delimo glede na to, v kakšni obliki shranijo model znanja [8], [9]:
• matematične formule in porazdelitve (logistična regresija, naivni Bayesov klasifikator, metoda podpornih vektorjev),
• odločitvena drevesa (CART, C4.5, ID3, evolucijska drevesa),
• odločitvena pravila (RIPPER, PART, evolucijska pravila),
• umetne nevronske mreže (konvolucijske, rekurzivne) in
• klasifikatorji na podlagi podobnosti (k najbližjih sosedov).
Nekatere metode zgradijo model znanja, ki se uporablja pri klasifikaciji novih instanc, ne da bi bil potreben vpogled v prej podane podatke. Takim metodam pravimo metode takojšnjega učenja (angl.
eager learning), saj zgradijo model znanja takoj in ga kasneje ne prilagajajo.
Nasprotno, pa nekatere metode, kot na primer k najbližjih sosedov, ne ustvarijo učnega modela, ampak za vsako klasifikacijo nove instance 38
STROJNO UČENJE
ponovno naredijo pregled že prej podanih podatkov. Te metode uporabljajo leno učenje (angl. lazy learning), saj se učijo sproti po potrebi. Prav ta pristop bomo kasneje pregledali pri preizkusu našega klasifikatorja k najbližjih sosedov.
3.7
Matematična definicija pojmov
V nadaljevanju bomo za metodo klasifikacije uporabljali sledečo defi-nicijo instanc. Ena instanca je par (xi,yi), kjer je xi vektor vrednosti (atributov) te instance, yi pa je dejanski razred instance (skalarna vrednost). Učna množica X je definirana kot množica vseh instanc, na katerih se algoritem uči, sestavljena je iz n instanc in je definirana, kot prikazuje spodnja enačba.
X = {(x1,y1) , (x2,y2) , . . . , (xn,yn)}
xi = (x1i,x2i, . . . , xli)
yi ∈ {razred1, razred2, . . . , razredk}
n = število instanc
l = število atributov
k = število razredov
Vrednost xi je vektor atributov (x1,x2, . . . , xl) velikosti l, ki je defini-i
i
i
ran v prostoru atributov F , razred instance yi pa je vrednost iz nabora vseh možnih razredov v velikosti k. Cilj algoritmov klasifikacije je, da ob dani učni množici X najdejo sledečo funkcijo:
h : xi → yi
za vsak i ∈ [1,n], tako da bo model znanja klasifikacije h(xi) dovolj dober napovedovalec razreda yi. Proces klasifikacije prikazuje slika
3.8.
KLASIFIKACIJA 39
Podatkovna
množica
X
Algoritem
klasifikacije
x1
x2
Model znanja
x3
klasifikacije
y
h
xl
Slika 3.8: Splošni proces klasifikacije, kjer iz podatkovne množice X
algoritem klasifikacije ustvari model znanja klasifikacije h. Ta model preslika vhode instance x1, x2, . . . , xl v razred y.
Ob pregledu splošnega področja strojnega učenja in klasifikacije pa zdaj sledi preizkus prvega klasifikatorja. Naredili bomo teoretični pregled klasifikatorja k najbližjih sosedov in prikazali praktični primer njegove uporabe.
40
STROJNO UČENJE
4 | Prvi klasifikator
Začeli bomo s pregledom delovanja klasifikacije na podlagi podobnosti med instancami. Prvo vprašanje, ki se nam poraja, je, kako sploh do-ločimo podobnost med instancami? Oziroma povedano drugače, kdaj sta si dve instanci podobni in kdaj ne? Intuitivno si ljudje naredimo prvi vtis glede na podobnost z že poznanimi koncepti. Vidimo nov avto? Ta je podoben našemu avtu doma – torej je najverjetneje hiter, porabi veliko goriva in ni primeren za vožnjo po slabi cesti.
Kaj pa, če izbiramo nove zimske čevlje izmed nabora čevljev, ki jih trgovina ponuja? Vse čevlje v ponudbi primerjamo na podlagi izkušenj z zimskimi čevlji, ki smo si jih lastili v preteklosti. Želimo si nove čevlje, ki so čim bolj podobni prejšnjim, na žalost obrabljenim. Všeč nam je bila njihova barva, prav tako nas niso žulili pri daljši hoji, na ledu nam nikoli ni drselo pa tudi za na fakulteto so bili primerni.
Izmed vseh ponujenih čevljev najdemo najbližje našim prejšnjim – to ljudje naredimo intuitivno, hitro in brez nepotrebnih kalkulacij.
Kako pa pripravimo računalnik, da bo videl podobnosti med pred-stavljenimi koncepti? Z izračunom razdalje med dvema konceptoma.
Bolj sta si dve stvari podobni, manjša je razdalja med njima, ter obratno – manj sta si dve stvari podobni, večja je razdalja med njima.
41
Naši čevlji
Ponudba čevljev
Slika 4.1: Izbira novih čevljev s primerjavo.
4.1
Računanje razdalj
Poglejmo si primer primerjave dveh čevljev prikazan na sliki 4.2.
Čevlji A
Čevlji B
17 cm
9 cm
231 g
119 g
Slika 4.2: Primerjava dveh čevljev.
Ta primer preslikajmo v tabelo, kjer je prva vrstica namenjena atributom prvih čevljev, druga vrstica je namenjena atributom drugih čevljev, v tretji vrstici pa so razlike med njima.
42
STROJNO UČENJE
Tabela 4.1: Primer računanja razdalje med dvema čevljema.
Višina Teža Vodoodporni Barva
Čevlji A
17
231
da
rjavi
Čevlji B
9
119
ne modri
Razlika
8
112
?
?
Razlike med številskimi atributi je enostavno izračunati; preprosto vzamemo vrednost številskih atributov prve instance in odštejemo vrednost atributov druge instance. V primeru kategoričnih atributov pa ni možno določiti, kateri kategoriji sta si bližji in kateri sta si dlje.
Ko moramo izračunati razdaljo med dvema kategorijama, preprosto uporabimo naslednje pravilo:
• Če sta kategoriji enaki, je razdalja med njima 0.
• Če sta kategoriji različni, je razdalja med njima 1.
Knjižnica scikit-learn pa ne razlikuje med tipi spremenljivk – vse spremenljivke obravnava kot številske oziroma razmernostne. Za naši dve kategorični spremenljivki vodoodpornosti in barve čevljev to predstavlja težavo, saj v trenutni obliki nista zapisani v obliki števil.
Indikacijski atributi
Za uporabo podatkov s knjižnico scikit-learn je podatke potrebno prilagoditi tako, da kategorične atribute spremenimo v številske.
Napačen pristop bi bil določitev števila vsaki kategoriji. Pri barvi čevljev bi tako barva črna postala število 0, barva modra število 1, barva rjava število 2, in tako naprej. Ta pristop še vedno ni pravilen, saj algoritmi strojnega učenja največkrat operirajo s takimi vrednostmi –
naključna določitev številk kategorijam pa bi izračune pokvarila. Pri računanju razdalj bi tako razdalja med črnimi in rjavimi čevlji bila 2, med črnimi in modrimi pa le 1. To je nesmiselno, saj barv ne moremo PRVI KLASIFIKATOR 43
postaviti v vrstni red.
Posledično se transformacije kategoričnih atributov v številske atribute lotimo s pomočjo kreacije indikacijskih atributov (angl. dummy attribute). Iz enega kategoričnega atributa tako nastane več novih številskih atributov. Za vsako kategorijo enega kategoričnega atributa tako nastane svoj številski atribut. Če so čevlji lahko treh različnih barv (črni, modri, rjavi), potem nastanejo trije novi atributi: Barva (črni), Barva (modri) in Barva (rjavi). Indikacijski atribut ima lahko le dve vrednosti:
• vrednost 0, če kategorija ne drži za instanco ter
• vrednost 1, če kategorija drži za instanco.
Poglejmo si tabelo 4.2 podatkov obeh čevljev po transformaciji kategoričnih atributov v indikacijske atribute. Zdaj je primerjava mnogo bolj smiselna. Prav tako je opazno, da obstaja razlika tako v vodoodpornosti čevljev, kakor v barvi.
Tabela 4.2: Primer računanja razdalje z indikacijskimi atributi.
Višina Teža Vod. Vod. Barva
Barva
Barva
(da) (ne) (črni) (modri) (rjavi)
Čevlji A
17
231
1
0
0
0
1
Čevlji B
9
119
0
1
0
1
0
Razlika
8
112
1
-1
0
-1
1
4.1.1
Kreacija indikacijskih atributov v Pythonu
Najenostavnejši postopek kreacije indikacijskih atributov je s pomo-
čjo pandas knjižnice. Struktura podatkov DataFrame ima že zabeležen tip vsakega stolpca, kar poenostavi avtomatsko transformacijo kategoričnih atributov v indikacijske. Sledeča koda prikazuje kreacijo podatkov, iz katerih se bodo kreirali indikacijski atributi.
44
STROJNO UČENJE
# D e f i n i r a m o v s a k o i n s t a n c o kot s e z n a m a t r i b u t o v c e v l j i A = [ 17 , 231 , ’ da ’ , ’ r j a v i ’ ]
c e v l j i B = [ 9 , 119 , ’ ne ’ , ’ m o d r i ’ ]
c e v l j i C = [ 12 , 143 , ’ ne ’ , ’ č rni ’ ]
c e v l j i D = [ 8 , 112 , ’ ne ’ , ’ r j a v i ’ ]
c e v l j i E = [ 11 , 198 , ’ da ’ , ’ m o d r i ’ ]
c e v l j i F = [ 15 , 245 , ’ da ’ , ’ č rni ’ ]
Sledi še kreacija DataFrame strukture s podatki.
i m p o r t p a n d a s as pd
# Z z d r u ž i t v i j o i n s t a n c u s t v a r i m o D a t a F r a m e p o d a t k i = pd . D a t a F r a m e ( [ cevljiA , cevljiB , cevljiC , cevljiD , cevljiE , c e v l j i F ] ,
c o l u m n s = [ ’ Vi š ina ’ , ’ Te ž a ’ ,
’ V o d o o d ’ , ’ B a r v a ’ ] ,
i n d e x = [ ’ c e v l j i A ’ , ’ c e v l j i B ’ ,
’ c e v l j i C ’ , ’ c e v l j i D ’ ,
’ c e v l j i E ’ , ’ c e v l j i F ’ ] )
p r i n t ( p o d a t k i )
Višina
Teža Vodood Barva
cevlji A
17
231
da
rjavi
cevlji B
9
119
ne
modri
cevlji C
12
143
ne
črni
cevlji D
8
112
ne
rjavi
cevlji E
11
198
da
modri
cevlji F
15
245
da
črni
S pregledom vrednosti dtypes podatkov lahko ugotovimo kakšnega tipa je posamezen atribut (stolpec).
PRVI KLASIFIKATOR 45
p o d a t k i . d t y p e s
Višina
int64
Teža
int64
Vodood
object
Barva
object
dtype: object
Atributa Vodood in Barva sta tipa object, kar pomeni, da sta obrav-navana kot kategorični spremenljivki. Pred uporabo teh podatkov v procesu strojnega učenja s knjižnico scikit-learn je potrebno spre-meniti vse atribute object v številske. Knjižnica pandas ponuja metodo get_dummies(), ki pregleda podane podatke tipa DataFrame in vse atribute tipa object spremeni v indikacijske atribute. Izvorna spremenljivka se ne spremeni, temveč se podatki z indikacijskimi atributi vrnejo kot rezultat metode.
Pregled tipa atributov pokaže, da so zdaj vsi atributi številskega tipa, s čimer zadostimo uporabi v kombinaciji s scikit-learn knji-
žnico.
# Vse k a t e g o r i č ne ( o b j e c t ) a t r i b u t e s p r e m e n i m o v i n d i k a c i j s k e
p o d a t k i _ z _ i n d i k a c i j s k i m i = pd . g e t _ d u m m i e s ( p o d a t k i ) p o d a t k i _ z _ i n d i k a c i j s k i m i . d t y p e s Višina
int64
Teža
int64
Vodood_da
uint8
Vodood_ne
uint8
Barva_modri
uint8
Barva_rjavi
uint8
Barva_črni
uint8
46
STROJNO UČENJE
Pregled vsebine novih podatkov prikaže novonastale indikacijske atribute.
p r i n t ( p o d a t k i _ z _ i n d i k a c i j s k i m i ) Višina
Teža
Vodood_da
Vodood_ne
Barva_modri
Barva_rjavi
cevlji A
17
231
1
0
0
1
cevlji B
9
119
0
1
1
0
cevlji C
12
143
0
1
0
0
cevlji D
8
112
0
1
0
1
cevlji E
11
198
1
0
1
0
cevlji F
15
245
1
0
0
0
.
Barva_črni
cevlji A
0
cevlji B
0
cevlji C
1
cevlji D
0
cevlji E
0
cevlji F
1
PRVI KLASIFIKATOR 47
4.2
Skupna razdalja
Pri vmesnih izračunih razdalj še vedno ne pridemo do končne skupne razdalje med dvema instancama. Za agregacijo vmesnih razdalj v eno mero razdalje pa lahko izberemo več različnih pristopov. Slika 4.3
prikazuje več vrst razdalj, ki bodo opisane v sledečih sekcijah.
Manhattanska
Evklidska
Kosinusna
Slika 4.3: Različne razdalje med dvema točkama.
4.2.1
Evklidska razdalja
Evklidsko razdaljo med dvema točkama v ravnini je definiral matematik Evklid. Deluje po principu Pitagorovega izreka, kjer se razdalja med dvema točkama oz. instancama (x1 in x2) izračuna kot koren vsote kvadratov vseh dimenzij.
r
(1)
(1)2
(2)
(2)2
(l)
(l)2
dE (x1,x2) =
x
− x
+ x
− x
+ . . . x
− x
1
2
1
2
1
2
r
Xl
(i)
(i)2
=
x
− x
i=1
1
2
kjer je l število atributov posamezne instance.
48
STROJNO UČENJE
4.2.2
Mahattanska razdalja
Zelo pogosto pa nas zanima manhattanska razdalja, ki si zgled za računanje razdalje med dvema točkama vzame po postavitvi cest na otoku Manhattan, kot kaže slika 4.4. V večjem delu otoka so ceste postavljene vzdolž otoka (avenije) in prečno po otoku (ulice). Pri računanju razdalje od ene točke do druge je tako potrebno v obzir vzeti dolžine vseh cest med dvema točkama, pri tem pa ni možno krajšati poti z diagonalami.
Slika 4.4: Razdalje na Manhattnu.
Pri izračunu manhattanske razdalje tako ni najkrajša pot predsta-vljena kot diagonalna in najkrajša daljica med dvema instancama, ampak kot vsota vseh daljic, ki poteka vzdolž vseh osi.
(1)
(1)
(2)
(2)
(l)
(l)
d
M (x1,x2) = x
− x
+ x
− x
+ . . . x
− x
1
2
1
2
1
2
Xl
(i)
(i)
=
x
− x
i=1 1
2
PRVI KLASIFIKATOR 49
4.2.3
Kosinusna razdalja
Z manhattansko in evklidsko razdaljo pa pridemo do težav, ko imamo meritve, ki lahko imajo tako negativne kot pozitivne vrednosti. Primer take meritve bi bil letni zaslužek podjetja, saj je ta lahko tudi nega-tiven (podjetje je na letni ravni imelo izgubo). Za primer vzemimo tri podjetja in njihove letne zaslužke ter spremembe deleža pokritega trga od prejšnjega leta, kot je na sliki 4.5.
Sprememba
Sprememba
pokritosti
pokritosti
trga
trga
30%
B
30%
dE ( A, B)
20%
20%
dM ( A, B)
A
A
d
10%
C ( A, C)
10%
dM ( A, C)
d
d
C ( A, B)
E ( A, C)
100.000 €
200.000 €
-100.000 €
100.000 €
Letni prihodek
Letni prihodek
-10%
C -10%
Slika 4.5: Primerjava evklidske, manhattanske in kosinusne razdalje.
Tako evklidska kakor tudi manhattanska razdalja pravita, da sta podjetji A in C bližje kot pa podjetji A in B.
dE (A,B) > dE (A,C)
dM (A,B) > dM (A,C)
dC (A,B) < dM (A,C)
To je v nasprotju z našo intuicijo: podjetje C je namreč imelo izgubo v letnem prihodku in negativno spremembo pokritosti trga. Podjetji 50
STROJNO UČENJE
A in B pa sta imeli tako dobiček, kakor tudi se je njun delež pokritega trga povečal v primerjavi z lanskim letom.
V takih situacijah sta evklidska in manhattanska razdalja neprimerni ter se uporabi kosinusna razdalja. Pri kosinusni razdalji je pomembna (1) smer vektorja posamezne instance ter (2) njegova dolžina. Razliko med smerjo dveh vektorjev merimo s kotom α med vektorjema (instancama), ta pa je proporcionalna kosinusu kotov. Za instanci x1
in x2 velja sledeč izračun kosinusne razdalje.
x1 · x2
dC (x1,x2) = 1 − ||x1|| · ||x2||
Pl
(i)
(i)
x
∗ x
= 1 −
i=1
1
2
q
q
Pl
xi 2 ∗
Pl
xi 2
i=1
1
i=1
2
Izbira načina izračuna razdalje je odvisna od problema. Najbolj in-tuitivna je vsekakor evklidska razdalja. Večji je nabor atributov l, bolj je primerna manhattanska razdalja v primerjavi z evklidsko [10].
Kosinusna razdalja pa je primerna, ko nas bolj kot razdalje zanimajo podobnosti med instancami.
4.3
Klasifikator k najbližjih sosedov
V sekciji 3.6 je bilo predstavljeno, da pri nekaterih algoritmih klasifikacije ne nastane učni model, ampak se klasifikator odloča vsakokrat ob pogledu v že klasificirane instance. Taka vrsta učenja se imenuje leno učenje in algoritem klasifikacije k najbližjih sosedov (angl. k nearest neighbors) je tipični primer lenega algoritma učenja. Sledi pregled delovanja tega algoritma k najbližjih sosedov.
4.3.1
Delovanje k najbližjih sosedov
Algoritem k najbližjih sosedov steče po sledečem postopku [11], [12].
PRVI KLASIFIKATOR 51
1. Za podano instanco xN, ki jo želimo klasificirati, algoritem iz-računa razdalje do vseh že klasificiranih instanc.
2. Že klasificirane instance razvrsti naraščajoče glede na razdaljo do instance xN.
3. V nadaljnji obravnavi upošteva le k prvih instanc v naraščajo-
čem seznamu – k najbližjih sosedov.
4. Izračuna pogostosti razredov iz nabora k najbližjih instanc kot je na sliki 4.6.
5. Najpogostejši razred (modus) vrne kot rezultat klasifikacije instance xN. Če se več razredov pojavlja z največjo pogostostjo, se izbere naključen razred izmed vseh najpogostejših.
?
k=1
k=3
k=5
Slika 4.6: Klasifikacija instance (moder trikotnik) s pomočjo k najbližjih sosedov ob različnih nastavitvah parametra k. Pri računanju razdalj je uporabljena evklidska razdalja.
52
STROJNO UČENJE
Tabela 4.3: Primer k najbližjih sosedov.
Učne instance
Sist. krvni tlak Tel. temp. Bolan
Evklidska
Manhattanska
(mmHg)
(°C)
d
Rang
d
Rang
82
38,0
Da
28,0
17
28,7
17
85
36,4
Da
25,1
16
27,3
16
89
36,7
Da
21,1
14
23,0
14
94
38,2
Da
16,0
11
16,5
11
95
38,2
Da
15,0
9
15,5
9
95
37,6
Ne
15,0
10
16,1
10
100
36,6
Ne
10,2
7
12,1
7
104
35,5
Ne
6,8
5
9,2
6
108
35,7
Ne
3,6
3
5,0
3
108
38,4
Da
2,0
2
2,3
2
109
39,4
Da
1,2
1
1,7
1
113
36,4
Ne
3,8
4
5,3
4
119
38,7
Da
9,0
6
9,0
5
124
37,5
Ne
14,1
8
15,2
8
128
37,8
Ne
18,0
12
18,9
12
129
38,8
Da
19,0
13
19,1
13
135
39,4
Da
25,0
15
25,7
15
140
36,6
Ne
30,1
18
32,1
18
145
36,0
Da
35,1
19
37,7
19
147
36,5
Da
37,1
20
39,2
20
Nova instanca
Sist. krvni tlak Tel. temp. Bolan
(mmHg)
(°C)
110
38,7
?
PRVI KLASIFIKATOR 53
Primer klasifikacije pacientov
Sledi primer izračunov algoritma k najbližjih sosedov po korakih na primeru diagnoze bolezni pacientov. Imamo učno množico, kjer merimo sistolični krvni tlak pacientov in njihovo telesno temperaturo.
Med kartotekami imamo že zabeležene podatke 20 prejšnjih pacientov in njihove diagnoze, ki so jih postavili zdravniki. Instance in nov pacient so prikazani v tabeli 4.3.
V tabeli je prav tako podan izračun razdalj, evklidske in manhattanske. Izračun obeh razdalj med prvo instanco množice in novo instanco pacienta poteka po sledečem postopku.
q
dE (xN ,x1) =
(110 − 82)2 + (38,7 − 38,0)2
q
=
(28)2 + (0,7)2
p
p
=
784 + 0,49 =
784,49 = 28,0
dM (xN ,x1) = |110 − 82| + |38,7 − 38,0|
= |28| + |0,7|
= 28 + 0,7 = 28,7
Razvidno je, da razlika v krvnem tlaku prevladuje pri izračunu razdalje. Do tega pride zaradi različnih enot, posledica pa je, da razdalje atributov z večjimi številskimi vrednostmi prevladujejo nad atributi manjših številskih vrednosti. Če želimo prispevek atributov pri računanju skupne razdalje poenotiti, se je potrebno lotiti standardizacije podatkov, s čimer postavimo vse meritve na enako zalogo vrednosti.
4.3.2
Standardizacija podatkov
Standardizacija (angl. standardization) je postopek transformacije podatkov na tak način, da bodo ti po transformaciji imeli povprečje 54
STROJNO UČENJE
enako 0 in standardni odklon enak 1. Za standardizacijo podatkov x rabimo njihovo povprečje µ in standardni odklon ρ, ki je definiran sledeče za vseh n instanc.
r (x1 − µ)2 + (x1 − µ)2 + · · · + (xn − µ)2
ρ =
n
Standardizirane vrednosti z izračunamo iz izvornih podatkov x sledeče.
x − µ
z =
ρ
Vsak atribut x1, x2, . . . , xl standardiziramo ločeno – transformirano z njegovim povprečjem in standardnim odklonom. Po standardizaciji vseh atributov (tudi indikacijskih) imajo vsi atributi povprečje v vrednosti 0 in standardni odklon 1. Razdalje posameznih atributov med instancami bodo tako v podobnem intervalu.
Za standardizacijo podatkov pacientov tako potrebujemo podatke povprečja in standardnega odklona instanc, kar prikazuje spodnja enačba.
Tabela 4.4 prikazuje vrednosti atributov po standardizaciji.
µ (Sistolični krvni pritisk) = 112,45
ρ (Sistolični krvni pritisk) = 19,58
µ (Telesna temperatura) = 37,42
ρ (Telesna temperatura) = 1,17
Podatki po standardizaciji kažejo drugačno sliko. Vrstni red najbližjih instanc podani instanci se spremeni.
PRVI KLASIFIKATOR 55
Tabela 4.4: Primer k najbližjih sosedov s standardiziranimi podatki.
Standardizirane učne instance
Sist. krvni tlak Tel. temp. Bolan
Evklidska
Manhattanska
(mmHg)
(°C)
d
Rang
d
Rang
-1,55
0,49
Da
1,55
11
2,03
11
-1,40
-0,87
Da
2,34
15
3,24
17
-1,20
-0,61
Da
2,01
14
2,78
15
-0,94
0,66
Da
0,92
5
1,24
6
-0,89
0,66
Da
0,88
4
1,19
5
-0,89
0,15
Ne
1,21
8
1,70
8
-0,64
-0,70
Ne
1,86
12
2,30
13
-0,43
-1,64
Ne
2,74
19
3,03
16
-0,23
-1,47
Ne
2,56
17
2,66
14
-0,23
0,84
Da
0,28
1
0,36
1
-0,18
1,69
Da
0,60
3
0,65
3
0,03
-0,87
Ne
1,97
13
2,11
12
0,33
1,09
Da
0,46
2
0,46
2
0,59
0,07
Ne
1,25
9
1,74
9
0,79
0,32
Ne
1,20
7
1,69
7
0,85
1,18
Da
0,97
6
1,06
4
1,15
1,69
Da
1,41
10
1,87
10
1,41
-0,70
Ne
2,36
16
3,32
18
1,66
-1,21
Da
2,91
20
4,09
20
1,76
-0,78
Da
2,66
18
3,76
19
Standardizirana nova instanca
Sist. krvni tlak Tel. temp. Bolan
(mmHg)
(°C)
-0,13
1,09
?
56
STROJNO UČENJE
Instanca, ki je v tabeli 4.4 označena s sivo barvo, je pred standardizacijo bila četrta najbližja podani instanci. Pred standardizacijo je namreč bila razlika v temperaturi majhna v primerjavi z razliko v krvnem tlaku. Po standardizaciji pa je razlika v temperaturi mnogo večja, kot razlika pri krvnem tlaku. To je prav, saj sta bili pred standardizacijo zalogi vrednosti obeh meritev drugačni. Realni obseg telesne temperature človeka je približno med 35 in 41 °C, kar predstavlja maksimalno razliko 6 enot. Šest enot razlike pri krvnem tlaku pa ni niti približno realnemu obsegu sistoličnega krvnega tlaka, ki se lahko giblje v intervalu med 80 in 180 mmHg z maksimalno razliko kar 100 enot. Po standardizaciji se krvni tlak giblje med −1,55 ter 1,76 z maksimalno razliko 3,31. To je v skladu z obsegom telesne temperature, ki se po standardizaciji giblje med −1,64 ter 1,69 z maksimalno razliko 3,33.
Standardizacija je le en postopek tehnike, ki jo imenujemo norma-lizacija podatkov. Alternative standardizaciji so min-max skaliranje, centriranje, rangiranje in drugi. Vsak pristop strojnega učenja ni ob-
čutljiv na intervale oz. skalo atributov. Med take štejemo algoritme kreacije odločitvenih dreves in naivnega Bayesa. Dobra praksa je, da pri postopku podatkovnega rudarjenja podatke pred obdelavo vedno normaliziramo, saj se s tem izognemo morebitnemu zavajanju algoritmov.
Negativna plat normalizacije podatkov pa je, da ti niso največkrat enostavno interpretabilni. Kakor kažejo standardizirane vrednosti v tabeli 4.4, so vrednosti telesne temperature nesmiselne. To postane še posebej problematično v primeru, ko gradimo model znanja, ki temelji na pravilih (odločitvena pravila ali odločitvena drevesa), saj bodo vrednosti v pravilih standardizirane.
PRVI KLASIFIKATOR 57
Standardizacija v Pythonu
Sledi primer, kjer za začetek najprej pregledamo povprečne vrednosti in standardne odklone atributov pred standardizacijo.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T r u e ) p r i n t ( ’ P o v p r e č ja pr e d s t a n d a r d i z a c i j o : ’ ) p r i n t ( p o d a t k i . d a t a . me a n ( a x i s = 0 ) ) p r i n t ( ’ S t a n d a r d n i o d k l o n i p r e d s t a n d a r d i z a c i j o : ’ ) p r i n t ( p o d a t k i . d a t a . std ( a x i s = 0 ) ) Povprečja pred standardizacijo:
sepal length (cm) 5.843333
sepal width (cm) 3.057333
petal length (cm) 3.758000
petal width (cm) 1.199333
dtype:
float64
Standardni odkloni pred standardizacijo:
sepal length (cm) 0.828066
sepal width (cm) 0.435866
petal length (cm) 1.765298
petal width (cm) 0.762238
dtype:
float64
Sedaj pa te podatke standardiziramo in izpišemo povprečja ter standardne odklone novih vrednosti. Knjižnica scikit-learn ponuja kar nekaj načinov transformacije podatkov. Za standardizacijo se uporablja razred StandardScaler. S klicem metode fit se izračunata povprečje in standardni odklon iz podanih podatkov. Za transformacijo podatkov, pa se uporabi klic metode transform, kateri podamo podatke, ki jih želimo transformirati.
58
STROJNO UČENJE
f r o m s k l e a r n . p r e p r o c e s s i n g i m p o r t S t a n d a r d S c a l e r
# I n i c i a l i z a c i j a s t a n d a r d i z a t o r j a std = S t a n d a r d S c a l e r ()
# I z r a č u n a m o p o v p r e č ja in s t a n d a r d n e o d k l o n e a t r i b u t o v std . fit ( p o d a t k i . d a t a )
# S t a n d a r d i z a c i j a p o d a t k o v
s t a n d _ p o d a t k i = std . t r a n s f o r m ( p o d a t k i . d a t a ) p r i n t ( ’ P o v p r e č ja po s t a n d a r d i z a c i j i : ’ ) p r i n t ( s t a n d _ p o d a t k i . m ea n ( a x i s = 0 ) ) p r i n t ( ’ S t a n d a r d n i o d k l o n i po s t a n d a r d i z a c i j i : ’ ) p r i n t ( s t a n d _ p o d a t k i . std ( a x i s = 0 ) ) Povprečja po standardizaciji:
-4.73695157e-16 -7.81597009e-16 -4.26325641e-16 -4.73695157e-16
Standardni odkloni po standardizaciji:
1.
1.
1.
1.
Pregled rezultatov povprečij kaže, da so te zelo blizu vrednosti 0
(10−15), standardni odkloni pa so enaki 1. Če želimo proces izračuna povprečij in standardnih odklonov ter proces transformacije podatkov združiti, lahko uporabimo metodo fit_transform, ki na podanih podatkih izračuna vmesne vrednosti in jih vrne transformirane.
s t a n d _ p o d a t k i = std . f i t _ t r a n s f o r m ( p o d a t k i . d a t a ) 4.3.3
Določitev razreda podane instance
Po izračunu razdalj in določitvi rangov glede na bližino do nove instance sledi določitev razreda (klasifikacija) nove instance. Pri tem procesu igra pomembno vlogo določitev vrednosti parametra k, ki nam pove, koliko najbližjih instanc upoštevamo pri klasifikaciji. Vseh k najbližjih instanc bo namreč glasovalo za razred nove instance –
vsaka instanca bo dala glas za razred, kateremu le-ta pripada.
PRVI KLASIFIKATOR 59
Če je parameter k = 1, potem vzamemo le najbližjo instanco in bo novi instanci dodeljen razred te instance. Če se navežemo na primer iz tabele 4.4, je pri izračunu obeh razdalj najbližja ista instanca –
ta je razreda "Da" kar pomeni, da tudi novo instanco klasificiramo v razred "Da". Tabela 4.5 prikazuje rezultate klasifikacije pri različnih nastavitvah – pri standardiziranih in nestandardiziranih podatkih, pri različnih vrednostih k in pri evklidski ter manhattanski razdalji.
Tabela 4.5: Klasifikacija s k najbližjih sosedov pri različnih nastavitvah.
Evklidska
Manhattanska
Podatki
k Da Ne Rezultat Da Ne Rezultat
1
1
0
Da
1
0
Da
2
2
0
Da
2
0
Da
Nestandardizirani 3
2
1
Da
2
1
Da
4
2
2
Da/Ne
2
2
Da/Ne
5
2
3
Ne
3
2
Da
1
1
0
Da
1
0
Da
2
2
0
Da
2
0
Da
Standardizirani
3
3
0
Da
3
0
Da
4
4
0
Da
4
0
Da
5
5
0
Da
5
0
Da
Tabela 4.5 kaže zanimive rezultate. Najprej poglejmo nestandardizi-rane podatke. Tako pri evklidski, kot tudi pri manhattanski razdalji, se z večanjem števila najbližjih instanc, ki se upoštevajo pri klasifikaciji, veča tudi negotovost, saj iz razreda "Da" pri upoštevanju le ene najbližje instance (k = 1) preidemo do negotovosti, ko upoštevamo štiri najbližje instance (k = 4), pa vse do spremembe odločitve v razred "Ne", ko upoštevamo pet najbližjih instanc (k = 5) pri evklidski razdalji. Ti rezultati nam kažejo tudi razliko med evklidsko in manhattansko razdaljo, saj se odločitve končnega razreda instance ne skladajo pri k = 5. Hkrati pa se moramo soočiti še z negotovostjo 60
STROJNO UČENJE
pri k = 4. Ko pridemo do neodločenega izida, se algoritem odloči za en naključen razred v vodstvu (tisti, ki ima manjši indeks), kar pa ni vedno najboljša odločitev. Če bi ročno želeli izničiti možnosti za neodločene izide in naključne odločitve med njimi, bi algoritem preprosto zagnali še na drugih nastavitvah vrednosti k in pogledali, kakšen je končen razred tedaj. Ko imamo opravek z binarno klasifikacijo (delitev instanc v dva razreda), pa se neodločenih izidov lahko znebimo z liho vrednostjo k.
Po drugi strani pa ob pregledu rezultatov po standardizaciji vidimo večjo stabilnost, saj obstaja konsenz pri vseh nastavitvah k in pri obeh tipih razdalje. Ta pristop se tako izkaže kot bolj robusten na manjše spremembe, pa tudi konceptualno je primernejši, saj vsi atributi instanc enakovredno vplivajo na odločitev klasifikacije.
4.4
Uporaba k najbližjih sosedov v Pythonu
Algoritem k najbližjih sosedov je v knjižnici scikit-learn imple-mentiran z razredom KNeighborsClassifier. Že pri inicializaciji pri-merka tega razreda določimo k število najbližjih sosedov s parametrom n_neighbors in način računanja razdalje s parametrom metric.
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r k l a s i f = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 3 , m e t r i c = ’ m a n h a t t a n ’ )
Pri računanju razdalje lahko uporabimo evklidsko razdaljo z euclidean, mahattansko z manhattan in kosinusno razdaljo s cosine.
S klicem metode fit in podajo podatkov instanc X_u in njihovih razredov y_u te shranimo in bodo služili za izračun najbližjih sosedov.
Metodo predict pa kličemo s podajo množice instanc X_t, ki jih želimo klasificirati.
PRVI KLASIFIKATOR 61
k l a s i f . fit ( X_u , y_u )
n a p o v e d i = k l a s i f . p r e d i c t ( X_t ) To je tudi standardni postopek uporabe drugih algoritmov klasifikacije, regresije in gručenja v knjižnici scikit-learn: 1. Nastavitve definiramo v konstruktorju.
2. Model znanja zgradimo s fit(podatki_instanc, resitve_instanc).
3. Model znanja uporabimo s predict(podatki_novih_instanc).
Algoritmi pa lahko imajo tudi sebi specifične metode. V primeru k najbližjih sosedov je njemu posebna metoda kneighbors, kateri podamo instance, za katere iščemo najbližje sosede, ter parameter n_neighbors, s katerim povemo, koliko najbližjih sosedov iščemo iz nabora vseh instanc podanih že prej v metodi fit. Rezultat sta dva seznama: (1) seznam razdalj od izbranih instanc do najbližjih sosedov v naraščajočem vrstnem redu glede na razdaljo, ter (2) seznam indeksov najbližjih instanc, ponovno od najbližjega naprej.
k l a s i f . fit ( X_u , y_u )
r a z d a l j e , s o s e d i = k l a s i f . k n e i g h b o r s ( n o v e _ i n s t a n c e , n _ n e i g h b o r s = 3 )
Sledi pregled uporabe klasifikacijskega algoritma k najbližjih sosedov za namen iskanja petih najbližjih sosedov eni instanci. Najprej s sledečo kodo naložimo instance podatkovne množice Iris, iz nje izberemo instanco v vrstici z indeksom 133 ter jo odstranimo iz podatkovne množice.
62
STROJNO UČENJE
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T ru e )
# I z b e r e m o eno i n s t a n c o
i z b r a n a = 133
X _ i z b r a n a = p o d a t k i . d a t a . i l o c [ izbrana , : ]
y _ i z b r a n a = p o d a t k i . t a r g e t . i l o c [ i z b r a n a ]
# I z b r a n o i n s t a n c o i z l o č imo iz o s t a l i h p o d a t k o v X _ o s t a l i = p o d a t k i . da t a . d r o p ( izbrana , a x i s = 0 ) y _ o s t a l i = p o d a t k i . t a r g e t . d r o p ( i z b r a n a ) Izbira vrednosti iz polja poteka s pomočjo klica iloc[vrstica, stolpec], kamor podamo indeks vrstice in indeks stolpca. Če želimo izbrati celotno vrsto, podamo namesto indeksa kar dvopičje :. Tako s podatki.data.iloc[:, 12] izberemo stolpec z indeksom 12, s klicem podatki.data.iloc[8, :] pa izberemo vrstico z indeksom 8.
Če želimo izbrati več vrednosti, pa namesto števila na mestu vrstice in stolpca podamo polje indeksov. S klicem podatki.data.iloc[[2, 5, 8], :] izberemo vrstice s temi indeksi. In obratno, s klicem podatki.data.iloc[:, [3, 6, 9]] se vrnejo stolpci z indeksi 3, 6
in 9.
Pri izbiri vrednosti iz vektorja podamo le eno vrednost, saj ima ta le eno dimenzijo. Tako nam klic podatki.target.iloc[[2, 5, 8]]
vrne podatke z indeksi 2, 5 in 8.
Z metodo podatki.data.drop(izbrana, axis=0) odstranimo instanco z indeksom izbrana iz podatkov podatki.data. Parameter axis do-loča, po kateri osi izbrišemo podatke – če je podana 0, izbrišemo vrstico, če pa 1, pa izbrišemo stolpec. Pri izbrisu iz podatki.target parametra axis ni potrebno podati, saj so podatki v obliki vektorja, ki ima le eno dimenzijo.
PRVI KLASIFIKATOR 63
4.4.1
Vizualizacija podatkov
S pomočjo knjižnice seaborn lahko enostavno vizualiziramo instance.
Z dvema klicema metode scatterplot se en na drugega izrišeta dva grafa raztrosa. S parametroma x in y podamo podatke, ki naj so izrisani na teh oseh.
i m p o r t s e a b o r n as sns
x_os , y _o s = 0 , 1
# I z r i š emo o s t a l e i n s t a n c e
sns . s c a t t e r p l o t ( x = X _ o s t a l i . i l o c [ : , x _ os ] , y = X _ o s t a l i . i l o c [ : , y _ os ] ,
hue = p o d a t k i . t a r g e t _ n a m e s [ y _ o s t a l i ] , p a l e t t e = ’ c o l o r b l i n d ’ )
# I z r i š emo eno i z b r a n o i n s t a n c o
sns . s c a t t e r p l o t ( x = [ X _ i z b r a n a . i l o c [ x _ os ] ] , y = [ X _ i z b r a n a . i l o c [ y _o s ] ] ,
hue = [ ’ N e z n a n ’ ] , s t y l e = [ ’ N e z n a n ’ ] , m a r k e r s = { ’ N e z n a n ’ : ’ ^ ’ } )
Pomanjkljivost grafične predstavitve podatkov je, da lahko izrišemo instance glede na omejeno število njihovih atributov. V našem primeru imamo dvodimenzionalen graf, kjer smo posamezne osi določili s spremenljivkama x_os in y_os. Parameter hue prejme podatke, ki bodo narisane označbe delili glede na barvo – v našem primeru so to podatki o razredu. Parameter style pa prejme podatke, ki določajo stil označbe, ki jih definiramo s parametrom markers. Barve označb določamo s podajanjem teme v parameter palette. Slika, ki nastane ob tem klicu, je sledeča.
64
STROJNO UČENJE
4.5
4.0
3.5
3.0
2.5
setosa
versicolor
virginica
2.0
Neznan
4.5
5.0
5.5
6.0
6.5
7.0
7.5
8.0
Slika 4.7: Instance podatkovne zbirke Iris. Horizontalna x os predstavlja prvi atribut, vertikalna y os pa drugi atribut podatkovne množice.
Barve ločijo razrede instanc, s trikotnikom pa je označena instanca, ki jo želimo klasificirati.
4.4.2
Učenje in uporaba modela znanja
Učenje modela in napoved razreda instance na indeksu 133 poteka na sledeč način. Najprej s konstruktorjem določimo vrednost k na pet najbližjih sosedov po izračunu manhattanske razdalje. Temu sledi klic metode fit, kateri podamo podatke instanc X_ostali in njihove razrede y_ostali. Ker metoda predict pričakuje več instanc, dodamo instanco X_izbrana najprej v seznam in ta seznam podamo v klic metode predict([X_izbrana]). Če X_izbrana ne bi bil vektor, ampak polje, bi klic metode potekal brez ovijanja v seznam predict(X_izbrana).
PRVI KLASIFIKATOR 65
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r
# I n i c i a l i z i r a m o k l a s i f i k a t o r knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 5 , m e t r i c = ’ m a n h a t t a n ’ )
# S h r a n i m o i n s t a n c e za p r i m e r j a v o knn . fit ( X _ o s t a l i , y _ o s t a l i )
# N a p o v e m o r a z r e d i z b r a n e i n s t a n c e n a p o v e d = knn . p r e d i c t ( [ X _ i z b r a n a ] ) p r i n t ( f ’ KNN je n a p o v e d a l , da je i n s t a n c a r a z r e d a
{ p o d a t k i . t a r g e t _ n a m e s [ n a p o v e d ] } . ’ ) p r i n t ( f ’ Ta i n s t a n c a je d e j a n s k o r a z r e d a
{ p o d a t k i . t a r g e t _ n a m e s [ y _ i z b r a n a ] } . ’ ) KNN je napovedal, da je instanca razreda [’versicolor’].
Ta instanca je dejansko razreda virginica.
Klasifikator je napovedal napačen razred za to instanco. Preglejmo katerih pet instanc je po izračunu manhattanske razdalje najbližje naši izbrani instanci iz vrstice z indeksom 133.
# I z b r a n i i n s t a n c i n a j d e m o pet n a j b l i ž jih s o s e d o v r a z d a l j e , s o s e d i = knn . k n e i g h b o r s ( [ X _ i z b r a n a ] , n _ n e i g h b o r s = 5 )
p r i n t ( f ’ Pet n a j b l i ž jih : { s o s e d i } ’ ) p r i n t ( f ’ R a z d a l j e od n a j b l i ž jih do i z b r a n e : { r a z d a l j e } ’ ) Pet najbližjih:
[[ 72 83 123 126 54]]
Razdalje od najbližjih do izbrane:
[[0.5 0.5 0.6 0.7 0.7]]
Pet najbližjih instanc po manhattanski razdalji so instance z indeksi 72, 83, 123, 126 in 54. Rezultati razdalj pa so kar manhattanske razdalje teh sosedov do podane instance.
66
STROJNO UČENJE
4.4.3
Vpliv nastavitev na rezultate
Poglejmo, kako se spremeni seznam petih najbližjih instanc, ko spre-minjamo način izračuna razdalje med instancami.
for r a z d a l j a in [ ’ e u c l i d e a n ’ , ’ m a n h a t t a n ’ , ’ c o s i n e ’ ] : knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 5 , m e t r i c = r a z d a l j a )
knn . fit ( X _ o s t a l i , y _ o s t a l i )
r a z d a l j e , n a j b l i z j e = knn . k n e i g h b o r s ( [ X _ i z b r a n a ] , n _ n e i g h b o r s = 5 )
p r i n t ( f ’ N a j b l i ž je i n s t a n c e po { r a z d a l j a } so {
n a j b l i z j e } ’ )
p r i n t ( f ’ R a z d a l j e so { r a z d a l j e } ’ ) Najbližje instance po euclidean so [[ 83 72 123 126 127]]
Razdalje so [[0.33166248 0.36055513 0.37416574 0.43588989
0.45825757]]
Najbližje instance po manhattan so [[ 72 83 123 126 54]]
Razdalje so [[0.5 0.5 0.6 0.7 0.7]]
Najbližje instance po cosine so [[125 129 90 131 83]]
Razdalje so [[0.0001158 0.00022532 0.00033682 0.00034546
0.00039085]]
Izračun petih najbližjih sosedov po evklidski in manhattanski razdalji vrne podobne rezultate. Instanca z indeksom 83 je najbližja izbrani po izračunu evklidske razdalje in je druga najbližja po manhattanski razdalji – mesto si izmenja z instanco 72. Tretje in četrto mesto sta v obeh razdaljah zasedli instanci 123 in 125. Peto mesto ima v primeru evklidske razdalje instanca 127, v primeru manhattanske pa instanca 54. Če sta instanci 127 in 54 drugačnega razreda, lahko ta razlika vpliva na razred izbrane instance.
Seznam najbližjih instanc po izračunu kosinusne razdalje pa je sko-rajda popolnoma drugačen od ostalih dveh – le instanca 83 je v vseh treh seznamih. Vse ostale štiri instance so v seznamu kosinusne razdalje druge v primerjavi s seznamoma evklidske in manhattanske razda-PRVI KLASIFIKATOR 67
lje. Ti rezultati nam kažejo, kako pomembna je odločitev glede načina izračuna razdalje.
Slika 4.8 kaže delitev območja razredov glede na način računanja razdalje. Pri kreaciji slike sta bila upoštevana prva dva atributa in vrednost števila sosedov k je bila nastavljena na 5. Slika kaže, da večjih razlik med evklidsko in manhattansko razdaljo pri tej podatkovni množici in nastavitvi k ni. Delitev območij je relativno jasna, z nekoliko večjim prekrivanjem v sredini, kjer so si instance razredov versicolor in virginica zelo podobne. Po drugi strani je razvidno, da delitev po izračunu glede na kosinusno razdaljo ni primerna za podano podatkovno množico, saj sta območji versicolor in virginica preveč prepleteni in je klasifikacija instanc v tem območju nestabilna.
Poglejmo si še, kako vrednost k vpliva na končno klasifikacijo izbrane instance.
for k in [ 1 , 3 , 5 , 8 , 10 ] :
knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = k , m e t r i c = ’ e u c l i d e a n ’ )
knn . fit ( X _ o s t a l i , y _ o s t a l i )
n a p o v e d = knn . p r e d i c t ( [ X _ i z b r a n a ] ) p r i n t ( f ’ KNN z k = { k } je n a p o v e d a l , da je i z b r a n a i n s t a n c a r a z r e d a { p o d a t k i . t a r g e t _ n a m e s [ n a p o v e d ] } ’ ) KNN z k=1 je napovedal, da je izbrana instanca razreda
[’versicolor’]
KNN z k=3 je napovedal, da je izbrana instanca razreda
[’versicolor’]
KNN z k=5 je napovedal, da je izbrana instanca razreda [’virginica’]
KNN z k=8 je napovedal, da je izbrana instanca razreda
[’versicolor’]
KNN z k=10 je napovedal, da je izbrana instanca razreda
[’virginica’]
68
STROJNO UČENJE
Evklidska razdalja
Manhattanska razdalja
5.0
4.5
4.0
3.5
3.0
2.5
2.0
1.5
1.0
4
5
6
7
8
Kosinusna razdalja
5.0
setosa
4.5
versicolor
4.0
virginica
3.5
3.0
2.5
2.0
1.5
1.0
4
5
6
7
8
Slika 4.8: Delitev na območja razredov glede na način računanja razdalj med instancami.
Pri spreminjanju števila najbližjih sosedov ne vidimo konsenza. Razred izbrane instance z indeksom 133 se namreč spreminja iz (napač-
nega) razreda versicolor ob glasovanju enega, treh in osmih najbližjih sosedov, v (pravilen) razred virginica ob glasovanju petih ali desetih najbližjih sosedov.
Ponovno je razvidno, da nastavitev igra vlogo pri napovedih algoritma. Vrednost k se največkrat določi po preizkušanju, vsekakor pa mora biti vrednost smiselna (če je k prevelik, bo v resnici algoritem vrnil najpogostejši razred).
PRVI KLASIFIKATOR 69
Preveč optimiziranja nastavitev za namen boljše klasifikacije ene instance je nesmiselno. Instanca indeksa 133 je bila izbrana namenoma, saj se napovedi njenega razreda zelo spreminjajo ob drugačnih nastavitvah. Večji del instanc dobi enako napoved razreda, ne glede na tip razdalje in k.
To nam pove več o tej instanci kot pa o samem algoritmu. Mogoče je ta nekoliko nenavadna, ali pa je bila že v osnovi (s strani ekspertov) klasificirana napačno. Iz tega sledi, da je smiselno gledati rezultate in kakovost klasifikacije na več instancah, ne le na eni – kaj pa če je ta izbrana nenavadno. V naslednjem poglavju bomo spoznali načine ovrednotenja kakovosti klasifikacije in proces pravilne izbire instanc, s katerimi testiramo izbrani algoritem klasifikacije in njegovih nastavitev.
Slika 4.9 prikazuje različna območja razredov glede na različne vrednosti števila sosedov k. Pri kreaciji slike sta bila ponovno upoštevana le prva dva atributa podatkov in računanje evklidskih razdalj. Iz slike je razvidno, da majhne vrednosti k prinesejo kar nekaj majhnih podro-
čij klasifikacije. Po drugi strani pa je razvidno, da nastavitev števila sosedov na 10 nekoliko pokvari delitev območja.
70
STROJNO UČENJE
k=1
k=3
5.0
4.5
4.0
3.5
3.0
2.5
2.0
1.5
1.0
k=5
k=8
5.0
4.5
4.0
3.5
3.0
2.5
2.0
1.5
1.0
4
5
6
7
8
k=10
5.0
setosa
4.5
versicolor
4.0
virginica
3.5
3.0
2.5
2.0
1.5
1.0
4
5
6
7
8
Slika 4.9: Delitev na območja razredov glede na število najbližjih sosedov k: 1, 3, 5, 8 in 10.
PRVI KLASIFIKATOR 71
4.4.4
Vpliv standardizacije podatkov na rezultate
Poglejmo si, če se klasifikacija kaj spremeni, če uporabimo standardizirane podatke.
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r f r o m s k l e a r n . p r e p r o c e s s i n g i m p o r t S t a n d a r d S c a l e r
# S t a n d a r d i z i r a m o p o d a t k e
s t a n d a r d i z a t o r = S t a n d a r d S c a l e r () s t a n d a r d i z a t o r . fit ( X _ o s t a l i ) X _ o s t a l i _ s = s t a n d a r d i z a t o r . t r a n s f o r m ( X _ o s t a l i ) X _ i z b r a n a _ s = s t a n d a r d i z a t o r . t r a n s f o r m ( [ X _ i z b r a n a ] ) for r a z d a l j a in [ ’ e u c l i d e a n ’ , ’ m a n h a t t a n ’ , ’ c o s i n e ’ ] : for k in [ 1 , 3 , 5 ] :
knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = k , m e t r i c = r a z d a l j a )
knn . fit ( X _ o s t a l i _ s , y _ o s t a l i ) nap = knn . p r e d i c t ( X _ i z b r a n a _ s ) p r i n t ( f ’ KNN m e t r i c = { r a z d a l j a } , k = { k } je n a p o v e d a l r a z r e d { p o d a t k i . t a r g e t _ n a m e s [ nap ] } ’ ) KNN metric=euclidean, k=1 je napovedal razred [’versicolor’]
KNN metric=euclidean, k=3 je napovedal razred [’versicolor’]
KNN metric=euclidean, k=5 je napovedal razred [’versicolor’]
KNN metric=manhattan, k=1 je napovedal razred [’versicolor’]
KNN metric=manhattan, k=3 je napovedal razred [’versicolor’]
KNN metric=manhattan, k=5 je napovedal razred [’versicolor’]
KNN metric=cosine, k=1 je napovedal razred [’versicolor’]
KNN metric=cosine, k=3 je napovedal razred [’virginica’]
KNN metric=cosine, k=5 je napovedal razred [’versicolor’]
Napovedi so mnogo bolj robustne na spreminjanje nastavitev klasifikacijskega algoritma, ko imamo opravek s standardiziranimi podatki.
Namreč, najpogosteje napovedan razred je bil versicolor. Čeprav je napoved razreda napačna, imamo raje robustne napovedi, kot pa take, ki so preveč odvisne od nastavitev algoritma.
72
STROJNO UČENJE
4.4.5
Enovit primer klasifikacije več instanc
Sledi enovit primer klasifikacije več instanc iz Iris podatkovne zbirke, kjer so podatki tudi standardizirani.
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s i m p o r t n u m p y as np
f r o m s k l e a r n . p r e p r o c e s s i n g i m p o r t S t a n d a r d S c a l e r
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T ru e )
# I z b e r e m o ve č i n s t a n c
i z b r a n e = [ 1 , 31 , 61 , 91 , 121 ]
X _ i z b r a n e = p o d a t k i . d a t a . i l o c [ izbrane , : ]
y _ i z b r a n e = p o d a t k i . t a r g e t . i l o c [ i z b r a n e ]
# I z b r a n o i n s t a n c o i z l o č imo iz o s t a l i h p o d a t k o v X _ o s t a l i = p o d a t k i . da t a . d r o p ( izbrane , a x i s = 0 ) y _ o s t a l i = p o d a t k i . t a r g e t . d r o p ( i z b r a n e )
# S t a n d a r d i z i r a m o p o d a t k e
s t a n d a r d i z a t o r = S t a n d a r d S c a l e r () s t a n d a r d i z a t o r . fit ( X _ o s t a l i ) X _ o s t a l i _ s = s t a n d a r d i z a t o r . t r a n s f o r m ( X _ o s t a l i ) X _ i z b r a n e _ s = s t a n d a r d i z a t o r . t r a n s f o r m ( X _ i z b r a n e )
# Z g r a d i m o k l a s i f i k a t o r in n a p o v e d m o r a z r e d e knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 3 , m e t r i c = ’
e u c l i d e a n ’ )
knn . fit ( X _ o s t a l i _ s , y _ o s t a l i ) n a p o v e d i = knn . p r e d i c t ( X _ i z b r a n e _ s ) for i , napoved , d e j a n s k o in zip ( izbrane , n a p ov e d i , y _ i z b r a n e ) :
p r i n t ( f ’ I n s t a n c a { i } je k l a s i f i c i r a n a kot
{ p o d a t k i . t a r g e t _ n a m e s [ n a p o v e d ] } d e j a n s k o pa je { p o d a t k i . t a r g e t _ n a m e s [ d e j a n s k o ] } . ’ ) Izpis zgornje kode je sledeč.
PRVI KLASIFIKATOR 73
I n s t a n c a 1 je k l a s i f i c i r a n a kot s e t o s a d e j a n s k o pa je s e t o s a .
I n s t a n c a 31 je k l a s i f i c i r a n a kot s e t o s a d e j a n s k o pa je s e t o s a .
I n s t a n c a 61 je k l a s i f i c i r a n a kot v e r s i c o l o r d e j a n s k o pa je v e r s i c o l o r .
I n s t a n c a 91 je k l a s i f i c i r a n a kot v e r s i c o l o r d e j a n s k o pa je v e r s i c o l o r .
I n s t a n c a 121 je k l a s i f i c i r a n a kot v i r g i n i c a d e j a n s k o pa je v i r g i n i c a .
74
STROJNO UČENJE
4.5
Utrjevanje znanja
V tej sekciji sledijo naloge uporabe k najbližjih sosedov z ročnim iz-računom in s programiranjem.
Naloga 4-1
Za lokalnega preprodajalca avtomobilov ustvarjamo model znanja, ki mu bo poenostavil ugotoviti, kateri rabljeni avtomobili so primerni za nakup in kateri niso. Podana je tabela preteklih nakupov tega preprodajalca avtomobilov.
a) Tabelo dopolni z izračuni evklidskih in manhattanskih razdalj iz-branega avtomobila do preteklih nakupov. Zapiši range razdalj – od najbližje instance (rang 1) do najbolj oddaljene instance.
PRVI KLASIFIKATOR 75
Pretekli nakupi rabljenih avtomobilov Indeks Prevoženi
Starost Nakup Evklidska Manhattanksa
(1000 km)
(leta)
d Rang d
Rang
0
14
2
Da
1
29
1
Ne
2
38
4
Da
3
54
5
Da
4
71
4
Ne
5
80
6
Da
6
88
7
Da
7
103
7
Da
8
122
8
Ne
9
127
9
Da
10
143
9
Ne
11
148
9
Ne
12
153
9
Ne
13
170
11
Ne
14
183
11
Ne
15
193
12
Ne
16
194
14
Da
17
200
14
Da
18
214
14
Ne
29
226
15
Ne
Izbran avtomobil
Prevoženi
Starost
(1000 km)
(leta)
100
5
b) Na roko izriši graf raztrosa za celotno množico. Označbe instanc prilagodi razredu posamezne instance.
76
STROJNO UČENJE
Nakup
14
Da
Ne
12
10
tihlev 8st rotaS6
4
2
50
100
150
200
Prevo eni 1000 km
c) V spodnjo tabelo dopiši indekse najbližjih petih instanc za posamezno mero razdalje.
Rangi
1
2
3
4
5
Evklidska
Manhattanska
PRVI KLASIFIKATOR 77
d) V tabelo dopiši rezultate klasifikacije za posamezno nastavitev k in posamezno mero razdalje.
Evklidska
Manhattanska
k
Da
Ne
Rezultat
Da
Ne
Rezultat
78
STROJNO UČENJE
Naloga 4-2
Uporabi podatke prejšnje naloge o nakupih rabljenih avtomobilov.
a) Izračunaj povprečje in standardni odklon za vsak atribut podatkov.
µ (Prevoženi km) =
ρ (Prevoženi km) =
µ (Starost) =
ρ (Starost) =
b) V sledečo tabelo vnesi standardizirane podatke.
PRVI KLASIFIKATOR 79
Standardizirani podatki rabljenih avtomobilov Indeks Prevoženi
Starost Nakup Evklidska Manhattanska
(1000 km)
(leta)
d Rang d
Rang
0
Da
1
Ne
2
Da
3
Da
4
Ne
5
Da
6
Da
7
Da
8
Ne
9
Da
10
Ne
11
Ne
12
Ne
13
Ne
14
Ne
15
Ne
16
Da
17
Da
18
Ne
29
Ne
Izbran avtomobil
Prevoženi
Starost
(1000 km)
(leta)
c) Tabelo dopolni z evklidskimi in manhattanskimi razdaljami na standardiziranih podatkih.
80
STROJNO UČENJE
d) V spodnjo tabelo dopiši rezultate klasifikacije za posamezno nastavitev k in posamezno mero razdalje.
Evklidska
Manhattanska
k
Da
Ne
Rezultat
Da
Ne
Rezultat
PRVI KLASIFIKATOR 81
Naloga 4-3
V Pythonu napiši sledečo kodo.
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Wine. Za namene te naloge uporabiš le dva atributa množice:
’magnesium’ in ’flavanoids’. Obdrži le ta dva atributa, ostale zavrzi.
Pazi, da ne izgubiš podatka o razredu.
b) Zadnjo instanco te množice shrani kot testno instanco, ves ostali del množice pa shrani kot učne podatke. Izpiši prvih pet vrstic učnih podatkov in testno instanco.
c) Izriši graf raztrosa učnih podatkov, kjer je ’magnesium’ na x osi ter ’flavanoids’ na y osi. Označbe instanc naj so obarvane glede na razred posamezne instance. Pri tem uporabi bodisi knjižnico seaborn ali Matplotlib.
d) Učne podatke uporabi za učenje sledečih klasifikatorjev k najbližjih sosedov:
• k = 1 in evklidska razdalja,
• k = 1 in manhattanska razdalja,
• k = 3 in evklidska razdalja,
• k = 3 in manhattanska razdalja,
• k = 5 in evklidska razdalja in
• k = 5 in manhattanska razdalja.
Napovedi za testno instanco vsakega klasifikatorja izpiši.
82
STROJNO UČENJE
Naloga 4-4
V Pythonu napiši sledečo kodo.
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Breast cancer. Zadnjih deset instanc te množice shrani ločeno kot testno množico, ves ostali del množice pa shrani kot učne podatke. Izpiši prvih pet vrstic učnih podatkov in prvih pet instanc testne množice.
b) Standardiziraj podatke na podlagi učne množice. Standardiziraj tako učne kot testne podatke. Pri tem pazi, da ne izgubiš nestandardiziranih učnih in testnih podatkov. Izpiši prvih pet vrstic standardiziranih učnih podatkov in prvih pet instanc standardizirane testne množice.
c) Nauči dva k najbližjih sosedov klasifikatorja (k = 3, evklidska razdalja), enega na nestandardiziranih podatkih, drugega na standardiziranih podatkih. Za vsako instanco v testni množici izpiši v eni vrstici tri vrednosti:
1. dejanski razred iz množice,
2. napoved klasifikatorja naučenega na nestandardiziranih podatkih in
3. napoved klasifikatorja naučenega na nestandardiziranih podatkih.
PRVI KLASIFIKATOR 83
84
STROJNO UČENJE
5 | Kakovost
klasifikacije
Pri iskanju najprimernejšega klasifikatorja je potrebno evalvirati vsako izmed metod. Množica podatkov, na podlagi katere smo model znanja zgradili, mora vsebovati tudi rešitve (dejanske razrede) instanc, zato lahko pravilnost klasifikacije modela znanja preverimo kar s primerjavo napovedi in dejanskih razredov. Tak pristop ni optimalen, saj lahko vodi v prenasičenje (angl. overfitting). Pri prenasičenju algoritem vrne model, ki uspešno klasificira podane podatke, vendar je kakovost klasificiranja na novih podatkih tipično zelo slaba. Pravimo, da se je model preveč prilegel učnim podatkom in ni dovolj splošen za dano problematiko. Prenasičeni modeli imajo visoko stopnjo variance (angl. variance), kar pomeni, da se preveč prilagajajo majhnemu nihanju in naključnemu šumu v podatkih.
Če primerjamo prenasičene modele z učenjem ljudi, bi lahko rekli, da pride do prenasičenja, če se ljudje naučimo snov dobesedno, ampak brez pravega razumevanja konceptov. Če bi se učili množenja števil, bi se s prenasičenjem naučili na pamet le rezultate množenja števil do 10 (ker so le ti v učbeniku). Ker pa nismo dojeli koncepta množenja, 85
ne bi poznali rezultata množenja dveh še prej nevidenih števil (primer: 12 ∗ 27).
Nasprotje prenasičenju pa je nenasičenost (angl. underfitting). Nenasičeni modeli imajo visoko pristranskost (angl. bias). To pomeni, da je model preveč splošen, saj ne zazna pomembnih relacij ali zakonitosti (glej sliko 5.1).
Če se ponovno vrnemo na analogijo učenja množenja dveh števil, bi prišli do nenasičenosti, ko ne bi v celoti dojeli koncepta množenja dveh števil – znali bi množiti dve celoštevilski pozitivni števili, ne pa realnih števil (primer: 6,4 ∗ 1,34) ali celo negativnih celih števil (primer: −7 ∗ 21).
Praviloma imajo klasifikatorji z visoko pristranskostjo nizko stopnjo variance in obratno. Vedno želimo najti klasifikator s pravim ravno-vesjem med pristranskostjo in varianco, a ta meja je arbitrarna in jo določimo sami.
Nizka varianca
Visoka varianca
ost
ansk
Nizka
istrpr
ost
ansk
Visoka
istrpr
Slika 5.1: Prikaz variance in pristranskosti.
86
STROJNO UČENJE
5.1
Delitev podatkov
Da se izognemo prekomernemu prileganju podatkom, je potrebno podatke razdeliti na več delov. Na enem izmed delov se klasifikator uči (klasifikacijski algoritem zgradi klasifikacijski model), na drugih podatkih (na takih, ki niso sodelovali pri procesu učenja) pa se preveri kakovost dobljenega modela.
Nadaljujmo z analogijo učenja množenja dveh števil. Učno množico dojemimo kot učno gradivo, ki ga uporabljamo za učenje na izpit. Če bi na izpitu dobili enake primere množenja dveh števil, kot smo jih že videli v učnem gradivu, bi preverjali le, če imamo dober spomin, ne pa tudi, če smo dejansko dojeli postopek množenja dveh števil. Tako naj bo izpit sestavljen iz popolnoma novih primerov množenja dveh števil, kar pa v našem postopku ponazorimo z ločeno testno množico.
Če je klasifikator dejansko izluščil vzorce iz podatkov, ne bi smel imeti težav pri klasifikaciji novih podatkov. Če se je učne podatke naučil le na pamet, potem pa ne bo dobro klasificiral testnih podatkov (bo padel na izpitu).
5.1.1
Učna in testna množica
Osnovna razdelitev izvorne množice je z delitvijo na dve podmno-
žici: učno množico (angl. learning dataset ali train dataset) in testno množico (angl. test dataset) [13]. Na učni množici le učimo klasifikatorje, ki pa jih nato testiramo in evalviramo le na testni množici
– podatki iz testne množice ne smejo sodelovati pri gradnji klasifikacijskih modelov. Kljub deljenju na učno in testno množico lahko dobimo prenasičen model, a je možnost za to mnogo manjša. Učno množico X smo definirali že prej, testna množica X′ pa je definirana spodaj.
KAKOVOST KLASIFIKACIJE 87
X′ = x′
1,y′1
, x′2,y′2 , . . . , x′m,y′m
y′ ∈ {
i
razred1, razred2, . . . , razredk}
m = število instanc v testni množici
Klasifikacijski model vsaki testni instanci določi razred ˆy, ki pa ni nujno enak dejanskemu razredu testne instance y′ – v tem primeru naredi napako pri klasifikaciji instance. Cilj je najti tak klasifikacijski model, ki pravilno klasificira čim več testnih instanc (idealno vse).
Delitev na učno in testno množico v Pythonu
V kodi pa razdelimo podatke na učno in testno množico na sledeč način.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s f r o m s k l e a r n . m o d e l _ s e l e c t i o n i m p o r t t r a i n _ t e s t _ s p l i t
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T r u e )
# R a z d e l i m o p o d a t k e na u č ne in t e s t n e X_u , X_t , y_u , y_t = t r a i n _ t e s t _ s p l i t ( p o d a t k i . data , p o d a t k i . target ,
t r a i n _ s i z e = 0 . 7 ,
r a n d o m _ s t a t e = 42 )
p r i n t ( f ’ V e l i k o s t u č ne mno ž ice : { X_u . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t u č nih r a z r e d o v : { y_u . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t t e s t n e mno ž ice : { X_t . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t t e s t n i h r a z r e d o v : { y_t . s h a p e } ’ ) Velikost učne množice:
(105, 4)
Velikost učnih razredov:
(105,)
Velikost testne množice:
(45, 4)
Velikost testnih razredov:
(45,)
88
STROJNO UČENJE
S klicem train_test_split podane podatke razdelimo na učno in testno množico na tak način, da zadostimo sledečim kriterijem.
• Če podamo parameter train_size in je vrednost tega celo število, bo učna množica štela prav toliko instanc. Primer: train_size=10 pove, da bo učna množica štela točno 10 instanc.
• Če podamo parameter train_size in je vrednost tega realno število med 0 in 1, bo učna množica v velikosti deleža izvorne podane množice. Primer: train_size=0.8 pove, da bo učna množica 80 % velikosti izvorne množice.
• Če podamo parameter test_size in je vrednost tega celo število, bo testna množica štela prav toliko instanc. Primer: test_size=10 pove, da bo testna množica štela 10 instanc.
• Če podamo parameter test_size in je vrednost tega realno število med 0 in 1, bo testna množica v velikosti deleža izvorne podane množice. Primer: test_size=0.2 pove, da bo testna množica 20 % velikosti izvorne množice.
Klicu train_test_split smo podali tako izvorno množico atributov podatki.data, kakor tudi izvorne razrede podatki.target. S tem zagotovimo, da dobimo vrnjene razdeljene tako atribute instanc (učne X_u in testne X_t), kakor tudi rešitve (učne y_u in testne y_t).
5.1.2
Validacijska množica
Če se ukvarjamo s specifičnim problemom podatkovnega rudarjenja, se pri gradnji klasifikacijskih modelov srečamo z optimizacijo parame-trov klasifikatorja (na primer definiranja števila sosedov k pri klasi-fikatorju k najbližjih sosedov). Če parametre prilagajamo glede na rezultate klasifikatorjev na testni množici, delamo napako, saj tako testni podatki sodelujejo pri gradnji optimalnega modela. V tem primeru potrebujemo še validacijsko množico (angl. validation dataset), na podlagi katere preizkušamo in optimiziramo parametre, šele na koncu pa zgrajen model testiramo na testni množici [14].
KAKOVOST KLASIFIKACIJE 89
Učenje modelov
Učna množica
Algoritem strojnega učenja
Različne nastavitve algoritma
Model znanja 1
Model znanja 2
Model znanja 3
alidacija modelovV
Validacijka
Validacijska kakovost
množica
Najboljši model uporabimo
Končna
Testiranje modela
Testna
Model znanja 3
kakovost
množica
Slika 5.2: Delitev množice na učno, validacijsko in testno ter njihova uporaba.
90
STROJNO UČENJE
Slika 5.2 prikazuje razdelitev izvorne podatkovne množice na te tri dele: učno množico, validacijsko množico in testno množico. Iz procesa je razvidno, da se nastali modeli znanja najprej preizkusijo na validacijski množici ter se njihova kakovost ovrednoti na tej množici.
Šele izbrani (po navadi najboljši) model se uporabi za končno ovrednotenje na testni množici.
Delitev na učno, validacijsko in testno množico v Pythonu V paketu scikit-learn ne obstaja klic, s katerim bi dosegli enostavno delitev na tri dele, zato je potrebno, da smo nekoliko zviti.
V prvem klicu train_test_split smo pridobili testno množico X_t, y_t ter začasno učno množico X_u1, y_u1. Razmerje med njima je 4:1 v prid začasne učne množice. V drugem klicu train_test_split pa začasno učno množico razdelimo na dejansko učno X_u, y_u ter validacijsko množico X_v, y_v v razmerju 3:1. Končno razmerje med učno množico, validacijsko množico in testno množico je tako 3:1:1.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s f r o m s k l e a r n . m o d e l _ s e l e c t i o n i m p o r t t r a i n _ t e s t _ s p l i t
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T ru e )
# R a z d e l i m o p o d a t k e na ’ za č a s n o u č ne ’ in t e s t n e X_u1 , X_t , y_u1 , y_t = t r a i n _ t e s t _ s p l i t ( p o d a t k i . data , p o d a t k i . target ,
t r a i n _ s i z e = 0 . 8 ,
r a n d o m _ s t a t e = 42 )
# ’ Za č a s n o u č ne ’ p o d a t k e r a z d e l i m o na ’ d e j a n s k e u č ne ’ in v a l i d a c i j s k e
X_u , X_v , y_u , y_v = t r a i n _ t e s t _ s p l i t ( X_u1 , y_u1 ,
t r a i n _ s i z e = 0 . 75 ,
r a n d o m _ s t a t e = 42 )
KAKOVOST KLASIFIKACIJE 91
Poglejmo kakšne so množice po razdelitvi.
p r i n t ( f ’ V e l i k o s t u č ne mno ž ice : { X_u . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t u č nih r a z r e d o v : { y_u . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t v a l i d a c i j s k e mno ž ice : { X_v . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t v a l i d a c i j s k i h r a z r e d o v : { y_v . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t t e s t n e mno ž ice : { X_t . s h a p e } ’ ) p r i n t ( f ’ V e l i k o s t t e s t n i h r a z r e d o v : { y_t . s h a p e } ’ ) Velikost učne množice:
(90, 4)
Velikost učnih razredov:
(90,)
Velikost validacijske množice:
(30, 4)
Velikost validacijskih razredov:
(30,)
Velikost testne množice:
(30, 4)
Velikost testnih razredov:
(30,)
5.1.3
Navzkrižna validacija
Pri deljenju podatkov na učno, testno in validacijsko množico pa lahko zgolj po naključju razdelimo podatke v učno, validacijsko in testno množico, tako da se zgodi ena izmed sledečih stvari:
• kakšen vzorec ni prisoten (v celoti ali v dovolj veliki meri) v učni množici in pri učenju klasifikatorja ta ni zajet v modelu;
• se kakšen, v realnosti neprisoten, vzorec pokaže v učni množici in se ta zapiše v model klasifikacije, v realnosti pa ni uporaben.
Nadaljujemo z analogijo učenja množenja števil. Pri učenju matematične naloge (z rešitvami) razdelimo na dva dela: tiste primere, na katerih se učimo (učno množico) in tiste, na katerih se pred izpitom preverimo, če vemo dovolj (validacijska množica; izpit bo pa testna množica). Če smo po naključju razdelili naloge množenja tako, da se učimo le iz najlažjih (recimo le množenje celih pozitivnih števil), določenega naprednega znanja ne bomo osvojili (množenja negativnih ali realnih števil).
92
STROJNO UČENJE
Da zmanjšamo možnost za ponesrečeno razdelitev množice, to razdelimo na več načinov – na n načinov. Tako iz ene množice dobimo n učnih množic in n testnih množic. Ta proces imenujemo navzkrižna validacija (angl. cross-validation) in steče tako, da celotno množico razdelimo na n delov – na n rezov (angl. folds) [15]. Vsak rez je enkrat v vlogi testne množice, v vseh ostalih primerih pa je v kombinaciji z ostalimi rezi del učne množice. Posledično je tudi vsaka instanca enkrat v testni množici, v ostalih primerih pa je vedno v učni množici.
Slika 5.3 prikazuje razdelitev celotne množice na štiri reze za namen navzkrižne validacije.
U na mno ica
Testna mno ica
1
cijealid
2
va
neri
3
vzk
naz
Re
4
Razred
0
20
40
60
80
100
120
140
Instance mno ice
Slika 5.3: Stratificirana navzkrižna validacija. Vertikalna Y os prikazuje pripadnost instanc bodisi v učno (modra) ali testno (rdeča) množico pri posameznem rezu.
Pri naključni delitvi na reze se zna zgoditi, da bodo razmerja med razredi različna med rezi. Tega se želimo izogniti, saj lahko nastane situacija, ko so vse instance enega razreda le v enem rezu. Ko bo ta rez v vlogi testnih instanc, klasifikacijski algoritem nima možnosti, da KAKOVOST KLASIFIKACIJE 93
pravilno klasificira instance tega manjšinskega razreda – saj jih nikoli ne vidi v času učenja. S postopkom stratifikacije (angl. stratifica-tion) poskrbimo, da se množica premeša na tak način, da so razmerja razredov v vseh rezih kar se da enaka.
V Pythonu razdelimo množico s stratificirano navzkrižno validacijo sledeče.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s f r o m s k l e a r n . m o d e l _ s e l e c t i o n i m p o r t S t r a t i f i e d K F o l d
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T r u e )
# S t r a t i f i c i r a n a n a v z k r i ž na v a l i d a c i j a s š t i r i m i re z i skf = S t r a t i f i e d K F o l d ( n _ s p l i t s = 4 ) rez = 1 # S tem b o m o š t e l i r e z e
i n s t a n c a = 13 # P r e g l e d o v a l i bo m o i n s t a n c o na m e s t u 13
p r i n t ( f ’ Z a n i m a nas i n s t a n c a { i n s t a n c a } s p o d a t k i : ’ ) p r i n t ( p o d a t k i . d a t a . il o c [ i n s t a n c a , : ] ) for ucne , t e s t n e in skf . s p l i t ( p o d a t k i . data , p o d a t k i . t a r g e t ) :
if i n s t a n c a in u c n e :
p r i n t ( f ’ I n s t a n c a { i n s t a n c a } je v { rez } . d e l i t v i v u č ni mno ž ici . ’ )
e l i f i n s t a n c a in t e s t n e :
p r i n t ( f ’ I n s t a n c a { i n s t a n c a } je v { rez } . d e l i t v i v t e s t n i mno ž ici . ’ )
rez = rez + 1
Izpis zgornje kode je sledeč.
94
STROJNO UČENJE
Z a n i m a nas i n s t a n c a 13 s p o d a t k i : s e p a l l e n g t h ( cm )
4 . 3
s e p a l w i d t h ( cm )
3 . 0
p e t a l l e n g t h ( cm )
1 . 1
p e t a l w i d t h ( cm )
0 . 1
N a m e : 13 , d t y p e : f l o a t 6 4
I n s t a n c a 13 je v 1 . d e l i t v i v u č ni mno ž ici .
I n s t a n c a 13 je v 2 . d e l i t v i v t e s t n i mno ž ici .
I n s t a n c a 13 je v 3 . d e l i t v i v u č ni mno ž ici .
I n s t a n c a 13 je v 4 . d e l i t v i v u č ni mno ž ici .
Z uporabo razreda StratifiedKFold in njegove metode split razdelimo podane podatke na reze. Z vrednostjo n_splits ob inicializaciji podamo, na koliko rezov delimo množico. V for zanki tako na vsaki učni množici naučimo svoj model klasifikacije, ki ga evalviramo na testni množici tistega reza. Tako dobimo n klasifikacijskih modelov, vsak se je naučil na nekoliko drugačni učni množici in vsak se je evalviral na popolnoma drugačni testni množici. Iz tega sledi, da dobimo tudi n rezultatov klasifikacije na testnih množicah. Da pa ocenimo celokupno kakovost podanega klasifikacijskega algoritma, pa vse rezultate preprosto povprečimo. Sledi poglavje, ki pregleda, kako sploh merimo kakovost klasifikacije, razdeljeno glede na število razredov, v katere model klasifikacije razvršča instance.
5.2
Metrike klasifikacije
Ko imamo napovedi modela, lahko ovrednotimo oz. evalviramo kakovost te napovedi. To naredimo s pomočjo klasifikacijskih metrik (angl.
classification metrics) [16]–[19]. Sledi pregled različnih klasifikacijskih metrik, najprej, ko imamo opravka s klasifikacijo v dva razreda (dvo-razredna ali binarna klasifikacija) in nato, ko imamo opravka z več kot dvema razredoma (večrazredna klasifikacija).
KAKOVOST KLASIFIKACIJE 95
5.2.1
Binarna klasifikacija
Pri binarnih klasifikatorjih gradimo model za klasifikacijo instanc v dva razreda. Ko imamo model zgrajen, ga ocenimo s pomočjo testnih podatkov in iz rezultatov zgradimo matriko zmede ali kontingenčno tabelo (angl. confusion matrix ali contingency table), ki je prikazana v tabeli 5.1.
Tabela 5.1: Matrika zmede za dva razreda: A in B.
Napovedano
A
B
o
A
TP
FN
B
FP
TN
Dejansk
V danem primeru iz tabele 5.1 klasificiramo podatke v dva razreda: A in B. Vsaka celica v tabeli prikazuje število instanc. Vrstice matrike kažejo dejansko pripadnost instanc v razrede, stolpci pa povedo raz-poreditev instanc v razrede s pomočjo klasifikatorja. Enemu razredu pripišemo lastnost pozitivnega razreda, drugemu pa lastnost negativ-nega razreda. Ta določitev je arbitrarna in je odvisna od problematike reševanja – pravilne določitve ni in bi tudi druga delitev v pozitivne in negativne vrnila prave rezultate.
96
STROJNO UČENJE
f r o m s k l e a r n . m e t r i c s i m p o r t c o n f u s i o n _ m a t r i x
# P o d a m o d e j a n s k e r a z r e d e in n a p o v e d i k l a s i f i k a t o r j a y _ d e j a n s k i = [ ’ A ’ , ’ A ’ , ’ B ’ , ’ B ’ , ’ A ’ , ’ B ’ ]
y _ n a p o v e d a n = [ ’ A ’ , ’ A ’ , ’ B ’ , ’ A ’ , ’ A ’ , ’ B ’ ]
# I z r a č u n a m o m a t r i k o z m e d e
m a t _ z m e d e = c o n f u s i o n _ m a t r i x ( y _ d e j a n s k i , y _ n a p o v e d a n , l a b e l s = [ ’ A ’ , ’ B ’ ] )
p r i n t ( m a t _ z m e d e )
[[3 0]
[1 2]]
Klicu confusion_matrix podamo vsaj dve vrednosti: polje dejanskih razredov in polje napovedi. Pomembno je, da so elementi v obeh poljih v enakem vrstnem redu (prvi element v obeh poljih kaže tako dejanski razred kot napoved prvega elementa). S parametrom labels pa podamo vrstni red razredov pri kreaciji matrike zmede – če tega ne podamo, bo vrstni red razredov po abecednem vrstnem redu.
V primeru iz kode vidimo, da je klasifikacijski model za tri instance razreda A povedal, da so res razreda A; za dve instanci razreda B je povedal, da sta res razreda B; ter za eno instanco razreda B je napačno povedal, da je ta razreda A. Če privzamemo, da je razred A pozitiven, matrika zmede binarne klasifikacije vsebuje štiri vrednosti, ki kažejo količino instanc glede na rezultate klasifikacije:
• TP – pravilno klasificirane kot pozitivne (angl. true positives),
• FP – napačno klasificirane kot pozitivne (angl. false positives),
• TN – pravilno klasificirane kot negativne (angl. true negatives),
• FN – napačno klasificirane kot negativne (angl. false negatives).
Razširimo prejšnji primer z naslednjo kodo, ki nam vrne te štiri vrednosti (deluje le pri binarni klasifikaciji). Klicu metode confusion_matrix dodamo še klic metode ravel, ki dobljeno metriko KAKOVOST KLASIFIKACIJE 97
zloži v enodimenzionalno polje (najprej vse iz prve vrstice, nato vse iz druge vrstice ...).
# I z r a č u n a m o v r e d n o s t i n a p o v e d i tp , fn , fp , tn = c o n f u s i o n _ m a t r i x ( y _ d e j a n s k i , y _ n a p o v e d a n ,
l a b e l s = [ ’ A ’ , ’ B ’ ] ) . r a v e l ()
p r i n t ( f ’ TP : { tp } ’ )
p r i n t ( f ’ TN : { tn } ’ )
p r i n t ( f ’ FP : { fp } ’ )
p r i n t ( f ’ FN : { fn } ’ )
TP: 3
TN: 2
FP: 1
FN: 0
S pomočjo teh štirih vrednosti lahko izračunamo različne metrike klasifikacije (angl. classification metrics) oziroma vrednosti, ki nam povedo, kako kakovosten je klasifikacijski model. Teh metrik je več in vsaka služi svojemu namenu – obstajajo tudi različni pogledi, kaj sploh pomeni kakovosten model znanja.
Točnost klasifikacije in delež napake
Prva taka metrika je točnost klasifikacije (angl. accuracy), ki prikazuje, kolikšen deležen instanc je klasificiran v dejanski razred – de-lež pravilno klasificiranih instanc. Formula točnosti je prikazana v sledeči enačbi in se izračuna kot ulomek števila pravilno klasificiranih instanc (T P + T N) deljeno s številom vseh klasificiranih instanc (T P +F P +T N +F N). Metriko točnost želimo maksimirati in težimo k temu, da je čim bližje vrednosti 1 [20].
T P + T N
točnost = TP + FP + TN + FN
98
STROJNO UČENJE
Metrika, ki kaže nasprotno vrednost točnosti, je delež napake (angl.
error rate); pravimo tudi, da je obratno sorazmerna kot točnost. Predstavlja delež nepravilno klasificiranih instanc, kar je prikazano v spodnji enačbi. Lahko pa delež napake izračunamo tudi preprosto kot 1 − točnost. Delež napake je metrika, ki jo minimiziramo in katere idealna vrednost je 0.
F P + F N
delež napake = TP + FP + TN + FN
Prikažimo še izračun točnosti, deleža napake in števila pravilno klasificiranih instanc v Pythonu s klicem accuracy_score.
f r o m s k l e a r n . m e t r i c s i m p o r t a c c u r a c y _ s c o r e
# P o d a m o d e j a n s k e r a z r e d e in n a p o v e d i k l a s i f i k a t o r j a y _ d e j a n s k i = [ ’ A ’ , ’ A ’ , ’ B ’ , ’ B ’ , ’ A ’ , ’ B ’ ]
y _ n a p o v e d a n = [ ’ A ’ , ’ A ’ , ’ B ’ , ’ A ’ , ’ A ’ , ’ B ’ ]
# I z r a č u n a m o to č n os t
t o c n o s t = a c c u r a c y _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n ) d e l e z _ n a p a k e = 1 - t o c n o s t
# I z r a č u n a m o š t e v i l o p r a v i l n o k l a s i f i c i r a n i h ( TP + TN ) s t _ p r a v i l n i h = a c c u r a c y _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , n o r m a l i z e = F a l s e )
p r i n t ( f ’ To č n o s t : { t o c n o s t } ’ ) p r i n t ( f ’ D e l e ž n a p a k e : { d e l e z _ n a p a k e } ’ ) p r i n t ( f ’ Š t e v i l o p r a v i l n i h : { s t _ p r a v i l n i h } ’ ) Točnost:
0.8333333333333334
Delež napake:
0.16666666666666663
Število pravilnih:
5
KAKOVOST KLASIFIKACIJE 99
Priklic in preciznost
Naslednji dve metriki, ki ju bomo obravnavali skupaj, sta priklic in preciznost. Obe metriki imata vrednost v intervalu [0,1], kjer je 0
najslabša vrednost, 1 pa najboljša.
Metrika priklic (angl. recall) nam pove delež pozitivnih instanc, ki so pravilno klasificirane v pozitivni razred. Včasih priklic imenujemo tudi senzitivnost (angl. sensitivity) ali delež pravilno klasificiranih pozitivnih instanc (angl. true positive rate). Izračun priklica je prikazan v sledeči enačbi.
T P
priklic = TP + FN
Poglejmo si uporabo priklica v Pythonu.
f r o m s k l e a r n . m e t r i c s i m p o r t r e c a l l _ s c o r e
# P o d a m o d e j a n s k e r a z r e d e in n a p o v e d i k l a s i f i k a t o r j a y _ d e j a n s k i = [ ’ A ’ , ’ A ’ , ’ B ’ , ’ B ’ , ’ A ’ , ’ B ’ ]
y _ n a p o v e d a n = [ ’ A ’ , ’ A ’ , ’ B ’ , ’ A ’ , ’ A ’ , ’ B ’ ]
# I z r a č u n a m o p r i k l i c o b e h r a z r e d o v p r i k l i c _ A = r e c a l l _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , p o s _ l a b e l = ’ A ’ )
p r i k l i c _ B = r e c a l l _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , p o s _ l a b e l = ’ B ’ )
p r i n t ( f ’ P r i k l i c A : { p r i k l i c _ A } ’ ) p r i n t ( f ’ P r i k l i c B : { p r i k l i c _ B } ’ ) Priklic A: 1.0
Priklic B: 0.6666666666666666
Podobno kot pri izračunu točnosti, tudi pri klicu metode recall_score podamo najprej polje z dejanskimi razredi, čemur pa sledi polje z na-povedanimi razredi. Pri binarni klasifikaciji moramo podati tudi pa-100
STROJNO UČENJE
rameter pos_label, s katerim določimo razred, za katerega računamo priklic.
O senzitivnosti (ali občutljivosti) testa v praksi zelo pogosto govorimo, ko imamo opravka s testom, ki ugotavlja prisotnost ali odsotnost do-ločenega obolenja (npr. bolezni, ki jo povzroča virus). Senzitivnost takega testa nam pove kakšen je delež bolnih, ki jih je test našel. Pred-stavljajmo si primer, ko imamo 100 pacientov, ki so dejansko bolni.
Test je za dejansko bolne pokazal, da jih je 80 bolnih, za ostalih 20 pa je test (napačno) trdil, da niso bolni. Tak test ima 80% senzitivnost oz. priklic.
Druga metrika je preciznost (angl. precision) in nam pove, kolikšen delež instanc, klasificiranih v pozitivni razred, je dejansko pripadni-kov pozitivnega razreda. Včasih metriko priklic imenujemo zaupanje (angl. confidence) ali točnost pozitivno klasificiranih pozitivnih instanc (angl. true positive accuracy).
T P
preciznost = TP + FP
Sledeča koda prikazuje uporabo klica precision_score.
f r o m s k l e a r n . m e t r i c s i m p o r t p r e c i s i o n _ s c o r e
# I z r a č u n a m o p r e c i z n o s t o b e h r a z r e d o v p r e c i z n o s t _ A = p r e c i s i o n _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , p o s _ l a b e l = ’ A ’ )
p r e c i z n o s t _ B = p r e c i s i o n _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , p o s _ l a b e l = ’ B ’ )
p r i n t ( f ’ P r e c i z n o s t A : { p r e c i z n o s t _ A } ’ ) p r i n t ( f ’ P r e c i z n o s t B : { p r e c i z n o s t _ B } ’ ) Preciznost A: 0.75
Preciznost B: 1.0
KAKOVOST KLASIFIKACIJE 101
Ponovno se vrnimo na primer testa za ugotavljanje določenega obolenja. Imamo 100 pacientov, ki so dejansko bolni. Test je za 80 izmed teh pokazal, da so bolni, za še 10 dodatnih (dejansko zdravih) pacientov pa je prav tako (napačno) pokazal, da so bolni. Tak test ima 88,89% preciznosti oz. zaupanja.
F-mera
Iz prejšnjih sekcij je razvidno, da obstaja nabor metrik za merjenje kakovosti binarne klasifikacije, od katerih ima vsaka svoj namen. Ko želimo meriti kakovost klasifikacijskega modela v splošnem, pa uporaba večjega števila metrik ni praktična. V ta namen uporabljamo metriko, imenovano F-mera (angl. F-measure ali F-score), ki združi metriki priklic in preciznost v harmonični sredini, kot je prikazano v enačbi spodaj. Metriki preciznost in priklic nista neposredno po-vezani in prikazujeta različne informacije. Visoka vrednost ene ne pomeni nujno nizke vrednosti druge, zato stremimo k temu, da bi obe metriki bili dovolj visoki. Prednost F-mere je, da združi obe ome-njeni metriki skupaj v eno število, kjer se takoj opazi nizka vrednost katerekoli izmed njiju.
preciznost · priklic
F -meraβ = (1 + β2) · (β2 · preciznost) + priklic
(1 + β2) · T P
= (1 + β2) · TP + β2 · FN + FP
Ta enačba prikazuje splošno obliko F-mere, kjer lahko posamezno metriko (preciznost ali priklic) utežimo pri končnem izračunu. Vlogo uteži igra vrednost β, ki je višja pri večji pomembnosti metrike preciznost in nižja, ko damo večji poudarek metriki priklica. Tradicionalna oblika metrike F-mera je, ko sta obe vrednosti enako uteženi in imata uravnoteženo vlogo pri izračunu (ko je β = 1). Največkrat se upo-102
STROJNO UČENJE
rablja prav ta, ki se včasih imenuje tudi F1-mera in je prikazana s sledečo enačbo.
preciznost · priklic
F1-mera = 2 · preciznost + priklic
Če uporabljamo pri izračunu F-mere vrednost β, ki ni enaka 1, se to zapiše kot podpisana vrednost (F2-mera ali F0,5-mera). Če pa je β
enak vrednosti 1, lahko podpisano vrednost izpustimo in zapišemo le F-mera.
Sledeča Python koda prikazuje izračun F-mere z in brez podane β vrednosti. Koda razširja prejšnje primere, kjer so dejanski in napovedani razredi že definirani.
f r o m s k l e a r n . m e t r i c s i m p o r t f 1 _ s c o r e , f b e t a _ s c o r e
# I z r a č u n a m o F - m e ro in F - m e t a ( s p o d a n o b e t o ) r a z r e d a A f 1 _ s c o r e _ A = f 1 _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , p o s _ l a b e l = ’ A ’ )
f _ b e t a _ s c o r e _ A = f b e t a _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , p o s _ l a b e l = ’ A ’ , b e t a = 2 )
p r i n t ( f ’ F1 - m e r a A : { f 1 _ s c o r e _ A } ’ ) p r i n t ( f ’ F - m e r a ( b e t a = 2 ) A : { f _ b e t a _ s c o r e _ A } ’ ) F1-mera A: 0.8571428571428571
F-mera (beta=2) B: 0.9375
KAKOVOST KLASIFIKACIJE 103
5.2.2
Klasifikacija v več razredov
V prejšnji sekciji smo naredili pregled metrik za ocenjevanje kakovosti modelov klasifikacije v dva razreda. Mnogokrat pa imajo podatki več možnih razredov, zato evalvacija teh modelov z metrikami, neprila-gojenimi za več razredov, postane težavna. Kreacija matrike zmede poteka po enakem postopku kot pri binarni klasifikaciji, kjer v vrstice beležimo dejanske, v stolpce pa napovedane razrede instanc, kot kaže tabela 5.2.
Tabela 5.2: Matrika zmede za več razredov: A, B in C.
Napovedano
A
B
C
A
50
1
2
o
B
4
20
0
Dejansk
C
5
1
10
Najpreprostejša metrika za izračun ne glede na število razredov je točnost, saj še vedno velja, da število pravilno klasificiranih instanc delimo s številom vseh instanc. Podobno velja tudi za delež napake, le da število pravilno klasificiranih zamenjamo s številom nepravilno klasificiranih primerkov.
Težava nastopi pri poimenovanju pozitivnih in negativnih razredov, saj smo prisiljeni oznako pozitivni ali negativni dodeliti več razredom.
Vse metrike, ki vsebujejo število pozitivnih ali negativnih instanc, se morajo prilagoditi uporabi klasifikacije v več razredov na sledeč na-
čin. Te metrike računamo v več korakih, kjer v vsakem koraku dobi naziv pozitivnega razreda drug razred, ostali pa predstavljajo negativni razred. Končno vrednost metrik dobimo na več načinov: z makro agregacijo, z uteženim povprečenjem, ali z mikro agregacijo [21].
104
STROJNO UČENJE
Makro agregacija metrik
Pri makro agregaciji metrik klasifikacije izdelamo več matrik zmede (m matrik zmede, če imamo m razredov), in sicer tako, da je v vsaki metriki zmede drug razred označen kot pozitivni razred. Za vsako matriko zmede izračunamo izbrano metriko (dobimo m metrik klasifikacije). Končno vrednost metrike klasifikacije pa na koncu izračunamo tako, da povprečimo vseh m metrik. Sledeče enačbe prikazujejo makro (Ma) izračun nekaterih metrik klasifikacije.
Pm
T Pi
Pm
i=1
priklici
priklic
T Pi+F Ni
i=1
M a =
=
m
m
Pm
T Pi
Pm
i=1
preciznosti
preciznost
T Pi+F Pi
i=1
M a =
=
m
m
Pm
F1-merai
F
i=1
1-meraM a =
m
Čeprav se metrika točnost izračuna za m razredov enako kot za binarni problem klasifikacije, pa lahko izračunamo metriko povprečna točnost (angl. average class accuracy). Ta metrika izračuna najprej točnost za vsak posamezni razred, nato pa povpreči izračunane vrednosti. Po enakem postopku izračunamo tudi povprečno stopnjo napake (angl. average class error rate), le da povprečimo deleže napak razredov.
Pm
T Pi+T Ni
i=1
povprečna točnost =
T Pi+F Pi+T Ni+F Ni
m
Pm
F Pi+F Ni
i=1
povprečen delež napake =
T Pi+F Pi+T Ni+F Ni
m
KAKOVOST KLASIFIKACIJE 105
Utežena agregacija metrik
Preprosto povprečenje metrik vsakega razreda največkrat ni smiselno.
Ko imamo neuravnoteženo množico (tj. množico, ko je razmerje med razredi zelo neenakomerno – čez 8:1), povprečenje kakovosti klasifikacije instanc pogostega razreda in kakovosti instanc redkih razredov ni smiselno. Namreč, več instanc imamo, več možnosti ima klasifikacijski algoritem, da izlušči vzorce, ki so značilni za instance tega razreda. To privede do klasifikacijskih modelov, ki delujejo mnogo boljše pri klasifikaciji instanc bolj pogostega razreda v primerjavi s klasifikacijo instanc redkih razredov. Če kakovost klasifikacije povprečimo (kot je to pri makro agregaciji), kakovost klasifikacije vseh razredov enakomerno prispeva h končni metriki. To je odlično, če želimo večji poudarek na kakovosti manjšinskih instanc. Če pa ne želimo, da instance v manj-
šini prevzamejo neenakomerno večjo vlogo pri ocenjevanju kakovosti, pa lahko posamezne metrike pred povprečenjem utežimo.
Pri uteževanju metriko posameznega razreda i zmnožimo z deležem instanc ui razreda i, zmnožene metrike pa nato seštejemo v skupno mero. Delež razreda ui je preprost odstotek instanc tega razreda i v testni množici.
m
m
X
T Pi
X
priklicUa =
ui ·
=
ui · priklici
T Pi + F Ni
i=1
i=1
m
m
X
T Pi
X
preciznostUa =
ui ·
=
ui · preciznosti
T Pi + F Pi
i=1
i=1
m
X
F1-meraUa =
ui · F1-merai
i=1
106
STROJNO UČENJE
Mikro agregacija metrik
Pri mikro agregaciji metrik začnemo podobno kot pri makro agregaciji; zgradimo m matrik zmede, nadaljnji postopek pa je drugačen.
Namesto povprečenja različnih metrik seštejemo posamezne vrednosti iz matrik zmede. Primer: vse T Pi seštejemo skupaj, da dobimo T PMi, in tega vstavimo v enačbo za izračun mikro agregiranih metrik. Enačbe spodaj prikazujejo način izračuna posameznih metrik na mikro (Mi) način.
Pm
T Pi
priklic
i=1
M i = Pm (T P
i=1
i + F Ni)
Pm
T Pi
preciznost
i=1
M i = Pm (T P
i=1
i + F Pi)
preciznostMi · priklicMi
F1-meraMi = 2 · preciznostMi + priklicMi
Posebnih mikro agregacij točnosti in deleža napake ni, saj v tem primeru dobimo že prej definirano točnost in delež napake.
Agregacija metrik v Pythonu
Z uporabo knjižnice scikit-learn in že do sedaj predstavljenih metod accuracy_score, precision_score, recall_score in f1_score enostavno agregiramo metrike vseh razredov v eno vrednost. Pri agregaciji nam služi parameter teh metod average, s katerim podamo način agregacije.
KAKOVOST KLASIFIKACIJE 107
f r o m s k l e a r n . m e t r i c s i m p o r t p r e c i s i o n _ s c o r e , r e c a l l _ s c o r e , f 1 _ s c o r e
# I z r a č u n a m o p r e c i z n o s t z m a k r o a g r e g a c i j o p r e c i z n o s t _ m a k r o = p r e c i s i o n _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n ,
a v e r a g e = ’ m a c r o ’ )
# I z r a č u n a m o ute ž en p r i k l i c
p r i k l i c _ u t e z e n = r e c a l l _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , a v e r a g e = ’ w e i g h t e d ’ )
# I z r a č u n a m o m i k r o F - m e r o
f _ m e r a _ m i k r o = f 1 _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , a v e r a g e = ’ m i c r o ’ )
# I z r a č u n a m o lo č eno p r e c i z n o s t za v s a k r a z r e d p r e c i z n o s t _ v s e h = p r e c i s i o n _ s c o r e ( y _ d e j a n s k i , y _ n a p o v e d a n , a v e r a g e = N o n e )
p r i n t ( f ’ M a k r o p r e c i z n o s t : { p r e c i z n o s t _ m a k r o } ’ ) p r i n t ( f ’ Ute ž en p r i k l i c : { p r i k l i c _ u t e z e n } ’ ) p r i n t ( f ’ M i k r o F - m er a : { f _ m e r a _ m i k r o } ’ ) p r i n t ( f ’ P r e c i z n o s t v s e h r a z r e d o v : { p r e c i z n o s t _ v s e h } ’ ) Makro preciznost:
0.875
Utežen priklic:
0.8333333333333334
Mikro F-mera:
0.8333333333333334
Preciznost vseh razredov:
[0.75 1.
]
Vrednost parametra average določa način agregacije:
• ’macro’ se uporabi za makro agregacijo.
• ’weighted’ se uporabi za uteženo agregacijo, kjer so uteži se-stavljene iz razmerja razredov v podani testni množici.
• ’micro’ se uporabi za mikro agregacijo.
• None se uporabi, ko želimo ločen izpis metrike za vsak razred posebej, brez agregacije.
108
STROJNO UČENJE
5.3
Utrjevanje znanja
Preizkusi se na nekaj nalogah izračuna kakovosti klasifikatorjev, ki jih rešiš tako na roko kakor s programiranjem v Pythonu.
Naloga 5-1
Podani sta matriki zmede dveh različnih klasifikatorjev za klasifikacijo v dva razreda.
Klasifikator 1
Klasifikator 2
Napovedano
Napovedano
A
B
A
B
o
o
A
62
8
A
50
20
B
11
59
B
30
40
Dejansk
Dejansk
a) Za vsak klasifikator izračunaj točnost klasifikacije in delež napake.
b) Obravnavaj razred A kot pozitivni razred. Za vsak klasifikator izračunaj priklic, preciznost in F-mero.
KAKOVOST KLASIFIKACIJE 109
Naloga 5-2
Podani sta matriki zmede dveh različnih klasifikatorjev za klasifikacijo v več razredov.
Klasifikator 1
Klasifikator 2
Napovedano
Napovedano
A
B
C
A
B
C
o
A
500
10
20 o
A
430
60
40
B
40
20
0
B
10
50
0
C
50
10
10
C
0
10
60
Dejansk
Dejansk
a) Za vsak klasifikator izračunaj točnost klasifikacije in delež napake.
b) Za vsak klasifikator in za vsak razred posebej izračunaj priklic, preciznost in F-mero.
c) Izračunaj skupen priklic, preciznost in F-mero po načinu makro agregacije metrik.
d) Izračunaj skupen priklic, preciznost in F-mero po načinu mikro agregacije metrik.
e) Izračunaj skupen priklic, preciznost in F-mero po načinu uteženega povprečenja metrik.
110
STROJNO UČENJE
Naloga 5-3
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Iris. Množico razdeli na učno, validacijsko in testno množico v razmerju 60:20:20.
b) Na učni množici nauči tri klasifikatorje k najbližjih sosedov z Evklidsko razdaljo. Prvi naj ima k = 1, drugi k = 5 in tretji k =
10.
c) Vsak klasifikator uporabi za klasifikacijo validacijske množice. Za dobljene rezultate na validacijski množici za vsak klasifikator izračunaj točnost. Tistega z najboljšo točnostjo obravnavaj kot najboljšega in z njim nadaljuj.
d) Za najboljši klasifikator na testni množici izračunaj sledeče: 1. preciznost, priklic in F-mero za vsak razred,
2. makro agregirane preciznost, priklic in F-mero, 3. mikro agregirane preciznost, priklic in F-mero ter 4. uteženo agregirane preciznost, priklic in F-mero.
KAKOVOST KLASIFIKACIJE 111
Naloga 5-4
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Iris. Množico s stratificirano navzkrižno validacijo razdeli na pet rezov.
b) Za vsako delitev na reze naredi sledeče:
1. nauči k najbližjih sosedov (k = 3, Evklidska razdalja) na učnih podatkih;
2. izpiši točnost klasifikacije na testnih podatkih in 3. izpiši uteženo agregirano F-mero na testnih podatkih.
c) Povpreči metriki točnosti in F-mere na vseh rezih. Izpiši dobljeno povprečno točnost in povprečno F-mero vseh rezov.
112
STROJNO UČENJE
6 | Rešitve nalog
6.1
Poglavje Prvi klasifikator
Naloga 4-1
Za lokalnega preprodajalca avtomobilov ustvarjamo model znanja, ki mu bo poenostavil ugotoviti, kateri rabljeni avtomobili so primerni za nakup in kateri niso. Podana je tabela preteklih nakupov tega preprodajalca avtomobilov.
a) Tabelo dopolni z izračuni evklidskih in manhattanskih razdalj iz-branega avtomobila do preteklih nakupov. Zapiši range razdalj – od najbližje instance (rang 1) do najbolj oddaljene instance.
113
Pretekli nakupi rabljenih avtomobilov Indeks Prevoženi
Starost Nakup
Evklidska
Manhattanska
(1000 km)
(leta)
d
Rang
d
Rang
0
14
2
Da
86,1
15
89,0
14
1
29
1
Ne
71,1
13
75,0
12
2
38
4
Da
62,0
11
63,0
11
3
54
5
Da
46,0
8
46,0
7
4
71
4
Ne
29,0
6
30,0
5
5
80
6
Da
20,0
3
21,0
3
6
88
7
Da
12,2
2
14,0
2
7
103
7
Da
3,6
1
5,0
1
8
122
8
Ne
22,2
4
25,0
4
9
127
9
Da
27,3
5
31,0
6
10
143
9
Ne
43,2
7
47,0
8
11
148
9
Ne
48,2
9
52,0
9
12
153
9
Ne
53,2
10
57,0
10
13
170
11
Ne
70,3
12
76,0
13
14
183
11
Ne
83,2
14
89,0
14
15
193
12
Ne
93,3
16
100,0
16
16
194
14
Da
94,4
17
103,0
17
17
200
14
Da
100,4
18
109,0
18
18
214
14
Ne
114,4
19
123,0
19
29
226
15
Ne
126,4
20
136,0
20
Izbran avtomobil
Prevoženi
Starost
(1000 km)
(leta)
100
5
b) Na roko izriši graf raztrosa za celotno množico. Označbe instanc prilagodi razredu posamezne instance.
114
STROJNO UČENJE
Nakup
14
Da
Ne
12
10
8
Starost v letih 6
4
2
50
100
150
200
Prevo eni 1000 km
c) V spodnjo tabelo dopiši indekse najbližjih petih instanc za posamezno mero razdalje.
Rangi
1
2
3
4
5
Evklidska
7
6
5
8
9
Manhattanska
7
6
5
8
4
REŠITVE NALOG 115
d) V tabelo dopiši rezultate klasifikacije za posamezno nastavitev k in posamezno mero razdalje.
Evklidska
Manhattanska
k
Da
Ne
Rezultat
Da
Ne
Rezultat
1
1
0
Da
1
0
Da
2
2
0
Da
2
0
Da
3
3
0
Da
3
0
Da
4
3
1
Da
3
1
Da
5
4
1
Da
3
2
Da
116
STROJNO UČENJE
Naloga 4-2
Uporabi podatke prejšnje naloge o nakupih rabljenih avtomobilov.
a) Izračunaj povprečje in standardni odklon za vsak atribut podatkov.
µ (Prevoženi km) = 126,2
ρ (Prevoženi km) = 63,6
µ (Starost) = 8,4
ρ (Starost) = 4,0
b) V sledečo tabelo vnesi standardizirane podatke.
REŠITVE NALOG 117
Standardizirani podatki rabljenih avtomobilov Indeks Prevoženi
Starost Nakup
Evklidska
Manhattanska
(1000 km)
(leta)
d
Rang
d
Rang
0
-1,8
-1,6
Da
1,5
13
2,1
12
1
-1,5
-1,8
Ne
1,5
12
2,1
13
2
-1,4
-1,1
Da
1,0
7
1,2
7
3
-1,1
-0,8
Da
0,7
5
0,7
5
4
-0,9
-1,1
Ne
0,5
3
0,7
4
5
-0,7
-0,6
Da
0,4
1
0,6
2
6
-0,6
-0,3
Da
0,5
4
0,7
3
7
-0,4
-0,3
Da
0,5
2
0,5
1
8
-0,1
-0,1
Ne
0,8
6
1,1
6
9
0,0
0,2
Da
1,1
8
1,4
8
10
0,3
0,2
Ne
1,2
9
1,7
9
11
0,3
0,2
Ne
1,3
10
1,8
10
12
0,4
0,2
Ne
1,3
11
1,8
11
13
0,7
0,7
Ne
1,9
14
2,6
14
14
0,9
0,7
Ne
2,0
15
2,8
15
15
1,0
0,9
Ne
2,3
16
3,2
16
16
1,1
1,4
Da
2,7
17
3,7
17
17
1,2
1,4
Da
2,7
18
3,8
18
18
1,4
1,4
Ne
2,9
19
4,0
19
29
1,6
1,7
Ne
3,2
20
4,5
20
Izbran avtomobil
Prevoženi
Starost
(1000 km)
(leta)
-0,4
-0,8
c) Tabelo dopolni z evklidskimi in manhattanskimi razdaljami na standardiziranih podatkih.
118
STROJNO UČENJE
d) V spodnjo tabelo dopiši rezultate klasifikacije za posamezno nastavitev k in posamezno mero razdalje.
Evklidska
Manhattanska
k
Da
Ne
Rezultat
Da
Ne
Rezultat
1
1
0
Da
1
0
Da
2
2
0
Da
2
0
Da
3
2
1
Da
3
0
Da
4
3
1
Da
3
1
Da
5
4
1
Da
4
1
Da
REŠITVE NALOG 119
Naloga 4-3
V Pythonu napiši sledečo kodo.
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Wine. Za namene te naloge uporabiš le dva atributa množice:
’magnesium’ in ’flavanoids’. Obdrži le ta dva atributa, ostale zavrzi.
Pazi, da ne izgubiš podatka o razredu.
f r o m p a n d a s i m p o r t I n d e x
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ w i n e p o d a t k i = l o a d _ w i n e ( a s _ f r a m e = T r u e ) mag = I n d e x ( p o d a t k i . f e a t u r e _ n a m e s ) . g e t _ l o c ( ’ m a g n e s i u m ’ ) fla = I n d e x ( p o d a t k i . f e a t u r e _ n a m e s ) . g e t _ l o c ( ’ f l a v a n o i d s ’ ) p o d a t k i _ o s t a l i = p o d a t k i . d at a . i l o c [ : , [ mag , fla ] ]
120
STROJNO UČENJE
b) Zadnjo instanco te množice shrani kot testno instanco, ves ostali del množice pa shrani kot učne podatke. Izpiši prvih pet vrstic učnih podatkov in testno instanco.
i z b r a n a = - 1
X _ i z b r a n a = p o d a t k i . d a t a . i l o c [ izbrana , : ]
y _ i z b r a n a = p o d a t k i . t a r g e t . i l o c [ i z b r a n a ]
X _ o s t a l i = p o d a t k i . da t a . d r o p ( p o d a t k i . d a ta . t a i l ( 1 ) . index , a x i s = 0 )
y _ o s t a l i = p o d a t k i . t a r g e t . d r o p ( p o d a t k i . t a r g e t . t a i l ( 1 ) .
i n d e x )
p r i n t ( X _ o s t a l i . i l o c [ 0 : 5 , : ] ) p r i n t ( X _ i z b r a n a )
alcohol malic_acid
ash alcalinity_of_ash magnesium total_phenols
...
0
14.23
1.71
2.43
15.6
127.0
2.80
1
13.20
1.78
2.14
11.2
100.0
2.65
2
13.16
2.36
2.67
18.6
101.0
2.80
3
14.37
1.95
2.50
16.8
113.0
3.85
4
13.24
2.59
2.87
21.0
118.0
2.80
alcohol 14.13
malic_acid 4.10
ash 2.74
alcalinity_of_ash 24.50
magnesium 96.00
total_phenols 2.05
flavanoids 0.76
nonflavanoid_phenols 0.56
...
REŠITVE NALOG 121
c) Izriši graf raztrosa učnih podatkov, kjer je ’magnesium’ na x osi ter ’flavanoids’ na y osi. Označbe instanc naj so obarvane glede na razred posamezne instance. Pri tem uporabi bodisi knjižnico seaborn ali Matplotlib.
i m p o r t s e a b o r n as sns
sns . s c a t t e r p l o t ( x = X _ o s t a l i . i l o c [ : , 0 ] , y = X _ o s t a l i . i l o c [ : , 1 ] ,
hue = p o d a t k i . t a r g e t _ n a m e s [ y _ o s t a l i ] , p a l e t t e = ’ c o l o r b l i n d ’ )
6
class_0
class_1
5
class_2
4
3
2
1
11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0
122
STROJNO UČENJE
d) Učne podatke uporabi za učenje sledečih klasifikatorjev k najbližjih sosedov:
• k = 1 in evklidska razdalja,
• k = 1 in manhattanska razdalja,
• k = 3 in evklidska razdalja,
• k = 3 in manhattanska razdalja,
• k = 5 in evklidska razdalja in
• k = 5 in manhattanska razdalja.
Napovedi za testno instanco vsakega klasifikatorja izpiši.
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r for k in ( 1 , 3 , 5 ) :
for r a z d a l j a in ( ’ e u c l i d e a n ’ , ’ m a n h a t t a n ’ ) : knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 5 , m e t r i c = r a z d a l j a )
knn . fit ( X _ o s t a l i , y _ o s t a l i )
n a p o v e d = knn . p r e d i c t ( [ X _ i z b r a n a ] ) p r i n t ( f ’ KNN m e t r i c = { r a z d a l j a } , ’
f ’ k = { k } n a p o v e { p o d a t k i . t a r g e t _ n a m e s [
n a p o v e d ] } ’ )
KNN metric=euclidean, k=1 napove ’class_1’
KNN metric=manhattan, k=1 napove ’class_2’
KNN metric=euclidean, k=3 napove ’class_1’
KNN metric=manhattan, k=3 napove ’class_2’
KNN metric=euclidean, k=5 napove ’class_1’
KNN metric=manhattan, k=5 napove ’class_2’
REŠITVE NALOG 123
Naloga 4-4
V Pythonu napiši sledečo kodo.
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Breast cancer. Zadnjih deset instanc te množice shrani ločeno kot testno množico, ves ostali del množice pa shrani kot učne podatke. Izpiši prvih pet vrstic učnih podatkov in prvih pet instanc testne množice.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ b r e a s t _ c a n c e r p o d a t k i = l o a d _ b r e a s t _ c a n c e r ( a s _ f r a m e = T r u e ) i z b r a n i = l i s t ( r a n g e ( p o d a t k i . d a t a . s h a p e [ 0 ] - 10 , p o d a t k i . d a t a . s h a p e [ 0 ] ) )
X _ i z b r a n i = p o d a t k i . d a t a . i l o c [ izbrani , : ]
y _ i z b r a n i = p o d a t k i . t a r g e t . i l o c [ i z b r a n i ]
X _ o s t a l i = p o d a t k i . da t a . d r o p ( izbrani , ax i s = 0 ) y _ o s t a l i = p o d a t k i . t a r g e t . d r o p ( i z b r a n i ) p r i n t ( X _ i z b r a n i . h e a d ( 5 ) )
p r i n t ( X _ o s t a l i . h e a d ( 5 ) )
mean radius
mean texture
mean perimeter
mean area ...
559
11.51
23.93
74.52
403.5
560
14.05
27.15
91.38
600.4
561
11.20
29.37
70.67
386.0
562
15.22
30.62
103.40
716.9
563
20.92
25.09
143.00
1347.0
mean radius
mean texture
mean perimeter
mean area ...
0
17.99
10.38
122.80
1001.0
1
20.57
17.77
132.90
1326.0
2
19.69
21.25
130.00
1203.0
3
11.42
20.38
77.58
386.1
4
20.29
14.34
135.10
1297.0
124
STROJNO UČENJE
b) Standardiziraj podatke na podlagi učne množice. Standardiziraj tako učne kot testne podatke. Pri tem pazi, da ne izgubiš nestandardiziranih učnih in testnih podatkov. Izpiši prvih pet vrstic standardiziranih učnih podatkov in prvih pet instanc standardizirane testne množice.
f r o m s k l e a r n . p r e p r o c e s s i n g i m p o r t S t a n d a r d S c a l e r s t a n d a r d i z a t o r = S t a n d a r d S c a l e r () s t a n d a r d i z a t o r . fit ( X _ o s t a l i ) X _ o s t a l i _ s = s t a n d a r d i z a t o r . t r a n s f o r m ( X _ o s t a l i ) X _ i z b r a n i _ s = s t a n d a r d i z a t o r . t r a n s f o r m ( X _ i z b r a n i ) p r i n t ( X _ i z b r a n i _ s [ 0 : 5 , : ] )
p r i n t ( X _ o s t a l i _ s [ 0 : 5 , : ] )
[[-7.40458594e-01 ...
-3.96577043e-01]]
REŠITVE NALOG 125
c) Nauči dva k najbližjih sosedov klasifikatorja (k = 3, evklidska razdalja), enega na nestandardiziranih podatkih, drugega na standardiziranih podatkih. Za vsako instanco v testni množici izpiši v eni vrstici tri vrednosti:
1. dejanski razred iz množice,
2. napoved klasifikatorja naučenega na nestandardiziranih podatkih in
3. napoved klasifikatorja naučenega na nestandardiziranih podatkih.
126
STROJNO UČENJE
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r k n n 1 = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 3 , m e t r i c = ’ e u c l i d e a n ’ )
k n n 1 . fit ( X _o s t a l i , y _ o s t a l i ) n a p o v e d 1 = k n n 1 . p r e d i c t ( X _ i z b r a n i ) k n n 2 = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 3 , m e t r i c = ’ e u c l i d e a n ’ )
k n n 2 . fit ( X _ o s t a l i _ s , y _ o s t a l i ) n a p o v e d 2 = k n n 2 . p r e d i c t ( X _ i z b r a n i _ s ) for i , d , n1 , n2 in zip ( izbrani , y _ o s t a l i , n a p o v e d 1 , n a p o v e d 2 ) :
p r i n t ( f ’ { i } je : { p o d a t k i . t a r g e t _ n a m e s [ d ] } , ’
f ’ knn ( i z v o r n i ) : { p o d a t k i . t a r g e t _ n a m e s [ n1 ] } , ’
f ’ knn ( s t a n d ) : { p o d a t k i . t a r g e t _ n a m e s [ n2 ] } ’ ) 559 je:
malignant, knn(izvorni):
benign, knn(stand):
benign
560 je:
malignant, knn(izvorni):
benign, knn(stand):
malignant
561 je:
malignant, knn(izvorni):
benign, knn(stand):
benign
562 je:
malignant, knn(izvorni):
malignant, knn(stand):
malignant
563 je:
malignant, knn(izvorni):
malignant, knn(stand):
malignant
564 je:
malignant, knn(izvorni):
malignant, knn(stand):
malignant
565 je:
malignant, knn(izvorni):
malignant, knn(stand):
malignant
566 je:
malignant, knn(izvorni):
malignant, knn(stand):
malignant
567 je:
malignant, knn(izvorni):
malignant, knn(stand):
malignant
568 je:
malignant, knn(izvorni):
benign, knn(stand):
benign
REŠITVE NALOG 127
6.2
Poglavje Kakovost klasifikacije
Naloga 5-1
Podani sta matriki zmede dveh različnih klasifikatorjev za klasifikacijo v dva razreda.
Klasifikator 1
Klasifikator 2
Napovedano
Napovedano
A
B
A
B
o
o
A
62
8
A
50
20
B
11
59
B
30
40
Dejansk
Dejansk
a) Za vsak klasifikator izračunaj točnost klasifikacije in delež napake.
62 + 59
točnostKlasifikator1 =
= 0,8643
62 + 8 + 11 + 59
50 + 40
točnostKlasifikator2 =
= 0,6429
50 + 20 + 30 + 40
delež napakeKlasifikator1 = 1,0 − 0,8643 = 0,1357
delež napakeKlasifikator2 = 1,0 − 0,6429 = 0,3571
b) Obravnavaj razred A kot pozitivni razred. Za vsak klasifikator izračunaj priklic, preciznost in F-mero.
128
STROJNO UČENJE
62
priklicKlasifikator1 =
= 0,8857
62 + 8
50
priklicKlasifikator2 =
= 0,7143
50 + 20
62
preciznostKlasifikator1 =
= 0,8493
62 + 11
50
preciznostKlasifikator2 =
= 0,6250
50 + 30
0,8493 ∗ 0,8857
F − meraKlasifikator1 = 2 ·
= 0,8671
0,8493 + 0,8857
0,6250 ∗ 0,7143
F − meraKlasifikator2 = 2 ·
= 0,6667
0,6250 + 0,7143
REŠITVE NALOG 129
Naloga 5-2
Podani sta matriki zmede dveh različnih klasifikatorjev za klasifikacijo v več razredov.
Klasifikator 1
Klasifikator 2
Napovedano
Napovedano
A
B
C
A
B
C
o
A
500
10
20
A
430
60
40
B
40
20
0
B
10
50
0
C
50
10
10
C
0
10
60
Dejansk
a) Za vsak klasifikator izračunaj točnost klasifikacije in delež napake.
500 + 20 + 10
točnostK1 =
= 0,8030
500 + 10 + 20 + 40 + 20 + 0 + 50 + 10 + 10
430 + 50 + 60
točnostK2 =
= 0,8181
430 + 60 + 40 + 10 + 50 + 0 + 0 + 10 + 60
delež napakeK1 = 1,0 − 0,8030 = 0,1970
delež napakeK2 = 1,0 − 0,8181 = 0,1819
130
STROJNO UČENJE
b) Za vsak klasifikator in za vsak razred posebej izračunaj priklic, preciznost in F-mero.
Klasifikator 1:
500
priklicA =
= 0,9434
500 + 10 + 20
20
priklicB =
= 0,3333
40 + 20 + 0
10
priklicC =
= 0,1429
50 + 10 + 10
500
preciznostA =
= 0,8475
500 + 40 + 50
20
preciznostB =
= 0,5000
10 + 20 + 10
10
preciznostC =
= 0,3333
20 + 0 + 10
0,9434 ∗ 0,8475
F − meraA = 2 ·
= 0,8929
0,9434 + 0,8475
0,3333 ∗ 0,5000
F − meraB = 2 ·
= 0,4000
0,3333 + 0,5000
0,1429 ∗ 0,3333
F − meraC = 2 ·
= 0,2000
0,1429 + 0,3333
REŠITVE NALOG 131
Klasifikator 2:
430
priklicA =
= 0,8113
430 + 60 + 40
50
priklicB =
= 0,8333
10 + 50 + 0
60
priklicC =
= 0,8571
0 + 10 + 60
430
preciznostA =
= 0,9773
430 + 10 + 0
50
preciznostB =
= 0,4167
60 + 50 + 10
60
preciznostC =
= 0,6000
40 + 0 + 60
0,8113 ∗ 0,9773
F − meraA = 2 ·
= 0,8866
0,8113 + 0,9773
0,8333 ∗ 0,4167
F − meraB = 2 ·
= 0,5556
0,8333 + 0,4167
0,8571 ∗ 0,6000
F − meraC = 2 ·
= 0,7059
0,8571 + 0,6000
132
STROJNO UČENJE
c) Izračunaj skupen priklic, preciznost in F-mero s po načinu makro agregacije metrik.
0,9434 + 0,3333 + 0,1429
priklicMa =
= 0,4732
3
0,8475 + 0,5000 + 0,3333
preciznostMa =
= 0,5603
3
0,8929 + 0,4000 + 0,2000
F − meraMa =
= 0,4976
3
d) Izračunaj skupen priklic, preciznost in F-mero s po načinu mikro agregacije metrik.
500 + 20 + 10
priklicMi =
= 0,8030
500 + 10 + 20 + 40 + 20 + 0 + 50 + 10 + 10
500 + 20 + 10
preciznostMi =
= 0,8030
500 + 40 + 50 + 10 + 20 + 10 + 20 + 0 + 10
0,8030 ∗ 0,8030
F − meraMi = 2 ·
= 0,8030
0,8030 + 0,8030
REŠITVE NALOG 133
e) Izračunaj skupen priklic, preciznost in F-mero s po načinu uteženega povprečenja metrik.
500 + 10 + 20
uA =
= 0,8030
500 + 10 + 20 + 40 + 20 + 50 + 10 + 10
40 + 20 + 0
uB =
= 0,0909
500 + 10 + 20 + 40 + 20 + 50 + 10 + 10
50 + 10 + 10
uC =
= 0,1061
500 + 10 + 20 + 40 + 20 + 50 + 10 + 10
priklicUa = 0,8030 ∗ 0,9434 + 0,0909 ∗ 0,3333 + 0,1061 ∗ 0,1429
= 0,8031
preciznostUa = 0,8030 ∗ 0,8475 + 0,0909 ∗ 0,5000 + 0,1061 ∗ 0,3333
= 0,7614
F − meraUa = 0,8030 ∗ 0,8929 + 0,0909 ∗ 0,4000 + 0,1061 ∗ 0,2000
= 0,7746
134
STROJNO UČENJE
Naloga 5-3
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Iris. Množico razdeli na učno, validacijsko in testno množico v razmerju 60:20:20.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s f r o m s k l e a r n . m o d e l _ s e l e c t i o n i m p o r t t r a i n _ t e s t _ s p l i t
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T ru e )
# R a z d e l i m o p o d a t k e na u č ne / v a l i d a c i j s k e in t e s t n e X _ u c n a _ v a l i d a c i j s k a , X _ t e s t n a , y _ u c n a _ v a l i d a c i j s k a , \ y _ t e s t n a = t r a i n _ t e s t _ s p l i t ( p o d a t k i . data , p o d a t k i . target ,
t r a i n _ s i z e = 0 . 8 )
# R a z d e l i m o p o d a t k e na u č ne in v a l i d a c i j s k e X_ucna , X _ v a l i d a c i j s k a , y_ucna , \
y _ v a l i d a c i j s k a = t r a i n _ t e s t _ s p l i t ( X _ u c n a _ v a l i d a c i j s k a , y _ u c n a _ v a l i d a c i j s k a ,
t r a i n _ s i z e = 0 . 75 )
p r i n t ( X _ u c n a . s h a p e [ 0 ] / p o d a t k i . d a t a . s h a p e [ 0 ] , X _ v a l i d a c i j s k a . s h a p e [ 0 ] / p o d a t k i . da t a . s h a p e [ 0 ] , X _ t e s t n a . s h a p e [ 0 ] / p o d a t k i . d a t a . s h a p e [ 0 ] ) 0.6 0.2 0.2
REŠITVE NALOG 135
b) Na učni množici nauči tri klasifikatorje k najbližjih sosedov z Evklidsko razdaljo. Prvi naj ima k = 1, drugi k = 5 in tretji k =
10.
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r k n n 1 = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 1 , m e t r i c = ’
e u c l i d e a n ’ )
k n n 5 = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 5 , m e t r i c = ’
e u c l i d e a n ’ )
k n n 1 0 = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 10 , m e t r i c = ’
e u c l i d e a n ’ )
k n n 1 . fit ( X_ucna , y _ u c n a )
k n n 5 . fit ( X_ucna , y _ u c n a )
k n n 1 0 . fit ( X_ucna , y _ u c n a )
136
STROJNO UČENJE
c) Vsak klasifikator uporabi za klasifikacijo validacijske množice. Za dobljene rezultate na validacijski množici za vsak klasifikator izračunaj točnost. Tistega z najboljšo točnostjo obravnavaj kot najboljšega in z njim nadaljuj.
f r o m s k l e a r n . m e t r i c s i m p o r t a c c u r a c y _ s c o r e k n n 1 _ n a p o v e d i = kn n 1 . p r e d i c t ( X _ v a l i d a c i j s k a ) k n n 5 _ n a p o v e d i = kn n 5 . p r e d i c t ( X _ v a l i d a c i j s k a ) k n n 1 0 _ n a p o v e d i = k n n 1 0 . p r e d i c t ( X _ v a l i d a c i j s k a ) k n n 1 _ t o c n o s t = a c c u r a c y _ s c o r e ( y _ v a l i d a c i j s k a , k n n 1 _ n a p o v e d i )
k n n 5 _ t o c n o s t = a c c u r a c y _ s c o r e ( y _ v a l i d a c i j s k a , k n n 5 _ n a p o v e d i )
k n n 1 0 _ t o c n o s t = a c c u r a c y _ s c o r e ( y _ v a l i d a c i j s k a , k n n 1 0 _ n a p o v e d i )
p r i n t ( f ’ Knn ( k = 1 ) to č n o s t je { k n n 1 _ t o c n o s t } . ’ ) p r i n t ( f ’ Knn ( k = 5 ) to č n o s t je { k n n 5 _ t o c n o s t } . ’ ) p r i n t ( f ’ Knn ( k = 10 ) to č n o s t je { k n n 1 0 _ t o c n o s t } . ’ ) Knn(k=1) točnost je 0.9.
Knn(k=5) točnost je 0.9333333333333333.
Knn(k=10) točnost je 1.0.
REŠITVE NALOG 137
d) Za najboljši klasifikator na testni množici izračunaj sledeče: 1. preciznost, priklic in F-mero za vsak razred,
# Za n a j b o l j š ega v z a m e m o k n n 1 0
f r o m s k l e a r n . m e t r i c s i m p o r t p r e c i s i o n _ s c o r e , r e c a l l _ s c o r e
f r o m s k l e a r n . m e t r i c s i m p o r t f 1 _ s c o r e p r i n t ( f ’ P r e c i z n o s t : { p r e c i s i o n _ s c o r e ( y _t e s t n a , k n n 1 0 _ n a p o v e d i ,
a v e r a g e = N o n e ) } ’ )
p r i n t ( f ’ P r i k l i c : { r e c a l l _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i ,
a v e r a g e = N o n e ) } ’ )
p r i n t ( f ’ F - m e r a : { f 1 _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i ,
a v e r a g e = N o n e ) } ’ )
Preciznost:
[0.125 0.46666667 0.57142857]
Priklic:
[0.125 0.7 0.33333333]
F-mera:
[0.125 0.56 0.42105263]
138
STROJNO UČENJE
2. makro agregirane preciznost, priklic in F-mero, p r i n t ( f ’ P r e c i z n o s t : { p r e c i s i o n _ s c o r e ( y _ t es t n a , k n n 1 0 _ n a p o v e d i ,
a v e r a g e = " m a c r o ") } ’ )
p r i n t ( f ’ P r i k l i c : { r e c a l l _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i , a v e r a g e = " m a c r o ") } ’ )
p r i n t ( f ’ F - m e r a : { f 1 _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i , a v e r a g e = " m a c r o ") } ’ )
Preciznost:
0.38769841269841265
Priklic:
0.38611111111111107
F-mera:
0.3686842105263158
3. mikro agregirane preciznost, priklic in F-mero ter p r i n t ( f ’ P r e c i z n o s t : { p r e c i s i o n _ s c o r e ( y _ t es t n a , k n n 1 0 _ n a p o v e d i ,
a v e r a g e = " w e i g h t e d ") } ’ ) p r i n t ( f ’ P r i k l i c : { r e c a l l _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i , a v e r a g e = " w e i g h t e d ") } ’ ) p r i n t ( f ’ F - m e r a : { f 1 _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i , a v e r a g e = " w e i g h t e d ") } ’ ) Preciznost:
0.4174603174603175
Priklic:
0.4
F-mera:
0.388421052631579
REŠITVE NALOG 139
4. uteženo agregirane preciznost, priklic in F-mero.
p r i n t ( f ’ P r e c i z n o s t : { p r e c i s i o n _ s c o r e ( y _t e s t n a , k n n 1 0 _ n a p o v e d i ,
a v e r a g e = " m i c r o ") } ’ )
p r i n t ( f ’ P r i k l i c : { r e c a l l _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i , a v e r a g e = " m i c r o ") } ’ )
p r i n t ( f ’ F - m e r a : { f 1 _ s c o r e ( y _ t e s t n a , k n n 1 0 _ n a p o v e d i , a v e r a g e = " m i c r o ") } ’ )
Preciznost:
0.4
Priklic:
0.4
F-mera:
0.4000000000000001
140
STROJNO UČENJE
Naloga 5-4
a) S pomočjo knjižnice scikit-learn preberi podatke priložene mno-
žice Iris. Množico s stratificirano navzkrižno validacijo razdeli na pet rezov.
f r o m s k l e a r n . d a t a s e t s i m p o r t l o a d _ i r i s f r o m s k l e a r n . m o d e l _ s e l e c t i o n i m p o r t S t r a t i f i e d K F o l d
# N a l o ž imo p o d a t k e
p o d a t k i = l o a d _ i r i s ( a s _ f r a m e = T ru e )
# N a l o ž imo s t r a t i f i c i r a n i n a v z k r i ž no v a l i d a c i j o s 4 r e z i skf = S t r a t i f i e d K F o l d ( n _ s p l i t s = 5 ) REŠITVE NALOG 141
b) Za vsako delitev na reze naredi sledeče: 1. nauči k najbližjih sosedov (k = 3, Evklidska razdalja) na učnih podatkih;
2. izpiši točnost klasifikacije na testnih podatkih in 3. izpiši uteženo agregirano F-mero na testnih podatkih.
f r o m s k l e a r n . n e i g h b o r s i m p o r t K N e i g h b o r s C l a s s i f i e r f r o m s k l e a r n . m e t r i c s i m p o r t a c c u r a c y _ s c o r e
# G r e m o s k o z i vse r a z d e l i t v e r e z o v for ucni , t e s t n i in skf . s p l i t ( p o d a t k i . data , p o d a t k i . t a r g e t ) :
X _ u c n a = p o d a t k i . d a t a . i l o c [ ucni , : ]
X _ t e s t n a = p o d a t k i . da t a . i l o c [ testni , : ]
y _ u c n a = p o d a t k i . t a r g e t . i l o c [ u c n i ]
y _ t e s t n a = p o d a t k i . t a r g e t . i l o c [ t e s t n i ]
knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 3 , m e t r i c = ’ e u c l i d e a n ’ )
knn . fit ( X_ucna , y _ u c n a )
k n n _ n a p o v e d i = knn . p r e d i c t ( X _ t e s t n a ) t o c n o s t _ r e z a = a c c u r a c y _ s c o r e ( y _ t e s t n a , k n n _ n a p o v e d i )
p r i n t ( f ’ To č n o s t k l a s i f i k a c i j e na tem ’
f ’ r e z u je { t o c n o s t _ r e z a } . ’ )
Točnost klasifikacije na tem rezu je 0.9666666666666667.
Točnost klasifikacije na tem rezu je 0.9666666666666667.
Točnost klasifikacije na tem rezu je 0.9333333333333333.
Točnost klasifikacije na tem rezu je 0.9666666666666667.
Točnost klasifikacije na tem rezu je 1.0.
142
STROJNO UČENJE
c) Povpreči metriki točnosti in F-mere na vseh rezih. Izpiši dobljeno povprečno točnost in povprečno F-mero vseh rezov.
i m p o r t n u m p y as np
# Sem b o m o s h r a n j e v a l i vse to č n o s t i t o c n o s t i = [ ]
# G r e m o s k o z i vse r a z d e l i t v e r e z o v for ucni , t e s t n i in skf . s p l i t ( p o d a t k i . data , p o d a t k i . t a r g e t ) :
X _ u c n a = p o d a t k i . d a t a . i l o c [ ucni , : ]
X _ t e s t n a = p o d a t k i . d a t a . i l o c [ testni , : ]
y _ u c n a = p o d a t k i . t a r g e t . i l oc [ u c n i ]
y _ t e s t n a = p o d a t k i . t a r g e t . i l o c [ t e s t n i ]
knn = K N e i g h b o r s C l a s s i f i e r ( n _ n e i g h b o r s = 3 , m e t r i c = ’ e u c l i d e a n ’ )
knn . fit ( X_ucna , y _ u c n a )
k n n _ n a p o v e d i = knn . p r e d i c t ( X _ t e s t n a ) t o c n o s t _ r e z a = a c c u r a c y _ s c o r e ( y _ t e s t n a , k n n _ n a p o v e d i )
# Z d a j pa š e s h r a n i m o p o s a m e z n e to č n o s t i v s e z n a m v s e h to č n o s t i
t o c n o s t i . a p p e n d ( t o c n o s t _ r e z a ) p r i n t ( f ’ Vse to č n o s t i so { t o c n o s t i } . ’ ) p r i n t ( f ’ P o v p r e č na to č n o s t je { np . m e an ( t o c n o s t i ) } . ’ ) Vse točnosti so [0.9666666666666667, 0.9666666666666667, 0.9333333333333333, 0.9666666666666667, 1.0].
Povprečna točnost je 0.9666666666666668.
REŠITVE NALOG 143
144
STROJNO UČENJE
7 | Zaključek in
kako naprej
S pomočjo te knjige si naredil/-a prve korake spoznavanja s strojnim učenjem. Pri tem smo pregledali eno tehniko nekoliko bolj poglobljeno
– tehniko nadzorovanega učenja, klasifikacijo. Čeprav je klasifikacija ena izmed poglavitnih tehnik strojnega učenja, pa vsekakor ni edina.
Za učinkovito in polno rabo strojnega učenja v raziskovalne ali poslovne namene je vsekakor potrebno spoznati tudi ostale (regresija, gručenje ...). Snov, ki smo jo predelali, pa služi kot osnova za lažje spoznavanje ostalih tehnik, bodisi samostojno ali ob pomoči druge literature.
Vsekakor obstajajo področja klasifikacije, ki so vredna dodatnega preučevanja – od tisoče drugih klasifikatorjev pa do posebnosti, kot so klasifikacija z neuravnoteženimi podatki in klasifikacija v več razredov. V knjigi smo se posvetili enemu klasifikacijskemu algoritmu, tj.
k najbližjih sosedov. Kljub temu, da ta algoritem v praksi ni vedno primeren za uporabo, smo se osredotočili nanj, ker je razumevanje nje-govega delovanja relativno enostavno. V praksi se večkrat uporabijo algoritmi takojšnjega učenja, saj je uporaba (ne pa tudi gradnja) mo-145
dela znanja pri takih algoritmih računsko manj zahteva in posledično bolj praktična. Podrobno poznavanje vsakega klasifikacijskega algoritma pa ni ne praktično kakor tudi izvedljivo zaradi nešteto različnih pristopov. Izkušen uporabnik tehnik strojnega učenja ima v reperto-arju nabor uporabnih in znanstveno dokazano učinkovitih algoritmov.
Poseg v eksotične algoritme je smiseln le ob prisotnosti specifičnih zahtev podatkov in analiz.
Prav tako pa je nesmiselno prehitevati z uporabo algoritmov za kreacijo kompleksnih modelov znanja – na primer globokih nevronskih mrež. Obstajajo primeri, kjer je uporaba teh smiselna tudi že v samem začetku (klasifikacija slik), ampak je osnovno poznavanje procesa strojnega učenja še vedno potrebno. Ob uporabi nevronskih mrež je vsekakor večji poudarek na sami optimizaciji modela znanja kot pa na samem procesu ekstrakcije vzorcev. Posledica tega se izrazi predvsem v potrebi po teoretičnem poznavanju podrobnosti samega algoritma kreacije modela znanja v obliki nevronske mreže in optimizacije mnogoterih posameznih nastavitev. Nepremišljena zagnanost v uporabo kompleksnejših algoritmov največkrat ne prinese boljših rezultatov strojnega učenja, temveč le zafrustriranost nad samim pro-cesom optimizacije takega modela in potrebo po neprimerno močnejši ter dražji strojni opremi.
Primeri v knjigi so prikazani v okolju Jupyter Notebook, ki je idealno za učenje, preizkušanje in raziskovanje s pomočjo tehnik strojnega učenja. Vsekakor pa uporaba tega okolja ni nujna, saj se lahko prav vsi primeri knjige uporabijo tudi v navadnih Python programih
– datotekah s končnico .py. Prav implementacija in uporaba metod strojnega učenja v Python programih (in ne zvezkih) je pogosta pri implementaciji storitev, ki se vključujejo v druge procese poslovnega ali informacijskega sistema.
V knjigi so vsi praktični primeri narejeni s pomočjo scikit-learn knjižnice, ampak dobro se je zavedati, da obstajajo še druge knji-
žnice in ogrodja strojnega učenja za delo v Pythonu. Če izvajamo strojno učenje na neuravnoteženih podatkih, bi uporabili knjižnico 146
STROJNO UČENJE
imbalanced-learn, za iskanje vzorcev v časovnih vrstah imamo knji-
žnico sktime, pri obdelavi besedil nam prav pridejo huggingface, NLTK ter spaCy, če pa se spuščamo v vode globokih nevronskih mrež, pa bi uporabili PyTorch ali TensorFlow in Keras. Je pa za vse nave-dene knjižnice značilno, da so kompatibilne ali celo v zaledju uporabljajo scikit-learn.
Prav tako se je dobro zavedati, da strojno učenje lahko uporabimo tudi v drugih programskih jezikih. Poleg Pythona je strojno učenje dobro podprto tudi v jezikih R, Java, C#, C, C++, JavaScript, Julia in mnogih drugih. V knjigi smo se osredotočili na delo v Pythonu, ker je to eden izmed najbolj pogosto uporabljenih jezikov v splošnem, kakor tudi za namen implementacije inteligentnih sistemov, ki uporabljajo strojno učenje. Vsekakor pa programski jezik ne bi smel biti ovira pri uporabi strojnega učenja, če le ne posegamo v kakšne bolj eksotične ali najnovejše pristope.
Avtorja tega dela srčno upava, da ti je knjiga podala primerno ko-ličino teoretičnega znanja o osnovah strojnega učenja ter praktičnih primerov klasifikacije. Upava, da se lahko zdaj samostojno spopadeš s prvimi izzivi na tem področju tudi v praksi. Predvsem pa je najina želja, da te je knjiga dovolj navdušila nad področjem strojnega učenja in so to bili tvoji prvi koraki v procesu spoznavanja in uporabe tehnik strojnega učenja.
Vso srečo!
ZAKLJUČEK IN KAKO NAPREJ 147
148
STROJNO UČENJE
Literatura
[1] A. Holzinger, G. Langs, H. Denk, K. Zatloukal in H. Müller, “Ca-usability and explainability of artificial intelligence in medicine,”
Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery, let. 9, št. 4, e1312, 2019.
[2] D Fister, J. Mun, V Jagrič in T Jagrič, “Deep Learning for Stock Market Trading: A Superior Trading Strategy?” Neural Network World, let. 29, št. 3, str. 151–171, 2019.
[3] J. Del Ser, E. Osaba, J. J. Sanchez-Medina in I. Fister, “Bioin-spired computational intelligence and transportation systems: a long road ahead,” IEEE Transactions on Intelligent Transportation Systems, let. 21, št. 2, str. 466–495, 2019.
[4] G. Bello-Orgaz, J. J. Jung in D. Camacho, “Social big data: Recent achievements and new challenges,” Information Fusion, let. 28, str. 45–59, 2016.
[5] F. Pedregosa, G. Varoquaux, A. Gramfort in sod., “Scikit-learn: Machine learning in Python,” the Journal of machine Learning research, let. 12, str. 2825–2830, 2011.
[6] M. Waskom in the seaborn development team, mwaskom/seaborn, ver. latest, sep. 2020. doi: 10 . 5281 / zenodo . 592845.
spletni naslov: https://doi.org/10.5281/zenodo.592845.
149
[7] J. Han, M. Kamber in J. Pei, Data mining: Concepts and techniques: concepts and techniques, 3. izd. Amsterdam, Nether-lands: Elsevier, 2011, isbn: 9789380931913.
[8] T. Hastie, R. Tibshirani in J. Friedman, The elements of stati-stical learning: Data mining, inference, and prediction, 2. izd., zbirka Springer Series in Statistics. Berlin, Heidelberg, Germany: Springer, 2009, isbn: 9780387848587.
[9] S. B. Kotsiantis, I Zaharakis in P Pintelas, “Supervised machine learning: A review of classification techniques,” Emerging artificial intelligence applications in computer engineering, let. 160, št. 1, str. 3–24, 2007.
[10] C. C. Aggarwal, A. Hinneburg in D. A. Keim, “On the surpri-sing behavior of distance metrics in high dimensional space,”
v International conference on database theory, Springer, 2001, str. 420–434.
[11] D. W. Aha, D. Kibler in M. K. Albert, “Instance-based learning algorithms,” Machine learning, let. 6, št. 1, str. 37–66, 1991.
[12] J. Goldberger, G. E. Hinton, S. Roweis in R. R. Salakhutdi-nov, “Neighbourhood components analysis,” Advances in neural information processing systems, let. 17, str. 513–520, 2004.
[13] J. Lever, M. Krzywinski in N. Altman, Classification evaluation, 2016.
[14] I. Guyon in sod., “A scaling law for the validation-set training-set size ratio,” AT&T Bell Laboratories, let. 1, št. 11, 1997.
[15] C. Schaffer, “Selecting a classification method by cross-validation,”
Machine Learning, let. 13, št. 1, str. 135–143, 1993.
[16] M. Hossin in M. Sulaiman, “A review on evaluation metrics for data classification evaluations,” International Journal of Data Mining & Knowledge Management Process, let. 5, št. 2, str. 1, 2015.
150
STROJNO UČENJE
[17] D. M. Powers, “Evaluation: from precision, recall and F-measure to ROC, informedness, markedness and correlation,” Journal of Machine Learning Technologies, let. 2, št. 1, str. 37–63, 2011.
[18] M. Sokolova, N. Japkowicz in S. Szpakowicz, “Beyond accuracy, F-score and ROC: a family of discriminant measures for performance evaluation,” v AI 2006: Advances in Artificial Intelligence, Berlin, Heidelberg, Germany: Springer, 2006, str. 1015–
1021, isbn: 9783540497875.
[19] M. Sokolova in G. Lapalme, “A systematic analysis of performance measures for classification tasks,” Information Processing
& Management, let. 45, št. 4, str. 427–437, 2009.
[20] J. Demšar, “Statistical comparisons of classifiers over multiple data sets,” The Journal of Machine Learning Research, let. 7, št. Jan, str. 1–30, 2006.
[21] G. Jurman in C. Furlanello, “A unifying view for performance measures in multi-class prediction,” ArXiv e-prints, avg. 2010.
arXiv: 1008.2908 [stat.ML].
LITERATURA 151
152
STROJNO UČENJE
Seznam slik
2.1 Jupyter zvezek na spletni storitvi Google Colab. . . . .
8
2.2 Spletna stran Python okolja Anaconda. . . . . . . . . .
10
2.3 Domača stran JupyterLab okolja. . . . . . . . . . . . .
12
2.4 Kreacija novega zvezka v JupyterLab okolju. . . . . . .
13
2.5 Nov prazen Jupyter zvezek. . . . . . . . . . . . . . . .
13
2.6 Rezultat Markdown zapisa. . . . . . . . . . . . . . . .
17
2.7 Prvi preizkus zapisa Python kode v Jupyter zvezek. . .
19
2.8 Preizkus delovanja knjižnice pandas. . . . . . . . . . .
20
2.9 Preizkus izrisa grafa raztrosa s knjižnico seaborn. . . .
21
2.10 Graf raztrosa podatkovne zbirke Iris. . . . . . . . . . .
23
3.1 Model znanja v obliki odločitvenega drevesa. . . . . .
28
3.2 Model znanja v obliki matematične funkcije. . . . . . .
29
3.3 Model znanja v obliki sprotne primerjave z že rešenimi
primeri. . . . . . . . . . . . . . . . . . . . . . . . . . .
30
3.4 Poenostavljen prikaz procesa gradnje in uporabe mo-
dela znanja. . . . . . . . . . . . . . . . . . . . . . . . .
31
3.5 Proces uporabe modela znanja v ekspertnem sistemu. .
32
3.6 Proces učenja in uporabe modela znanja v inteligen-
tnem sistemu. . . . . . . . . . . . . . . . . . . . . . . .
34
3.7 Struktura podatkov, primernih za strojno učenje. . . .
35
3.8 Splošni proces klasifikacije. . . . . . . . . . . . . . . . .
40
153
4.1 Izbira novih čevljev s primerjavo. . . . . . . . . . . . .
42
4.2 Primerjava dveh čevljev. . . . . . . . . . . . . . . . . .
42
4.3 Različne razdalje med dvema točkama. . . . . . . . . .
48
4.4 Razdalje na Manhattnu. . . . . . . . . . . . . . . . . .
49
4.5 Primerjava evklidske, manhattanske in kosinusne raz-
dalje. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
4.6 Klasifikacija instance s pomočjo k najbližjih sosedov ob
različnih nastavitvah parametra k. . . . . . . . . . . .
52
4.7 Instance podatkovne zbirke Iris. . . . . . . . . . . . . .
65
4.8 Delitev na območja razredov glede na način računanja
razdalj med instancami. . . . . . . . . . . . . . . . . .
69
4.9 Delitev na območja razredov glede na število najbližjih
sosedov. . . . . . . . . . . . . . . . . . . . . . . . . . .
71
5.1 Prikaz variance in pristranskosti. . . . . . . . . . . . .
86
5.2 Delitev množice na učno, validacijsko in testno ter nji-
hova uporaba. . . . . . . . . . . . . . . . . . . . . . . .
90
5.3 Stratificirana navzkrižna validacija. . . . . . . . . . . .
93
154
STROJNO UČENJE
Seznam tabel
4.1 Primer računanja razdalje med dvema čevljema. . . . .
43
4.2 Primer računanja razdalje z indikacijskimi atributi. . .
44
4.3 Primer k najbližjih sosedov. . . . . . . . . . . . . . . .
53
4.4 Primer k najbližjih sosedov s standardiziranimi podatki. 56
4.5 Klasifikacija s k najbližjih sosedov pri različnih nasta-
vitvah. . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
5.1 Matrika zmede za dva razreda. . . . . . . . . . . . . .
96
5.2 Matrika zmede za več razredov. . . . . . . . . . . . . . 104
155
156
STROJNO UČENJE
Stvarno kazalo
algoritem strojnega učenja,
klasifikacija, 38
33
kontingenčna tabela, glej
Anaconda, 10
matrika zmede
atribut, 35
kosinusna razdalja, 50
binarna klasifikacija, 38
leno učenje, 39, 51
delež napake, 99
Mahattanska razdalja,
delno nadzorovano učenje,
49
37
makro agregacija metrik,
ekspertni sistem, 31
105
Evklidska razdalja, 48
Markdown, 14
Matplotlib, 11
F-mera, 102
matrika zmede, 96
metrike klasifikacije, 98
gručenje, 37
mikro agregacija metrik,
indikacijski atribut, 44
107
instanca, 35
model znanja, 28
inteligentni sistem, 34
nadzorovano učenje, 36
Jupyter Notebook, 7
navzkrižna validacija, 93
JupyterLab, 7
nenadzorovano učenje,
36
k najbližjih sosedov, 51
nenasičenost, 86
157
normalizcija, 57
seaborn, 11
NumPy, 11
senzitivnost, glej priklic
standardizacija, 54
okrepitveno učenje, 37
stratifikacija, 94
pandas, 11
strojno učenje, 35
podatkovna množica, 35
podatkovno rudarjenje,
takojšnje učenje, 38
36
testna množica, 87
povprečen delež napake,
točnost, 98
105
povprečna točnost, 105
umetna inteligenca, 35
preciznost, 101
učno množico, 87
prenasičenje, 85
validacijska množica, 89
priklic, 100
varianca, 85
primerek, glej instanca
večrazredna klasifikacija,
pristranskost, 86
38
regresija, 36
rez, 93
zaupanje, glej
preciznost
scikit-learn, 11
značilnica, glej atribut
158
STROJNO UČENJE
STROJNO UČENJE
S PYTHONOM DO PRVEGA KLASIFIKATORJA
SAŠO KARAKATIČ IN IZTOK FISTER ML.
Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija.
E-pošta: saso.karaktic@um.si, iztok.fister1@um.si
Povzetek
Knjiga služi kot uvod v področje strojnega učenja za vse, ki imajo vsaj osnovne izkušnje s programiranjem. Pregledajo se pomembni pojmi strojnega učenja (model znanja, učna in testna množica, algoritem učenja), natančneje pa se predstavi tehnika klasifikacije in način ovrednotenja kvalitete modelov znanja klasifikacije. Spozna se algoritem klasifikacije k najbližjih sosedov in predstavi se uporaba tega algoritma -– tako konceptualno kakor v programski kodi. Knjiga poda številne primere v programskem jeziku Python in okolju Jupyter Notebooks. Za namen utrjevanja znanja pa so ponujene naloge (tako računske, kot programerske) s podanimi rešitvami.
Ključne besede
strojno učenje, umetna inteligenca, klasifikacija, k najbližjih sosedov, Python
MACHINE LEARNING
CLASSIFICATION IN PYTHON
SAŠO KARAKATIČ & IZTOK FISTER JR.
University of Maribor, Faculty of Electrical Engineering and Computer Science, Maribor, Slovenia.
E-mail: saso.karaktic@um.si, iztok.fister1@um.si
Abstract
The book serves as an introduction to the field of machine learning for anyone with basic programming experience. Important concepts of machine learning (knowledge model, learning and test set, learning algorithm) are reviewed. More details are given for the classification technique and quality evaluating procedures of classification knowledge models. The classification algorithm k nearest neighbors is presented
– both conceptually and in program code. The book provides many examples in the Python programming language and the Jupyter Notebooks environment. For the purpose of consolidating knowledge, several computational and programming exercises with the given so-lutions are offered.
Keywords
machine learning, artificial intelligence, classification, k nearest neighbors, Python
Document Outline
Uvod
Vzpostavitev okolja Razvojno okolje Jupyter Notebook
Uporaba oblačnega okolja
Namestitev in uporaba lokalnega okolja Anaconda
Nalaganje podatkov
Klasifikacija Model znanja
Ekspertni sistem
Inteligentni sistem
Podatki
Strojno učenje
Klasifikacija
Matematična definicija pojmov
Prvi klasifikator Računanje razdalj Kreacija indikacijskih atributov v Pythonu
Skupna razdalja Evklidska razdalja
Mahattanska razdalja
Kosinusna razdalja
Klasifikator k najbližjih sosedov Delovanje k najbližjih sosedov
Standardizacija podatkov
Določitev razreda podane instance
Uporaba k najbližjih sosedov v Pythonu Vizualizacija podatkov
Učenje in uporaba modela znanja
Vpliv nastavitev na rezultate
Vpliv standardizacije podatkov na rezultate
Enovit primer klasifikacije več instanc
Utrjevanje znanja
Kakovost klasifikacije Delitev podatkov Učna in testna množica
Validacijska množica
Navzkrižna validacija
Metrike klasifikacije Binarna klasifikacija
Klasifikacija v več razredov
Utrjevanje znanja
Rešitve nalog Poglavje Prvi klasifikator
Poglavje Kakovost klasifikacije
Zaključek in kako naprej
Literatura
Stvarno kazalo