Osztályozás gépi tanulással

A leggyakoribb gépi tanulási feladat az osztályozás (classification). Itt előre adott egy kategória-/osztályhalmaz és a célunk, hogy felügylet gépi tanulási megközelítésben olyan modellt/döntési szabályokat tanuljunk a tanító adatbázis alapján, ami képes egy ismeretlen példát minél pontosabban valamelyik osztályba (class) sorolni (úgy is mondjuk, hogy 'címkézni' (labeling)).
Osztályozási feladat például a jól ismert macska vs. kutya feladat, ahol képeket kell a {macska, kutya} két osztály valamelyikébe besorolni.

Tanuljuk meg a kutya és macska képeket elkülöníteni egymástól! Képosztályozási feladat.
Egy másik jól ismert feladat, amikor egy szocial média posztot szöveges tartalmát kell érzelmi töltet szerint a {pozitív, semleges, negatív} osztályok valamelyikébe vagy téma szerint (több alkalmazás-specifikus osztály) besorolni.
Szövegosztályozási alkalmazásokról részletesebben.
Az osztályozási feladatokon belül, megkülönbözetjük azt az esetet, amikor két célosztályunk van (binary classification) attól amikor több célosztályunk van (multi-class classification). A több osztályos eset visszavezethető kétosztályos esetre és a kétosztályos esetet könnyebb megérteni.

Felügyelt gépi tanulási módszerek kiértékelési módszertana

Tegyük fel, hogy osztályozási problémára, tanító adatbázis alapján, építettünk egy modellt (legyen az akár egy egyszerű baseline megoldás vagy egy szofisztikált gépi tanult megoldás). Hogyan tudjuk a modell teljesítményét/pontosságát számszerűen/objektíven megmérni, azaz kiértékelni ezt a modellt?
Első gondoltunk lehet az, hogy a tanító adatbázis minden egyedére megnézzük, hogy a modell predikciója megegyezzik-e a helyes (gold-standard) osztálycímkével és mondjuk a helyes válaszok aránya lesz a kiértékelési metrika. Jó ez a módszertan!?
Nem helyes ez a módszertan! Emlékezzünk vissza a felügyelt gépi tanulás definíciójára! A célunk, hogy a tanító adatbázis alapján olyan modellt tanuljunk, ami utána korábban nem látott egyedeken is pontos döntést hoz (pl. osztályba sorol). A tanító adatbázison kiértékeléssel nem azt mérjük, hogy korábban nem látott egyedeken hogyan teljesít a modell! Az a modell ami "bemagoljuk" a tanító adatbázist, az esetek többségében helyes predikciót csinál a tanító példákon, DE ha nincs általánosítási készsége, akkor a tanító adatbázison kívüli elemeken nagyon pontatlan lesz. Annak érdekében, hogy a modell pontosságát korábban nem látott/ismeretlen egyedeken tudjuk kiértékelni a rendelkezésre álló címkézett adatbázist véletlenszerűen két részre, ún. tanító- és kiértékelő adatbázisok (train ill. evaluation/test set) ra bontjuk. A tanulás során csak a tanító adatbázist láthatja/használatjuk, ezzel szimuláljuk, hogy a kiértékelő adatbázis egyedei ismeretlenek/korábban nem látottak (leave-out vagy hold-out dataset), hiszen azokat nem használtuk a tanítás során.

Felügyelt tanulás esetén a tanító adatbázis alapján építünk modellt, amit utána az elkülönített kiértékelő adatbázis egyedein értékelünk ki.
A kiértékelés megbízhatósága nagyban függ a kiértékelő adathalmaz méretétől. Ha viszonylag kis címkézett adatbázis áll rendelkezésre (kiértékelő részhalmaz nem éri el a néhány ezret) akkor a kiértékelési metrika nagyban függ attól, hogy milyen egyedeket választottunk véletlenszerűen a tanító- és kiértékelő adatbázisokba. Ilyen esetben többször megismételjük a véletlenszerű tanító/kiértékelő halmaz vágást, tanítjuk a modellt a tanító halmazon, majd kiértékeljük a kiértékelő részhalmazon. Végül a különböző futások eredményeként kapott kiértékelési metrikáit egyetlen számmá aggregáljuk.
A legismertebb többször megismételt tanító/kiértékelő halmaz vágási módszertan az ún. \(k\)-szoros keresztvalidáció (\(k\)-fold cross validation). Itt a rendelkezésre álló címkézett adatbázist \(k\) egyenlő méretű részre bontjuk majd \(k\) darab kísérletet futtatunk le. Minden kísérletben az egyik részhalmazt használjuk kiértékelő adatbázisnak és a többi \(k-1\) részhalmaz egyedeit használjuk tanító adatbázisnak.
4-szeres keresztvalidáció esetén 4 független tanulási+kiértékelési kísérletet futtatunk, ahol a sötétzöld részeket használjuk tanító adatbázisnak és a világoszöldet kiértékelő halmaznak.
Ennek eredményeként minden egyed pontosan egyszer tölti be a kiértékelő egyed szerepét, azaz a teljes adathalmazt kihasználtuk kiértékelésre. De mindeközben biztosítottuk, hogy tanítás során nem használtuk fel azokat az egyedeket, akiken később tanult modellt kiértékeljük.

Osztályozási feladat kiértékelési metrikái

Tegyük fel, hogy egy osztályozási feladat kiértékelő adatbázisának minden \(n\) db egyedére adott a helyes/elvárt osztálycímke és egy modell által az egyedre predikált osztálycímke. A legegyszerűbb metrika a találati arány (accuracy) - röviden \(acc\) -, amivel osztályozó modellek teljesítményét jellemezhetjük: \[ acc = \frac{helyes}{n} \]

Ha jobban meg szeretnénk érteni az egyes osztályokon elért teljesítményt akkor érdemes különböző eseteket megkülönböztetni. tegyük fel, hogy két osztályunk van {pozitív +, negatív -}. Legyen

  • Igaz pozitív (IP, true positive), amely a modell által helyesen prediktált pozitív esetek számának felel meg.
  • Hamis negatív (HN, false negative), amely azon pozitív esetek számának felel meg, amelyeket a modell tévesen negatívként predikál.
  • Hamis pozitív (HP, false positive), amely azon negatív esetek számának felel meg, amelyeket a modell tévesen pozitívként predikál.
  • Igaz negatív (IN, true negative), amely az osztályozási modell által helyesen prediktált negatív esetek számának felel meg.
Ezeket a gyakoriságokat tartalmazza az ún. tévesztési mátrix (confusion matrix).
Tévesztési mátrix.
Ezekkel a gyakoriságokkal kifejezve: \[ acc = \frac{IP+IN}{n} , n=IP+IN+HP+HN \]

Egy konkrét P osztályon elért teljesítményt mérhetjük:

  • pontosság (precision): P osztály pontossága azt fejezi ki, hogy amikor a rendszer P osztálycímkét predikált, akkor hány százalékban volt igaza. \[ pontosság(P) = \frac{IP}{IP+HP} \]
  • fedés (recall): P osztály fedése azt fejezi ki, hogy az adatbázisban szereplő elvárt P-ek közül hányat talált meg/fedett le a rendszer. \[ fedés(P) = \frac{IP}{IP+HN} \]
  • Az \(F_1\)-mérték a pontosság és fedés harmónikus közepe. Segít ha egyetlen számmal szeretnénk egy osztályon elért teljesítményt leírni. \[ F_1(P) = \frac{2 * pontosság(P) * fedés(P)}{pontosság(P) + fedés(P)} \]
Vegyük észre, hogy a pontásságot és a fedést együtt kell vizsgálnunk, önmagában egyik metrika sem értelmes. Például ha csak a fedést használnánk célfüggvénynek, akkor az a buta predikció, hogy minden egyedre P osztályt mondjuk 100%-os eredményt érne el.
Ha több, mint két osztályunk van, akkor is minden osztályra külön-külön számolhatjuk a pontosság és fedés értékeket, ebben az esetben az összes többi osztály uniója lesz a negatív osztálycímke.

A megfelelő kiértékelési metrika kulcsfontosságú egy gépi tanulási alkalmazás fejlesztésénél! Gondoljunk csak bele, ha olyan képosztályozót fejlesztünk, ami röntgen képek alapján próbálja megmondani, hogy adott betegségben szenved-e a páciens (bináris osztályozási feladat), akkor nem mindegy az elvárt rendszer a betegség osztály pontosságát (akire betegséget predikálunk az tényleg legyen az) vagy fedését (ne veszítsünk el beteg eseteket, nem baj ha tévesen betegnek predikáltak száma nagyobb) tekinti fontosabb szempontnak.

Ellenörző kérdések

  1. Mi köze van a macskáknak a binaritáshoz?
  2. Miért nem szabad a tanító adatbázison kiértékelni egy osztályozó modellt?

További ajánlott irodalom