Következő képzések

Data Science

Hogyan kerüljük el a túltanulást?

A cikkben a következő témákat fogom érinteni:

1.      Milyen módszereink vannak (prediktív) modellek teljesítményének javítására?

2.      Python-ban milyen hiperparaméter kereső eljárások vannak?

3.      Mi a túltanulás és hogyan tudjuk ezt elkerülni?

(A cikkben innentől kizárólag felügyelt tanító algoritmusokról lesz szó, a modellek teljesítményének mérésére az AUC értéket fogom használni.)

 

1.        Milyen módszereink vannak (prediktív) modellek teljesítményének javítására?

A felügyelt tanító algoritmusoknál az adatbázis két részre osztható: a célváltozóra és a bemenő, input változókra. A modellezés célja, hogy az input változók között olyan mintákat találjunk, amik alapján nagy pontossággal becslést lehet adni a célváltozó értékére. A modell pontosság mérésére több metrika van, ezek közül az AUC érték az egyik leggyakrabban alkalmazott mérőszám. A modellezés célja, hogy modellünk AUC értéke minél nagyobb legyen. Aki készített ilyen modelleket az tudja, hogy a modellezés több fázisra bontható:

–         első szakaszban az első modell előállítása cél – ehhez rengeteg adatfeldolgozás és alapelemzés szükséges

–         a következő szakaszban különböző módszerekkel ezt a modellt próbáljuk javítani,

–         majd eljön az a pillanat, amikor már nem tudunk tovább javítani.

Milyen modell javító eszközeink vannak?

a)      új input változók előállítása: tegyük fel, hogy van „a” és „b” változónk, amiket már eddig is használtunk a modellezésnél. Sok esetben ezen input változók matematikai kombinációjából előálló új változók segítségével jobb modellek előállíthatók elő. Egy klasszikus példa: az egyik változónk a hitel kérelmezőjének jövedelme, a másik változónk kérelmező háztartásának mérete (hány fős). Ha ezt a két változót elosztjuk egymással, megkapjuk a háztartás egy főre eső jövedelmét, ami sokszor erősebb input változó egy kockázati modell elkészítésénél, mint az eredeti két változó.

b)     minél „jobb” algoritmus kiválasztása: amikor modellezünk számos felügyelt tanító algoritmus közül választhatunk. Ami fontos: nincs legjobb algoritmus! Legtöbbször az adatbázis karakterisztikája dönti el, melyik algoritmust érdemes választani. Ehhez érdemes ún. feature importance vizsgálatokat elvégezni.

No alt text provided for this image
Matplotlib bar függvénnyel készült

A fenti diagram három különböző algoritmus (logreg, döntési fa, GBM) „feature importance” vizsgálatának eredményét mutatja. Mindegyik modell ugyanazon adatbázison lett tanítva, mégis a modelleknél a változók fontossági sorrendje teljesen eltérő.

Tanács: ennél a pontnál érdemes egyeztetni az adott terület szakértőjével!

Tapasztalatom szerint a szakértők ilyenkor nagyon kíváncsiak. Kíváncsiak arra, hogy az évek során megszerzett szakértői tudásuk mennyire cseng össze az elemzési eredményekkel. A szakértő ilyenkor rengeteg történetet oszt meg velünk különböző esetekről, ügyfelekről – azaz ilyenkor olyan információkhoz jutunk, ami az ADATOKBAN NINCS MEG! Ezen új információk egyben hasznosak a „legjobb” modellező algoritmus kiválasztásában. A modell teljesítménye mellett ugyanis szempont kell hogy legyen az is, hogy olyan modelleket építsünk, ami összhangban van a szakértő által felvázolt „valósággal”.

Ha már nem tudunk új változókat létrehozni és az is megvan, hogy milyen algoritmusokkal akarunk tanítani, akkor kerül sor harmadik lépésre. Arra a lépésre, ahol talán legtöbb múlik azon, hogyan fog teljesíteni a végső modell.   

c.)    modell paraméterezés: ez különösen azóta erős eszköz, mióta az adatelemzők körében elterjedtek különböző programozási nyelvek (R/Python/…). Ennek oka, hogy a programozási nyelvekben lévő ciklusok segítségével rengeteg különböző paraméterezést próbálhatunk ki a modell tanításnál. A döntési fák esetében ilyen futó paraméter lehet a fa mélysége vagy a minimális levélszám, véletlen erdő (random forest) vagy GBM algoritmusoknál további paraméter lehet az fák száma vagy learning rate.   

2.      Python-ban milyen hiperparaméter kereső eljárások vannak?

Mivel az adatelemzési projektekben felértékelődött a modell paraméterezés jelentősége, így nem meglepő módon már léteznek beépített függvények annak ígéretével, hogy megtalálják a „legjobb paraméterezést”. Nézzük a Python-ban milyen lehetőségek vannak erre? (teljesség igénye nélkül)

·        Scikit-learn csomagban randomsearchcv és gridsearchcv függvények

·        Hyperopt az egyik legnépszerűbb tuning csomag. Jelenleg több algoritmus is elérhető benne, így random search, TPE és adaptive TPE.

·        BayesianOptimization, ami proxy optimalizációs problémaként keresi a legjobb paraméterzést.

Ami közös ezekben, hogy az algoritmusoknak meg kell adni azokat a paramétereket, amiket optimalizálni akarunk (sőt van, ahol az optimális algoritmusra is javaslatot tesz). Meg kell adni a tanító adatbázist és a célváltozót, illetve a kiértékelési metódust. A lényeg, hogy a futtatás végén ezek az algoritmusok kiszámolják azt a modell paraméterezést, ahol (szerinte) legjobban teljesít a modell.

Azonban van egy kis probléma ezekkel az algoritmusokkal. Az optimumot a megadott tanító adatbázison keresik és találják meg. De vajon ez miért probléma? Ahhoz hogy megértsük, tisztában kell lennünk egy fogalommal: mi a túltanulás?

3.      Mi a túltanulás és hogyan lehet elkerülni?

Ha valaki elkezd felügyelt tanító algoritmusokkal foglalkozni, akkor az egyik első szabály, amit megtanítanak neki, hogy az adatbázist (legalább) két részre kell osztani:

–         tanító adatbázis: ahol a modelleket tanítjuk

–         teszt adatbázis: ahol az elkészült modellek teljesítményét értékeljük ki.

Ez egy nagyon fontos lépés az adat modellezés világában. Amikor a tanító adatbázison tanítjuk az algoritmusokat, akkor gyakorlatilag nem történik más, mint mintakeresés. Az algoritmusok olyan mintákat keresnek az input változók között, amelyek segítségével minél jobban megjósolható a célváltozó értéke. A probléma az, hogy ezek az algoritmusok olyan mintákat is találhatnak, amik a tanító adatbázisban jól működnek – DE CSAK OTT! Gyakorlatilag ezt hívjuk túltanulásnak – azaz amikor a modellünk a tanítóadatbázison túli valódi világban nem működik olyan jól, mint a tanítóadatbázison.

A teszt adatbázis célja éppen ilyen túltanítás kiszűrése. Akkor fogadunk el egy modellt, ha a teszt adatbázison a modell teljesítménye megegyezik a tanító adatbázison mért teljesítménnyel. Amikor a „legjobb” modellt keressük, akkor ezt precízen így kell megfogalmazni:

azt a modell paraméterezést keressük, ami úgy adja a legjobb teljesítményt a tanító adatbázison, hogy a teszt adatbázison is reprodukálható ugyanez a teljesítmény .

Az alábbi diagram szemléletesen mutatja be miről is van szó!

No alt text provided for this image
A diagram plotnine csomag segítségével készült

A diagram egy viszonylag kevésbé ismert ábrázolása a modelleknek. A fenti grafikont a következő módon tudjuk elkészíteni:

–         első lépésben több modellt készítünk különböző paraméterezés mellett (jelen esetben majdnem 150 különböző paraméterezésű modell készült)

–         a modelleket sorbarendezzük az alapján hogyan teljesítettek a tanító adatbázison

–         majd rajzoljuk fel a modelleket a fenti módon: x tengely a modellek sorszámát tartalmazza, y tengelyen a vonaldiagram a modellek tanító adatbázison mért teljesítményét (sorbarendezés miatt ez szükségszerűen monoton), pontok pedig ugyanezen modellek teszt adtabázison mért teljesítményét méri.

 

Emlékezzünk! Egy modellel szemben alapvető elvárás, hogy a teszt adatokon ugyanazt a teljesítményt (vagy majdnem ugyanazt a teljesítményt) hozza, mint a tanító adatokon. A fenti diagramban ilyenkor a vonaldiagramra esik a modellhez tartozó pont is. A lista elején olyan modellek vannak, amik teljesítik ezt az elvárást – a kék tartományban a tanító és teszt adatokon a modellek nagyjából azonos módon teljesítenek. Ezek azonban nem az általunk keresett optimális modellek, mert vannak náluk jobbak! Éppen ezért „underfitting” tartománynak szokás nevezni az ide eső modelleket. Amit keresünk az az ún. „sweet spot” (zöld tartomány). Még ezek a modellek is teljesítik a kritériumot (azaz teszt és tanító között nincs érdemi különbség teljesítményben), viszont ezután már olyan modellek következnek, ahol egyre nagyobb túltanulás figyelhető meg. A narancs tartományban olyan modellek vannak, ahol a tanító adatbázison a modellek teljesítmény magasabb, mint a teszt adatbázison – és ahogy haladunk jobbra az olló kezd szétnyílni.

Az alábbi diagram a modellezés helyes irányát mutatja be:

No alt text provided for this image
A diagram plotnine csomag segítségével készült

A fenti diagram az előző diagramon lévő modelleket ábrázolja, de itt az x tengely a modellek tanító adatbázisán mért teljesítményét mutatja, míg az y tengely a teszt adaton mért teljesítményét. A kék és zöld modellek értelemszerűen az x = y vonal közelében helyezkednek el, míg a túltanított modellek ettől lényegesen távolabb.

Sok elemző miért eshet a túltanulás csapdájába?

Egyrészt azért, mert csak a tanító adatbázisra fókuszál. Vegyük észre, hogy a túltanított modellek jobban teljesítenek a tanító adatokon, mint a „sweet spot” (a jelenleg optimálisnak tartott) modellek. DE a cél nem az, hogy egyre jobb modelleket építsünk a tanító adatbázison, hanem ahogy a fenti ábra is mutatja az, hogy a zöld nyíl irányába egyre tovább jussunk („Right way”) .

Jelen esetben a zöld tartományban a legjobb modell AUC értéke mind a tanító és teszt adatbázison is 0.75 körül van. Akkor találunk jobb modellt, ha az új modell ennél jobb értéket ad MINDKÉT adatbázison. Sajnos az elemzők hajlamosak csak a tanító adatbázisra fókuszálni, illetve van még egy téveszme – ami igazából a szakirodalomban sincs kitárgyalva.

Hogy megértsük mire gondolok, nézzük a következő táblázatot és az olvasó döntse el, melyik a jobb modell?

No alt text provided for this image
Melyik a jobb?

Az első modell 0.75-öt hoz mindkét adatbázison, míg a második modell a tanító adatbázison 0.81-et, míg a teszt adatokon 0.76-ot. Sokat kerestem, de nem igazán találtam útmutatót arra, hogy melyik a jobb modell? Mert az igaz, hogy a Modell2 mindkét adatbázison jobban teljesít, de egyértelműen túltanított modell, míg az első modell teljesítménye gyengébb, de jól láthatóan stabil.

Ha engem kérdez az olvasó, hogy melyik választanám, akkor csak a személyes tapasztalataimra tudok hagyatkozni. Ez alapján az első modellre szavazok.

Tudatosan nem használtam azt a kifejezést, hogy melyik a „jobb” modell. Egyszerűen azért, mert a fenti számok alapján nem tudom, hogy melyik az! Azért nem tudom, mert nem tudom mennyi a Modell2 tényleges teljesítménye! Ha így tenném fel a kérdést az olvasónak, hogy melyik modellt választaná: „amelyiknek tudja a teljesítményét vagy amelyiknek nem?”, akkor nem lehet kérdés, hogy az elsőt választaná.

(Ezért szavazok én is az első modellre)

A 2.-ik pontban ismertetettem néhány eljárást az optimális hiperparaméterező eljárásra. Bónusz kérdés: Vajon ezen eljárások eredményei, azaz az általuk optimálisnak tekintett modellek melyik tartományba esnek? Underfitting? Sweet spot? Új sweet spot? Overfitting?

Két algoritmust teszteltem:

–         GridSearchCV() függvény (sklearn csomag)

–         fmin() függvény a (hyperopt csomag)

Mindkét függvény eredményül ad egy „optimális paraméterezést”, és ehhez tartozó optimális modellt. Az alábbi grafikon ezek eredményeit mutatja:

No alt text provided for this image
Diagram Excel-ben készült

A „Sweet spot” modell azzal a módszerrel készült, amit korábban bemutattam. Itt a legjobb modell (0.757, 0.757) teljesítményt adott. Mind a GridSearchCV, mind az fmin() esetében láthatóak túltanulás jelei, utóbbi esetben ráadásul jelentős túltanulás. Ez alapján az előző pontban ismertetett esethez jutottunk. A két új modell mindkét adatbázison jobb, mint a már megtalált sweet spot modell, de túltanítottak – így nem lehet egyértelműen kijelenteni, hogy jobbak a már meglévőnél!

A tanulság természetesen nem az, hogy ne használjunk hiperparaméter kereső eljárásokat. Inkább az, hogy ezen eljárások eredményeit fontos a fenti módon kielemezni. Ha túltanulás jeleit mutatják, akkor óvatosnak kell lennünk ezen modellekkel.

Zárás.

Cikkemben arra kerestem a választ, hogyan lehet elkerülni a túltanulást. Sajnos nincsenek egyértelmű szabályok, de azért van néhány módszer, ami segíthet:

–         érdemes először hagyományos módszerekkel modelleket építeni, és ez alapján megtalálni a kiinduló „sweet spot”-ot.

–         az újabb és újabb modelleknél tartsuk a helyes irányt („right way”) – azaz csak azokat a modelleket fogadjuk el, amik a tanító és teszt adatbázison egyformán teljesítenek

–         használjunk hiperparaméter kereső eljárásokat – de az eredményeket ugyanúgy értékeljük ki, mint a korábbi modelleket. Ha a túltanítás jeleit mutatja – vessük el!

 

Cikkem írásakor a következő csomagokat használtam: pandas, numpy, matplotlib, plotnine, sklearn, lightgbm, hyperopt. Akit mélyebben érdekelnek a cikkben említette szakmai kihívások, azok számára javaslom az „Overfitting”, „Feature selection” és a „Hiperparaméterezés” kurzusaimat. 

 

(Szerző Data Literay coach és a Láncrekació podcast alapító tagja)