Strojové učení 14. listopadu 2015
Poděkování Děkujeme Rudovi. i
Obsah Předmluva 1 Přehled použitého značení 2 1 Strojové učení 3 Celkový přehled. 1.1 Příklady použití.................................. 3 1.2 Metody...................................... 4 1.3 Proč studovat strojové učení........................... 5 2 Metoda nejbližších sousedů 6 Klasifikace, množina rysů, vektor, vzdálenost. 2.1 Klasifikační úlohy................................. 6 2.2 Algoritmus hledání nejbližších sousedů..................... 8 2.3 Doporučování filmů................................ 10 2.4 Cvičení rozpoznávání znaků.......................... 11 3 Perceptron 12 Parametrický model, předzpracování dat, testovací data, správnost. 3.1 Model....................................... 12 3.2 Algoritmus učení................................. 12 3.3 Předzpracování dat................................ 12 4 Lineární regrese 14 Regrese, regularizace. 5 Rozhodovací stromy 15 Porovnávání modelů, kombinace modelů. 6 Naivní Bayesův klasifikátor 16 Pravděpodobnostní model. 6.1 Podmíněná pravděpodobnost.......................... 17 6.2 Model....................................... 18 6.3 Cvičení...................................... 21 ii
7 Klastrování k-means 22 Učení bez učitele. 8 Další 23 SVM, neuronové sítě, zpětnovazebné učení. iii
Předmluva Velká část softwarových inovací posledních let, ať už jsou to automatické překladače z jednoho jazyka do druhého, detekce obličejů ve fotkách na Facebooku, našeptávač v Googlu, nebo samořídící auta má společné to, že nikdo ručně neprogramuje pravidla, podle kterých se tyto systémy řídí. S nadsázkou se dá říct, že to jsou programy, které programují jiné programy. Také mají společné to, že na světě existuje spousta záznamů o tom, jak to tyto úkoly zvládají lidé. Překlady textů, můžeme stahovat z internetu, uživatelé Facebooku se sami na fotkách označují, v případě aut není problém v palubním počítači zaznamenávat průběh jízdy. Právě tyto záznamy se používají k tomu, aby se programy naučily tyto úkoly automaticky strojovým učením. TM: Machine-learning technology powers many aspects of modern society: from web searches to content filtering on social networks to recommendations on e-commerce websites, and it is increasingly present in consumer products such as cameras and smartphones. Machinelearning systems are used to identify objects in images, transcribe speech into text, match news items, posts or products with users interests, and select relevant results of search. TM: The key aspect of deep learning is that these layers of features are not designed by human engineers: they are learned from data using a general-purpose learning procedure. TM: Deep learning is making major advances in solving problems that have resisted the best attempts of the artificial intelligence community for many years. It has turned out to be very good at discovering intricate structures in high-dimensional data and is therefore applicable to many domains of science, business and government. In addition to beating records in image recognition and speech recognition, it has beaten other machine-learning techniques at predicting the activity of potential drug molecules, analysing particle accelerator data, reconstructing brain circuits, and predicting the effects of mutations in non-coding DNA on gene expression and disease. Perhaps more surprisingly, deep learning has produced extremely promising results for various tasks in natural language understanding, particularly topic classification, sentiment analysis, question answering and language translation. 1
Přehled použitého značení TM: Preferoval bych label před class. Nemá ontologické konotace a není to klíčové slovo v Pythonu. Značka x y Význam vstupní vektor výstupní vektor 2
Kapitola 1 Strojové učení TM: Napsat, že budem prezentovat kódy, které nebudou nutně nejsprávnější ani nejefektivnější, zato budou usilovat o co největší srozumitelnost. V praxi člověk použije knihovnu. Poskytnout jednoduchou a srozumitelnou definici strojového učení by bylo obtížné. Pod tímto označením se ukrývá mnoho různých metod, které se navzájem výrazně liší. Nejprve proto představíme několik úspěšných aplikací strojového učení. Na nich pak ukážeme jeho obecné principy, vlastnosti, výhody a nevýhody. 1.1 Příklady použití Samořídící auta! Jednou z nejdéle používaných aplikací strojového učení je rozpoznávání ručně psaných číslic při automatickém třídění poštovních zásilek. První výzkumy v této oblasti začaly už v osmdesátých letech dvacátého století ve Spojených státech. Od konce devadesátých let se automatické rozpoznávání poštovních směrovacích čísel používá v praxi. Google Translate. Příkladem takového programu je známý překladač od společnosti Google. Zde se překlad učí z textů, které existují ve více jazycích. Pro učení překladu jednoho jazykového párů se využívají texty, které mají dohromady až miliardy slov. Facebook. V roce 2014 publikovaly výzkumníci z Facebooku a Cornellovy univerzity v New Yorku článek 1, ve kterém používají strojové učení k tomu, aby rozpoznaly, zda se pár v nejbližší době rozejde. TM: Citace v předchozím odstavci zabírá stejně textu jako zajímavá informace, imho patří celá do poznámky. Watson. Například banky disponují velkým množstvím dat o svých klientech, mají také informace o tom, jestli jak se jejich klientům v minulosti dařilo nebo nedařilo splácet půjčky. Podobné metody používají také pojišťovny, když odhadují rizika pojistných událostí. V praxi se můžeme setkat i s celkem bizarními využitími strojového učení. Ve vědeckých časopisech byly publikovány například články a diagnostice Parkinsonovy choroby ze způsobu 1 http://arxiv.org/pdf/1310.6753v1.pdf 3
předpoklady x data x 1 y 1 x 2 y 2 x 3 y 3.. učící algoritmus metaparametry model algoritmus parametry y požadavky Obrázek 1.1: Základní schéma strojového učení. ovládání displeje smartphonu nebo automatické rozpoznávání pohlaví autora textu podle rukopisu, které využívají strojové učení. 1.2 Metody O strojovém učení mluvíme tehdy, když pravidelnosti (vzory patterns, obvyklosti, uspořádanosti) v datech nevyhledává člověk, ale stroj (tedy počítač) pomocí nějakého programu. S pomocí počítačů jsme schopni analyzovat množství dat, které by jinak nebylo v lidských silách zvládnout. Jednou z oblastí, kde se strojové učení často používá, jsou úlohy, které člověk provádí se samozřejmostí například rozpoznávání objektů kolem sebe, rozpoznávání mluvené řeči nebo překlad z jednoho jazyka do druhého. O strojovém učení hovoříme i v případě, kdy místo toho, abychom složitě programovali řešení nějaké úlohy, využijeme toho, že existují trénovací data necháme program, aby se to naučil sám. 4
1.3 Proč studovat strojové učení Shrnutí Strojové učení je: vyhledávání pravidelností v datech způsob jak docílit nějakého chování počítače bez explicitního programu proces hledání vhodného modelu a jeho parametrů TM: Jak se liší SU od modelování obecně? JL: Měla by být zvlášť kapitola o feature engeneeringu nebo to ukázat někde jinde (konjunkce featur apod.) JL: Big Data JL: společenský dopad 5
Kapitola 2 Metoda nejbližších sousedů TM: doporučování filmů by byl realistický příklad na použití vzdálenosti JL: Co do každé kapitoly přidat jednu zajímavou story tady by to mohl být collaborative filtering, u prceptronu ty experimenty v padesátkách V této kapitole si představíme jednu z nejjednodušších metod strojového učení, která je velice intuitivní a jmenuje se návodně metoda nejbližších sousedů. Pro začátek se podíváme na úlohu, který je poměrně jednoduchá a dobře poslouží k představení základních pojmů.v závěrečném programovacím cvičení se podíváme na zajímavější, ale o něco složitější úlohu. 2.1 Klasifikační úlohy V této kapitole bude naší úlohou určování tří druhů kosatců podle šířky a délky jejich kališních a korunních lístků. Schéma květu najdete na obrázku 2.1. Pochopitelně to není tak, že by si někdo řekl, že potřebuje určovat druhy kosatců a bude to dělat tak, že pravítkem změří rozměry květu, ty zadá do počítače a dozví se, jaký druh má před sebou. To by bylo značně absurdní. Ve skutečnosti jen využíváme známou databázi měření, která pochází z roku 1936 a od druhé poloviny 20. století se často používá jako příklad v informatické literatuře pro ilustraci různých metod. Využívání dat, která původně vznikla pro jiné účely, ale obsahují zajímavé informace (např. účetní záznamy), je ve strojovém učení zcela běžné. Obrázek 2.1: Schéma květu dvouděložných rostlin. 6
Úlohy tohoto typu, kdy se na základě nějakých vlastností objektů rozhodujeme, do jaké skupiny objekt patří, nazýváme obecně klasifikace (EN: classification). Klasifikaci obvykle popisujeme jako přiřazování značky (EN: labels), které označují jednotlivé skupiny třídy (EN: classes). Jiným příkladem klasifikace může být filtrování spamu v emailech. Zde se klasifikuje do dvou tříd spam a běžný email. Složitějším příkladem klasifikace je identifikace obličejů na fotkách. Značky, které v tomto případě fotkám přiřazujeme jsou jména osob, které chceme na fotkách rozpoznat. Metoda nejbližších sousedů se dá několika slovy popsat takto: k neklasifikovanému příkladu najdeme nejpodobnější nejbližší známý příklad a neklasifikovaný příklad zařadíme do stejné třídy. Nejen, že se to snadno řekne, ale jak uvidíme později překvapivě snadno také naprogramuje. K tomu, abychom se naučili kosatce rozpoznávat, máme k dispozici 100 příkladů, u nichž známe délku a šířku korunních lístků, délku a šířku kališních lístků, k jakému druhu která rostlina patří. Těmto příkladům, ze kterých se naučíme rostliny rozpoznávat říkáme trénovací data (EN: training data). Jejich ukázku najdete v tabulce 2.1. koruna kalich druh délka šířka délka šířka 6.4 3.2 4.5 1.5 Iris versicolor 5.3 3.7 1.5 0.2 Iris setosa 6.1 2.6 5.6 1.4 Iris virginica 7.7 3.0 6.1 2.3 Iris virginica 5.0 3.3 1.4 0.2 Iris setosa 7.0 3.2 4.7 1.4 Iris versicolor Tabulka 2.1: Ukázka trénovacích dat. Rozměry jsou uvedeny v centimetrech. Vidíme tedy, že každý exemplář rostliny je popsán čtyřmi reálnými čísly a druhem, ke kterému patří. Číslu, které popisuje vlastnost instance, budeme říkat rys (EN: feature). Někdy se používá také pojem příznak, vstupní veličina, nebo slangově počeštělé fíčura. Jednotlivým exemplářům říkáme instance (EN: instances). V případě klasifikace emailů na spamy a nespamy se jako rysy používají informace o přítomnosti určitých slov nebo o tom, jak často uživatel na tuto adresu sám odesílá emaily. Instancemi jsou jednotlivé emaily. Pro zjednodušení zápisu budeme s rysy zacházet jako s vektory reálných čísel. O vektorech většinou mluvíme v souvislosti s geometrií, ale pro nás bude zatím vektor jenom uspořádaná n-tice čísel. V případě úlohy s kosatci vypadá trénovací příklad vypadá takto: (7.0, 3.2, 4.7, 1.4) Iris versicolor 7
2.2 Algoritmus hledání nejbližších sousedů Algoritmus, který použijeme v případě, že potřebujeme klasifikovat novou, neznámou instanci je velice jednoduchý. Projdeme všechna trénovací data a pro každou trénovací instanci změříme její vzdálenost od té klasifikované. Vybereme tu, která má nejmenší vzdálenost a použijeme její třídu. Algoritmus v Pythonu naprogramujeme například takto: 1 def nearest_neighbor( new_instance, training_data): 2 # Zadefinujeme funkci, ktera pocita vzdalenost nove intance 3 # od prikladu z trenovacich dat. 4 def distance_from_instance( training_example): 5 # Z trenovaciho prikladu nas zajima pouze vektor rysu. 6 feature_vector, _ = training_example 7 # Vratime vzdalenost vektoru rysu trenovaciho vektoru a nove instance. 8 return distance( feature_vector, new_instance) 9 10 # Definovanou funkci pouzije jako klic pro hledani minima 11 # v trenovacich datech. 12 nearest_vector, nearest_label = \ 13 min( training_data, key= distance_from_instance) 14 # Vratime tridu nejbliziho souseda. 15 return nearest_label Abychom mohli algoritmus spustit, chybí nám ještě implementovat funkci distance. Měřit vzdálenost mezi instancemi můžeme různým způsobem. My si nyní ukážeme ten nejběžnější způsob Eukleidovskou vzdálenost. Když pomocí vektorů označujeme body v ploše nebo prostoru, můžeme snadno měřit jejich vzdálenost pomocí Pythagorovy věty. Pro dva dvourozměrné vektory a = (a 1, a 2 ) a b = (b 1, b 2 ), můžeme spočítat jejich vzdálenost d(a, b) = (a 1 b 1 ) 2 + (a 2 b 2 ) 2. (2.1) Geometrické odvození je celkem jednoduché a můžeme ho schématicky vidět na obrázku 2.2. Obrázek 2.2: Odvození Eukleidovské vzdálenosti pomocí Pythagorovy věty. Rozdíly souřadnice určují velikosti přepon trojúhelníku. Odvěsna potom určuje jejich vzdálenost. Pro třírozměrné vektory c = (c 1, c 2, c 3 ) a d = (d 1, d 2, d 3 ), máme Eukleidovskou vzdálenost d(c, d) = (c 1 d 1 ) 2 + (c 2 d 2 ) 2 + (c 3 d 3 ) 2. (2.2) 8
Znázornit její odvození jako v případě dvou rozměrů by bylo o něco složitější, ale stále možné. Eukleidovská vzdálenost se dá zobecnit pro vektory, které mají n rozměrů, ovšem bez rozumné možnosti postup vizualizovat. Pro vektory e = (e 1,..., e n ) a f = (f 1,..., f n ). Eukleidovskou vzdálenost mezi nimi spočítáme takto: d(e, f) = (e 1 f 1 ) 2 +... + (e n f n ) 2 = n (e i f i ) 2. (2.3) V Pythonu zapíšeme Eukleidovskou vzdálenost velice snadno a podobně matematickému zápisu: 1 def distance( vec_a, vec_b): 2 # pocitame odmocninu - np. sqrt(...) 3 # ze souctu - sum(...) 4 # operator "-" vektory po slozkach odecte, 5 # operator "**" vektory po slozkach umocni 6 return np. sqrt( sum(( vec_a - vec_b) ** 2)) Ve cvičení si ukážeme ještě další způsob, jak se počítat vzdálenost mezi instancemi. i=1 Obrázek 2.3: Dvourozměrná vizualizace dat délka šířka korunních lístků (vlevo) a délka šířka kališních lístků (vpravo), jednotlivé třídy jsou barevně označeny. Na obrázku 2.3 vidíme jednoduchou vizualizaci našich trénovacích dat. Bohužel do grafu nelze zakreslit čtyřrozměrné vektory a tak jsme zakreslili zvlášť rozměry kališních a korunních lístků. Pokud bychom se rozhodli používat pouze dva rysy, mohli bychom skutečně hledat nejbližší sousedy v grafu tak, že bychom pravítkem měřili, která instance je nejpodobnější novému exempláři. Zároveň si v grafu můžeme všimnout toho, že často ten nejbližší soused nemusí patřit do třídy, kterou považujeme intuitivně za nejsprávnější. Vezměme například na bod [7, 1; 3, 2] v levém grafu. K němu je nejblíže zeleně obarvený bod, přestože leží v oblasti, které dominují spíše modré body a asi bychom selským rozumem považovali za správnější, kdyby tento nový bod byl také modrý. To se dá vyřešit jednoduchou modifikací algoritmu místo jednoho nejbližšího sousedního bodu se můžeme podívat na více sousedních bodů z nich vybrat 9
převažující značku. Počet sousedů, na které se díváme je v následujícím kódu označen jako k. 1 def k_nearst_neighbors(k, new_instance, training_data): 2 # Seradime trenovaci data podle vzdalenosti od nove instance. 3 # Funkce " distance_from_instance" z predchozi funkce je nahrazena 4 # strucnejsim lambda zapisem. 5 training_data_by_distance = \ 6 sorted( training_data, key= lambda x: distance(x[0], new_instance ))[0: k] 7 # Z tech vezmeme k nejblich. 8 k_nearest_instances = training_data_by_distance [0: k] 9 # Z nejblizsich trenovacich prikladu vezmeme pouze jejich tridy. 10 k_nearest_labels = [y for x, y in k_nearest_instances] 11 12 # Nyni spocitame, kolikrat se ktera trida vyskytuje v okoli nove instance. 13 # V nasledujici promenne je tabulka, do ktere budeme zapisovat pocty trid. 14 labels_counts = {} 15 # Projdeme tridy nejblizsich prikladu jednu po druhe: 16 for label in k_nearest_labels: 17 # pokud jeste neni v tabulce, zapiseme jeji vyskyt 1- krat, 18 if label not in labels_count: 19 labels_counts[ label] = 1 20 # pokud uz je v tabulce, zvysime pocet vyskytu o 1. 21 else: 22 labels_counts[ label] += 1 23 # Vratime znacku, ktera se vyskytla nejvickrat. 24 return max( labels_counts, key= lambda c: labels_counts[c]) Největší praktickou nevýhodou metody nejbližších sousedů je to, že vyžaduje, aby při klasifikaci nových instancí, byla všechna trénovací data načtena v paměti. To může být v případě velkých datových sad problematické. V ukázkách kódu vždy procházíme všechny trénovací instance. V praxi se používají metody, které umožňují procházet trénovací data chytřeji bez nutnosti vždy procházet celá trénovací data. 2.3 Doporučování filmů Na principu této metody je založeno také doporučování obsahů na různých webových službách, např. Youtube nebo Netflix (největší světová půjčovna filmů). Základní algoritmus je velice jednoduchý. Pro každého uživatele zaznamenáváme, jak hodnotil jaké filmy. Každý film tedy můžeme popsat vektorem, který říká, jak se líbil kterému uživateli a zároveň každého uživatele můžeme popsat vektorem, který říká, jak se mu líbily které filmy. Pokud tedy chceme uživateli doporučit něco, co se mu pravděpodobně bude líbit, doporučíme mu, který se líbil podobným lidem (uživatelům, kteří mají nejpodobnější vektory). Stejně tak můžeme snadno vytipovat podobné filmy budou to zase filmy s nejpodobnějšími vektory. JL: Mohl bych k tomu namalovat nějaký obrázek Jako rysy nemusíme používat pouze hodnocení od uživatelů. V případě Youtube je cennou informací, jestli se uživatel na video díval až do konce, jestli ho komentoval, kolik času strávil 10
čtením komentářů a další podobná data. Největším problémem této metody se skutečnost, že většina uživatelů většinu videí vůbec neviděla. Kdybychom tedy měli počítat Eukleidovskou vzdálenost jejich vektorů, téměř by se nelišila, protože uživatelé se shodují téměř ve všech dimenzích (videa, která nikdy neviděli). Mohli bychom také chtít porovnat každé dva uživatele pouze v těch dimenzích, které kódují videa, které oba viděli. Potom bychom narazili na problém, že vzdálenosti mezi různými páry uživatelů by byly vzájemně neporovnatelné, protože by používaly různé rysy. Zároveň je nutné umět tuto podobnost počítat velice efektivně, protože se obvykle pracuje s obrovskými daty (miliony uživatelů a videí). Doporučování uživatelům na základě historie je pochopitelně i komerčně velice zajímavý problém. V letech v roce 2007 vypsal Netflix cenu jeden milion dolarů pro toho, kdo nalezne algoritmus, který bude umět doporučovat filmy s o 10 % větší úspěšností, než algoritmus, který používal Netflix sám. Soutěže se každý rok účastnili přes pět tisíc týmů, které odevzdaly více než 13 000 řešení. Hlavní cena byla udělena až v roce 2009. Přestože trénovací data do soutěže byla anonymizovaná, už v roce 2007 se dvěma vědcům z Texaské univerzity podařilo odhalit ztotožnit uživatele s jejich profily v Internet Movie Database. Po sérii žalob na ochranu soukromí se Netflix rozhodl soutěž v roce 2010 ukonči. 2.4 Cvičení rozpoznávání znaků JL: OCR pomocí k-nn s Hamming Loss Shrnutí Klasifikace je typ úlohy, jejímž cílem je rozdělit objekty (instance) do několika tříd. Jednotlivé instance popisujeme množinou rysů, které typicky zapisujeme jako vektory reálných čísel. Algoritmy strojového učení se učí z trénovacích dat datové sady, kde jsou jednotlivým instancím správě přiřazené třídy. Metoda nejbližších sousedů pracuje tak, že k neznámé instanci nalezne nejpodobnější příklady a přiřadí jí převládající třídu. K počítání podobnosti se používá vzdálenost mezi vektory rysů, nejtypičtější příkladem je Eukleidovská vzdálenost. 11
Kapitola 3 Perceptron JL: Nápad k perceptronu že můžeme rysy sečíst, když působí společně, ale nevíme v jakém poměru. JL: parametrický model, KNN byl neparametrický TM: zavést lin. separabilitu? 3.1 Model { 1 pokud n y = i=1 w ix i b 0 jinak (3.1) 3.2 Algoritmus učení TM: t = čas w t+1 = w t (y t)x (3.2) 3.3 Předzpracování dat TM: heuristika pro počáteční nastavení vah: průměr pozitivních minus průměr negativních vzorů TM: modifikace: parametr rychlosti učení JL: Learning curve TM: přihrádkový algoritmus učení pamatuju si nejlepší váhový vektor a kolik vzorů poznal správně JL: accuracy = správnost, co precision a recall? (přesnost a úplnost) 12
TM: důkaz konvergence JL: praktické aspekty: silně korelované featury zpomalují kovergenci, protože dochází ke smyčkám (obě rysy spolu cyklicky zesilují a zespabují), antikorelované silné featury zase vedou k vysokým hodnotám vah a v praxi výpočet nekonverguje JL: Averaged perceptron? Častečně řeší výše uvedené problémy JL: accuracy porovnat s KNN, ať vidí, že se metody často porovnávají 13
Kapitola 4 Lineární regrese 14
Kapitola 5 Rozhodovací stromy TM: Co je to vyhledávací strom. Přirovnat k botanickému klíči? TM: Randomizovaný způsob konstrukce z dat. TM: Porovnání stromů. TM: Information gain. JL: Vysvětlit, co je kategoriální (, binární?) a numerický rys 15
Kapitola 6 Naivní Bayesův klasifikátor Současná umělá inteligence používá velice často teorii pravděpodobnosti k odhadu nejistoty rozhodnutí, které stroje provádí. Z teorie pravděpodobnosti vychází v minulém desetiletí velice populární grafické modely a využívají ji i v současnosti velmi rychle se rozvíjející neuronové sítě. V této kapitole si ukážeme jeden velice jednoduchý pravděpodobnostní model, který se používá ke klasifikaci, a k jehož vysvětlení stačí pouze středoškolská matematika. V klasickém středoškolském pojetí se pravděpodobnost používá k popisu událostí, které u kterých opředu odhadnout, jak dopadnou například protože takový výpočet byl nepředstavitelně složitý (například u hodu kostkou). Teorie pravděpodobnosti můžeme uplatnit i v případě počítání s nejistotou (EN: uncertainty), byť se v tomto případě jedná o kvalitativně jinou veličinu. Když říkáme, že je padesátiprocentní pravděpodobnost, že na minci padne orel, myslíme tím že když hodíme mnohokrát, padne orel přibližně v polovině případů. Když ale tvrdíme, že ledovec roztaje s padesátiprocentní pravděpodobností, nemyslíme tím, že kdybychom naklonovali tisíce zeměkoulí a nechali je se nezávisle vyvíjet za stejných podmínek, na polovině z nich by ledovec roztál a na druhé polovině nikoli. Výsledek byl vždy stejný. Pravděpodobnostní modely ve strojovém učení modelují právě tuto nejistotu na základě vstupních rysů a dostupných trénovacích dat. Model si může být jistý a zároveň se mýlit. Často se uvádí výzkum americké armády z počátku 90. let, jehož cílem bylo automatické rozlišování snímků spojeneckých a nepřátelských tanků 1. Jak takové fotky tanků vypadaly si můžete prohlédnout na obrázku 6.1. K rozpoznávání tehdy použili neuronovou síť a dosáhli úspěšnosti přes 90 % na nezávislé testovací sadě, kterou nepoužili při trénování. Rozhodnutí modelu vykazovala vždy velkou míru jistoty, systém přesto v praxi naprosto selhával. Později se ukázalo, že fotky nepřátelských tanků byly vyfoceny v den, kdy byla zatažená obloha, fotky spojeneckých, když bylo jasno. Neuronová síť potom využívala tuhle náhodnou pravidelnost v trénovacích datech, a když byla zatažená obloha, s jistotou odpověděla, že se jedná o nepřátelský tank. Model, který si představíme v této kapitole je podstatně jednodušší, než neuronová síť určená k rozpoznávání tanků. Dříve, než si vysvětlíme samotný model, zopakujeme některé základní pojmy z pravděpodobnosti a statistiky, které budeme potřebovat. 1 Kompletní technickou zprávu mohou zájemci nalézt zde: http://www.cs.colostate.edu/~vision/ publications/1994_fcarson_report.pdf 16
Obrázek 6.1: Ukázka trénovacích dat pro rozpoznávání tanků, zdroj: Technická zpráva Fort Carson 6.1 Podmíněná pravděpodobnost V pravděpodobnosti a statistice říkáme, že jevy A a B jsou nezávislé, když pro pravděpodobnost, že nastanou oba jevy zároveň (tzv. sdruženou pravděpodobnost) platí vztah: P(A, B) = P(A) P(B). (6.1) To se dá snadno ilustrovat například na hodu kostkou. Pravděpodobnost, že padne šestka je 1 1. Pravděpodobnost, že padne dvakrát za sebou je podle vzorce 6.1 rovna. To ověříme snadno kombinatoricky: je celkem 36 kombinací, které mohou padnout při hodu dvěma 6 36 kostkami, jediná z nich jsou dvě šestky, pravděpodobnost je tedy 1. 36 Další pojem, který je třeba připomenout je podmíněná pravděpodobnost (EN: conditional probabiity). Pravděpodobnost, že nastane jev A (třeba že na dvou hracích kostkách padne dohromady více než 7) za podmínky, že nastal jev B (třeba že na první hrací kostce už padlo 5) můžeme vyjádřit následujícím vzorcem: P(A B) = P(A, B) P(B), (6.2) kde P(A, B) je pravděpodobnost, že oba jevy nastávají zároveň. Pro náš jednoduchý příklad s hracími kostkami je jasné, že aby byl součet větší než 7, musí na druhé kostce padnout cokoli, kromě jedničky nebo dvojky. Pokud se jedná o férovou kostku, vidíme pravděpodobnost, že součet bude alespoň 7 je 2 = 1. 6 3 Pokud počítáme podle rovnice 6.2, dosadíme do čitatele pravděpodobnosti, že na první kostce padlo 5 a zároveň je součet větší než 7. To nastává tehdy, když na druhé padne alespoň 3. Jsou tedy 4 možnosti z celkově 36 kombinací, co může na kostkách padnout. Do jmenovatele dosadíme pravděpodobnost, že na první kostce padlo 5, to je 1. Po dosazení získáme stejnou 6 1 jako v případě přímočarého řešení. 3 Z této dvou definic můžeme odvodit Bayesovu větu. Definici zformulujeme pro podmíněnou pravděpodobnost P(B A) a rovnici vynásobíme jmenovatelem na pravé straně: P(A, B) = P(B A) P(A) Tento vztah potom dosadíme rovnou do definice 6.2, čímž dostáváme znění Bayesovy věty: P(A B) = P(B A) P(A) P(B) 17 (6.3)
Zatím jsme o pravděpodobnosti jako o nástroji pro popis něčeho, co se chová nepředvidatelně a co lze mnohokrát opakovat. Nyní si ukážeme jednoduchý příklad, kdy můžeme použít Bayesovu věty pro odhad nejistoty. Častým příkladem, na kterém se vysvětlují různé pravděpodobnostní modely, je tahání kuliček z různých nádob (přinejmenším už od 19. století). Nedává moc praktický smysl něco takového počítat. Úvaha, kterou na tomto příkladu provedeme, se nám ale bude hodit později. Mějme dvě krabičky a v každé deset barevných kuliček. V krabičce a je 6 modrých a 4 zelené kuličky, v krabičce b je jedna modrá 9 zelených. Vybereme jednu z krabiček náhodně a vytáhneme jednu kuličku. Dokud nevíme, jakou má kulička barvu, nemáme žádný důvod preferovat některou z krabiček. Jakmile zjistíme, že kulička má zelenou barvu, začne nám být jasné, že je pravděpodobnější, že pochází z krabičky b. Míru naší jistoty můžeme odhadnout pomocí Bayesovy věty. Zajímá nás pravděpodobnost, že jsme vybrali krabičku b, za podmínky, že kulička je zelená: P(b z) = P(z b)p(b). P(z) Pravděpodobnost, že z krabičky b vytáhneme zelenou kuličku (P(z b)), je 9 ; pravděpodobnost, že zvolíme krabičku b je 1. Zbývá nám odhadnout jmenovatele tedy pravděpodobnost, 10 2 že bude vytažena zelená kulička. Zajímá nás, jaká je pravděpodobnost, že byla tažena zelená kulička, jedno z jaké krabičky. Protože kuličku nelze vytáhnout napůl z jedné a napůl z druhé krabičky, jedná se o logickou disjunkci a můžeme pravděpodobnost vyjádřit jako součet pravděpodobnosti událostí, že byla zelená kulička tažena z každé krabičky: P(z) = P(z, a) + P(z, b) Sdružené pravděpodobnosti P(z, a) a P(z, b) stále neznáme, ale můžeme je opět rozepsat podle definice podmíněné pravděpodobnosti. Dostáváme P(z) = P(z a)p(a) + P(z b)p(b) = 4 10 1 2 + 9 10 1 2 = 13 10 1 2 Po dosazení dostaneme pravděpodobnost toho, že kulička pocházela z krabičky b rovnu 9 70 %. To je v souladu s úvahou selským rozumem, že když je kulička zelená, nejspíš 13 pochází z krabičky b, když je jich tam více. V toto příkladě získaná pravděpodobnost není odhad četnosti při opakování experimentu do nekonečna. Událost vytažení kuličky se jednou pro vždy odehrála. Jediné, co můžeme počítat, jak moc jsme si jisti, že byla vytažena z jedné nebo druhé krabičky. 6.2 Model Když klasifikaci používáme pravděpodobností modely, odhadujeme pravděpodobnost (jistotu) P(y x), tedy pravděpodobnost přiřazení značky y, je-li dán vektor rysů x. V základní verzi, kterou si ukážeme pracuje Naivní Bayes pouze s kategoriálními proměnnými. Pravděpodobnost klasifikace si rozepíšeme pomocí Bayesovy věty: P(y x) = P(x y)p(y). (6.4) Px 18
rys možné hodnoty věk 10 19, 20 29, 30 39, 40 49,, 90-99 menopauza předmenstruační věk, věk do 40 let, věk nad 40 let velikost primárního nádoru 0 4 mm, 5 9 mm, 10 14 mm,, 55 59 mm počet mízních uzlin s nádorovými buňkami 0-2, 3-5, 6-8, 9-11, 12-14,, 36 39 ložisko zapouzdřeno ano, ne stupeň maligity 1, 2, 3 prs levý, pravý kvadrant umístění nádoru levý horní, levý spodní, pravý horní, pravý dolní, střední ozařování ano, ne Výraz ve jmenovateli nezávisí na značce y. Protože chceme klasifikovat, nemusí nás zajímat konkrétní odhad nejistoty, zajímá nás pouze, jaká značka má nejvyšší pravděpodobnost nejvyšší hodnotu čitatele. Pokud by nás zajímal i jmenovatel, můžeme ho spočítat obdobně jako v našem příkladu s krabičkami. Naše odhadnutá klasifikace ŷ je taková značka y, pro kterou je hodnota čitatele nejvyšší. Formálně píšeme ŷ = argmax P(x y)p(y). (6.5) y Zápis argmax y f(y) zde znamená y, pro nějž je hodnota výrazu f(y) nejvyšší. Odhadování pravděpodobností v předchozí rovnici si vysvětlíme na příkladu další úlohy, která bývá uváděna v literatuře o strojovém učení. Úlohou je odhadování možnosti recidivy karcinomu prsu. K této úloze jsou k dispozici anonymizované informace o 277 pacientkách z roku 1988. Rysy, které budeme používat k rozhodnutí jsou uvedeny v tabulce??. Sada rysů i počet pacientek jsou velmi omezené. Každého určitě napadne, že existují i další faktory, které hrají roli například genetická zátěž, zda kouří, míra stresu, které je vystavena atd. Navíc data byla sbírána v 80. letech v Lublani. Lze tedy očekávat, že skupina pacientek byla etnicky homogenní a v socialistické se Jugoslávii bez velkých ekonomických rozdílů, se pacientky se příliš nelišily svým životním stylem. Model tyto informace nemá k dispozici a rozhoduje vždy stejně. Pravděpodobnost P(y) v rovnici?? je pravděpodobnosti že dojde k recidivě nádoru bez ohledu na to, jaké hodnoty jsme u pacientky naměřili. Tuto pravděpodobnost můžeme jednoduše odhadnout jako poměr pacientek, u kterých došlo k recidivě ku celkovému počtu pacientek. Stejně spočítáme nepodmíněnou pravděpodobnost, že k recidivě nedojde. Situace je komplikovanější při odhadu pravděpodobnosti P(x y) tedy pravděpodobnosti naměřených hodnot pacientky za předpokladu (za podmínky), že dojde k recidivě nádoru. Triviální způsob, jak pravděpodobnost odhadnout, by bylo spočítat, jak často byly mezi pacientkami ty, které vykazovaly přesně tuto kombinaci rysů. Možných kombinací rysů je ale obvykle řádově více, než mám k dispozici trénovacích datech žádná pacientka s naprosto 19
stejnou kombinací rysů nevyskytuje. To je problém, který musí řešit všechny klasifikační algoritmy, které jsem si představili. Metoda nejbližších sousedů (kapitola??) řeší tento problém hledáním podobných instancí. Perceptronový algoritmus (kapitola??) problém jej obchází tak, že vůbec neuvažuje o společném výskytu rysů a jednotlivým rysům přiřazuje různé váhy. Obdobný přístup volí i naivní bayesovský klasifikátor, který předpokládá takzvanou podmíněnou nezávislost (EN: conditional independence) rysů. Tedy, je-li už dána značka, předpokládáme, že pravděpodobnosti jednotlivých rysů jsou vzájemně nezávislé. Podle definice statistické nezávislosti (rovnice 6.1), rozepíšeme podmíněnou pravděpodobnost takto: P(x y) = P(x 1,..., x n y) P(x 1 y) P(x n y). Předpoklad podmíněné pravděpodobnosti je pochopitelně značně zjednodušující. Rysy, které spolu systematicky souvisí, přináší modelu částečně tu samou informaci. Protože ale předpokládáme vzájemnou nezávislost rysů, je tato informace ve skutečnosti započítána víckrát a zkresluje rozhodnutí modelu. V tomto případě mohou být takovými rysy věk pacientky a informace o tom, zda prošla menopazou, které spolu souvisí. Podmíněnou pravděpodobnost pro i-tý P(x i y) odhadneme už jednoduše pomocí četnosti výskytu rysu v trénovacích datech. Je-li tímto rysem například věk ženy, vezmeme zvlášť ty, u kterých došlo k recidivě nádoru (y = +) a ty, kde nikoli (y = 0) a v rámci těchto kategorií (za těchto podmínek) spočítáme pravděpodobnost pro jednotlivé věkové kategorie. Pro každou věkovou kategorii a odhadneme P(x 0 = a y = 0) = c(x 0 = a y = 0) c(y = 0) a stejně pro y = 1, kde funkcí c se myslí počet trénovacích příkladů, splňující podmínku uvedenou jako argument funkce. Učení modelu spočívá ve spočítání četností, které potřebujeme pro výpočet pravděpodobností. Kód může vypadat například takto. 1 class NaiveBayes( object): 2 def init ( self, training_data): 3 self. feature_count = len( training_data [0][0]) 4 self. data_size = len( training_data) 5 # Tabulka s pocty instanci v jednotlivych tridach 6 self. labels_counts = {} 7 # Tabulka s hodnotami rysu v jednotlivych tridach 8 self. cond_feature_counts = {} 9 10 for feature_vector, label in training_data: 11 # Pokud jsme label, jeste nevideli, zalozime ji polozku v obou 12 # dvou tabulkach 13 if label not in labels_counts: 14 # Znacku jsme jeste nevideli ani jednou 15 self. labels_counts[ label] = 0 16 # Pripravime zvlastni tabulku pro kazdy r y s 17 self. cond_feature_counts[ label] = [{}] * feature_count 18 19 self. labels_counts[ label] += 1 20
20 for i in range( self. feature_count): 21 feature_value = feature_vector[i] 22 if feature_value not in self. cond_feature_counts[ label][ i]: 23 self. cond_feature_counts[ label][ i][ feature_value] = 1 24 else 25 self. cond_feature_counts[ label][ i][ feature_value] += 1 Model implementujeme v Pythonu jako třídu. Při inicializaci objektu se spočítají parametry modelu, které později využívají při klasifikaci. Metoda, která provádí samotnou klasifikaci se dá naprogramovat takto. 1 def classify( self, instance): 2 # Pro zajisteni numericke stability si rozepiseme nasobeni 3 # pravdepodobnosti jako nejprve nasobeni vsech citatelu a potom deleni vsemi 4 # jmenovateli 5 best_score = 0 6 best_label = None 7 8 # Projdu vsechny mozne labely a pro kazdy spocitam skore 9 for label in self. labels_counts: 10 label_count = self. labels_counts[ label] 11 count_product = np. prod( 12 [ self. cond_feature_counts[ label][ i]. get( feature_value, default =0.0) 13 for i, feature_value in enumerate( instance) ]) 14 score = count_product / 15 labels_counts ** ( self. feature_count - 1.0) / self. data_size 16 if score > best_score: 17 best_score = score 18 best_label = label 19 20 return best_label JL: Výsledky klasifikátoru a porovnat s jinými: decision tree, knn Hamming 6.3 Cvičení JL: Tabulka: heatmapa četnosti jednotlivých rysů V trénovacích datech jsou kombinace rysy, které nejsou zastoupené vedou k odhadu nulové pravděpodobnosti v obou případech... zkuste transformovat množinu rysů tak, aby tyto případy zmizely. Dokážete takto zvýšit správnost klasifikace? V tabulce?? uvádíme výsledek učení perceptronovým algoritmem. Jakým způsobem je potřeba transformovat rysy, aby bylo možné perceptron použít? Shrnutí Pravděpodobnostní model Bayesova věta 21
Kapitola 7 Klastrování k-means 22
Kapitola 8 Další TM: strukturní predikce? 23