Becsüljünk mágneses kölcsönhatást

Részt vettem egy Kaggle versenyen

Elég régen nem írtam erre a blogra, pedig lett volna miről. Viszont most olyan témám van, amiről mindenképpen érdemes írni. Mesterséges intelligenciával kezdtem foglalkozni, és beleszerettem. Ennek egyik eredménye, hogy részt vettem egy Kaggle versenyen.

Mi az a Kaggle?

A kaggle egy közösségi oldal ahol a gépi tanulás és mesterséges intelligencia iránt érdeklődők tudják tartani a kapcsolatot. Vannak ugyan általános beszélgetések is, de az egész portál valójában adathalmazok köré, illetve versenyek köré szerveződik.

Nagyon-nagyon leegyszerűsítve egy ilyen verseny úgy néz ki, hogy kapunk két adathalmazt, a tanító és a teszt adathalmazt. Mindkét halmazra egy hatalmas táblázatként kell gondolni rengeteg sorral és oszloppal (mondom, leegyszerűsítve). A tanító és a teszt adathalmaz ugyanazokkal az oszlopokkal rendelkezik (X0, X1, … , Xn). A tanító halmazban ezen felül van egy extra oszlop (Y), ez az adat amiről a verseny szól. A teszt adatokból hiányzik ez az oszlop, ezt kell tudni minél pontosabban megbecsülni a tanító adatok alapján. A verseny kiíróinak rendelkezésére áll a teszt halmazon is az Y adat, így amikor beküldesz egy megoldást (becslés a teszt halmaz Y értékére) akkor azonnal kapsz egy hiba pontszámot a becslésedre. Minél kisebb a hiba, annál jobb vagy, annál előrébb kerülsz a ranglétrán.

Egy tipikus példa szokott lenni, ingatlan árának a becslése. Itt az X oszlopok az ingatlan adatai (hány négyzetméter, hány szintes, mikor épült, mikor volt felújítva, milyen a fűtése, stb…) az az Y oszlop hogy mennyibe kerül az ingatlan. Korábbi eladásokból lehet becsülni eladási árat új ingatlan hirdetésekre.

Egy másik klasszikus példa, ahol a bemeneti adatok valójában képek, itt a képen egy pixel egy oszlop (X) a pixel színe pedig az oszlopban az érték. Az Y kimenet pedig annyi, hogy cica vagy kutyus van a képen.

Az ingatlanos példa egy regresszió, mert egy számot kell becsülni, a képfelismeréses példára pedig bináris klasszifikáció. Klasszifikáció, mert csoportokat kell képezni, és bináris, mert két halmaz van, kutya és macska.

Becsüljünk atomok közötti mágneses kölcsönhatást

Sok verseny fut egyszerre a Kaggle-ön, én szándékosan olyat választottam, ahol semmilyen domain tudásom nincsen, azaz semmilyen információt nem tudok hozzátenni az X és az Y adatok közötti kapcsolathoz.

Ilyen volt a Champs Scalar Coupling verseny. Léteznek ugye a molekulák, azon belül meg vannak az atomok, a molekulán belüli atomok között pedig mágneses kölcsönhatás van. Ez egy nagyon fontos adat a kémiával (gyógyszeripar, építő ipar, stb…) foglalkozó kutatók számára. Ma már rendelkezésre áll a tudásunk, hogy ezt a mágneses kölcsönhatást pontosan kiszámoljuk, de egy ilyen számítás hetekig is eltarthat egy db. molekulára. A verseny célja volt, hogy a molekula struktúrájából (a molekulában lévő atomok és elhelyezkedésük) becslést kellett adni a mágneses kölcsönhatás mértékére.

Júniustól augusztusig tartott a verseny, a 3 hónap alatt összesen kb. 2700 csapat indult a világ minden tájáról. Legfeljebb 5 fős csapatok nevezhettek. A pontozás, mint mindig, itt is a becslésre adott hiba volt. A legjobbak nagyon profi megoldásokat szállítottak. A legjobbak között természetesen sok ázsiai csapat és orosz csapat is volt.

A legjobb megoldást két kutatócsoport, a Bosch Research és a Bosch Center for AI kutatói közös erővel hozták össze. Gratulálok nekik, elolvastam a fórumban, hogy hogyan csinálták, annyit mondhatok, nem semmi eredmény.

Én 202.-ik helyezést értem el, a 2749 indulóból. Elégedett vagyok az eredménnyel, rengeteg dolgot meg kellett tanulnom menet közben, és persze elkövettem pár amatőr hibát is. A megoldásomat Python nyelven írtam, és a Microsoft LightGBM rendszerét használtam, ami egy Gradient Boosting Machine implementáció. A Python kódot feltettem GitHub-ra is.

A pontszám amit én kaptam -1.95 volt, a legjobb megoldás pedig -3.24. Azért negatív számok, mert nagyon pici számokat kellett becsülni, ezért a pontszám az átlagos hiba logaritmusa. Visszatranszformálva a logaritmust, az jön ki, hogy én átlagos hibám 0.142 körül alakult, a legjobb megoldás átlagos hibája 0.039.

Tervezek majd írni egy technikai jellegű posztot is, ahol néhány tanulságot, érdekességet kiemelek a versenyről.