Mesterséges Intelligencia II. kötelező feladat (3. forduló) - Ajánló rendszer 2. 1. Feladat kiírása A második forduló feladata hasonlóan az előző fordulóhoz egy ajánló rendszer modelljének elkészítése. Azaz egy programot kell készíteni és betanítani, amely az f : User Item Rate leképezés minél jobb közelítésére képes egy előre ismeretlen kiértékelési halmazon. A modell file elkészítéséhez felhasználhatóak a Weka programcsomag által nyújtott algoritmusok. 2. Rendelkezésre álló erőforrások A http://www.inf.u-szeged.hu/~ormandi/teaching/mi2/ oldalon elérhető egy tömörített állomány, amely a rendelkezésre álló segédanyagokat tartalmazza. Az állomány tartalmaz egy tanító adatbázist, valamint egy a feladat megvalósítását segítő API (és annak forráskódja). A jelenlegi forduló új keretrendszer változatot használ, így nyomatékosan kérek mindenkit, hogy ismételten töltse le azt! Tekintsük át részletesebben, hogy miből áll a tanuló adatbázis és az API. 2.1. A tanító adatbázis A tanító adatbázis a kitömörített segédanyag bin könyvtárában érhető el. Az adatbázist 3 darab file tartalmazza: u1.base: Ez az állomány tartamazza a tényleges preferencia mátrixot. Minden sor egy mátrix elemet ír le, az alábbi formában: UserId[TAB]ItemId[TAB]Rating[TAB]Timestamp u.user: Ez az állomány tartamazza az egyes user profilokat, azaz a egyes felhasználókról szóló többlet információt. Ennek a file-nak szintén minden egyes sora egy-egy felhasználót ír le. A file formátuma a 1
következő: UserId[TAB]Age[TAB]Gender[TAB]Occupation[TAB]ZipCode u.item: Ez az állomány hasonlóan az előzőhöz az egyes item profilokat, azaz az egyes mozifilmekhez tartozó kiegészítő információkat tartalmazza. Szintén minden egyes sor egy-egy mozifilmet ír le az alábbi formátum szerint: MovieId[TAB]movieTitle[TAB]ReleaseDate[TAB]VideoReleaseDate[TAB] IMDbURL[TAB]IsUnknown[TAB]IsAction[TAB]IsAdventure[TAB] IsAnimation[TAB]IsChildrens[TAB]IsComedy[TAB]IsCrime[TAB] IsDocumentary[TAB]IsDrama[TAB]IsFantasy[TAB]IsFilmNoir[TAB] IsHorror[TAB]IsMusical[TAB]IsMystery[TAB]IsRomance[TAB] IsSciFi[TAB]IsThriller[TAB]IsWar[TAB]IsWestern Az előzőekben leírt információk állnak rendelkezésre ahhoz, hogy ajánló rendszert készítsünk. A feladat tehát az, hogy dolgozzuk fel a fenti adatbázist és tetszőleges értékelést (amely a tanító adatbázisban nem szerepel), a lehető legnagyobb pontossággal jelezzen előre a rendszer. A következőkben tárgyalásra kerülő keretrendszer és API abban segít, hogy a fent leírt adatbázist könnyedén lehessen kezelni, illetve azt biztosítja, hogy a megoldások egységes formában készüljenek el. A következő fejezetben áttekintjük a keretrendszer felépítését és funkcióit. 2.2. A keretrendszer és API A keretrendszer lefordított változata a kitömörített állomány bin könyvtárában található, recommender.jar néven. A keretrendszer futtatható és a futása során két, jól elkülöníthető funkciót valósít meg: az egyik a tanítás, a másik a kiértékelés. A tanítás során a keretrendszer egy előre (paraméterként) megadott osztály egy példányát készíti el, amely képes megvalósítani a tanulást. A tanítás során a Weka csomag algoritmusai felhasználhatóak. A tanulás után előálló objektum példányt a rendszer serializálja! A kiértékelési fázisban a tanulási fázisban előállított objektum kerül beolvasásra és az így beolvasott objektum kerül kiértékelésre, azaz ez adja a 2
predikciókat. A teljes teszthalmaz kiértékelésére ebben a fordulóban 2 percnyi CPU idő áll a programok rendelkezésére! Abban az esetben, ha ez a tesztelési időkorlát letelik, a kiértékelés hibája Double.MAX_VALUE lesz! A két funkció szeparációjának az az oka, hogy a bíró rendszerben nem szeretnénk elvégezni a tanítást, így a megoldás forráskódja mellé egy betanított, serializált objektum példányt is csatolni kell 1. Az ajánlási feladat megoldását a keretrendszer recommendersystem.recommendersystem nevű absztrakt osztályának kiterejesztéseként kell elkészíteni. Ennek az absztrakt osztálynak két megvalósítandó metódusa van: void build(useritemmatrix trainmatrix): Ezt a metódust hívja meg a keretrendszer a tanítási fázisban. A metódusnak egyetlen paramétere van, amely lényegében a teljes beolvasott tanító adatbázis keretrendszerbeli reprezentációja. Ennek a bemenetnek a felhasználásával kell elkészíteni azt a modellt, ami a tesztelés folymán predikciókat ad az ajánláshoz. int getrate(int useridx, int itemidx): Ez a metódus ad közelítést a paraméterben kapott index-szel rendelkező felhasználó és mozifilm értékelésére. Ez egy 1 és 5 közötti egész szám! 2.3. Követelmények a megoldással szemben A megoldást tartalmazó forráskódnak minden körülmények között ki kell elégítenie a következő követelményeket: A megoldást tartalmazó osztálynak ki kell terjesztenie a recommendersystem.recommendersystem osztályt. A megoldást tartalmazó osztálynak részletes magyar osztálydokumentációt kell tartalmaznia, javadoc formátumban, illetve a kód dokumentációja is magyar kell hogy legyen. A kód nem használhat a keretrendszeren kívül semmilyen más osztálykönyvtárat, kivéve a mellékelt Weka programcsomagot. 1 Ennek technikai részleteiről a későbbi fejezetben olvashatunk. 3
A megoldást tartalmazó osztály nevének meg kell egyeznia a hallgató h-s azonosítójával (kis h betűvel). A megoldást tartalmazó osztály nem lehet csomagban. A megoldásban nem lehet képernyőre írás. A megoldás nem nyithat meg file-t, nem indíthat új szálat. Az implementált metódusoknak minden esetben vissza kell térniük. (Nem szerepelhet benn exit hívás például.) A megoldás nem lehet triviális 2! A tanítás során csak és kizárólag a közreadott tanító halmaz használható. Minden a tanítóhalmaz bővítésére irányuló kísérlet csalásnak minősül! Azonban a mellékelt tanító adatbázisból bármilyen információ kinyerhető! 3. Otthoni fejlesztés menete A könnyebb érthetőség kedvéért tekintsünk egy példa fejlesztés-kiértékelés ciklusra: 1. Töltsük le és tanulmányozzuk a közreadott keretrendszert, valamint a benne elérhető recommendersystem.model.randommodel példa megoldást. 2. Találjuk ki és implementáljuk a megoldásunkat Java programozási nyelven. Például: import recommendersystem.recommendersystem; import recommendersystem.useritemmatrix; public class h241696 extends RecommenderSystem { 2 Az, hogy mi számít triviális megoldásnak szubjektív megítélés alá esik, de például biztosan triviálisnak mondható a konstans ajánlás, a véletlen ajánlás vagy ezek egyszerű kombinációja. 4
public h241696() { //... public void build(useritemmatrix trainmatrix) { //... public int getrate(int useridx, int itemidx) { //... return 3; 3. Fordítsuk le azt. A fordítás során a class-path-ban szerepelnie kell a keretrendszernek. Például: javac -classpath "recommender.jar;weka.jar" h241696.java 4. Tanítsuk be a modell-t. Például (egy sorban): java -classpath "recommender.jar;weka.jar;." recommendersystem.engine -train h241696 h241696.model u1.base u.user u.item Ez a hívás előállítja a h241696.model állományt, amely tartalmazza a betanított objektumot! 5. Értékeljük ki a modellt. Például (egy sorban): java -classpath "recommender.jar;weka.jar;." recommendersystem.engine -test 120 h241696.model u1.base u.user u.item Érdemes több tesztet végezni! 5
6. Ha megfelelőnek ítéljük a stratégiánkat, akkor töltsük fel a Bíró rendszerbe, különben iteráljunk a forráskód változtatásától. A keretrendszer kiterjesztett RMSE hibafüggvényt használ a teszt hibájának mérésére. A kiterjesztés lényege, hogy: amennyiben a predikció kivül esik az értékelési tartományon, akkor a predikált és az elvárt érték különbsége 10 lesz, amennyiben a teljes tesztelés nem fejeződik be a rendelkezésre álló 2 perc alatt, akkor az RMSE érték Double.MAX_VALUE érték lesz! 4. Feltöltés és kiértékelés Miután befejeztük a fejlesztés egy szakaszát, a megoldást fel kell tölteni a bíró rendszerbe. Egészen pontosan két állomány feltöltését kell elvégeznünk: a megoldást tartalmazó forrás állományt (előző példában h241696.java), a betanított objektumot tartalmaztó modell állományt. (előző példában a tanítás kimeneteként előálló h241696.model). Ezt a két állományt egy feladat.zip nevű állománnyá kell összetömöríteni 3. Az így előállított tömörített állományt kell feltölteni. A feltöltött állományt a bíró rendszer kitömöríti, a forrás állományt lefordítja 4, majd meghívja a keretrendszer kiértékelő módban egy a fejlesztés során ismeretlen preferenciamátrix átadásával. A bíró rendszer 1 pontot ad, ha a feltöltés sikeres volt (nem lépett fel hiba a feltöltés, fordítás, kiérétkelés során), 0 pontot egyébként. Az 1 pontos feltöltések esetén a keretrendszer által mért hiba alapján kerülnek rangsorolásra a hallgatók. A rangsor elérhető a http://www.inf.u-szeged.hu/ ~ormandi/teaching/mi2/ oldalon keresztül. A végleges pontszámok megállapítása ezen rangsor alapján történik. 3 Ez az állomány nem tartalmazhat könyvtárat és csak ez a két állomány lehet benne! 4 Ez nem lenne feltétlen szükséges a kiértékeléshez, csak annak ellenőrzésére szolgál, hogy a feltöltött forrás fordítható-e. 6
Fontos megjegyezni, hogy a rangsorba történő bekerülés nem jelent automatikusan elfogadott fordulót! A forduló végén összesített újratanítás és tesztelés, valamint kódellenőrzés lesz. 5. Határidők A jelenlegi forduló beadásának határideje 2009. május. 4. 11:59. 6. Összefoglalás Az alábbi táblázat összefoglalva tartamazza a feladatra vonatkozó főbb adatokat. Probálkozások száma 10 Kapható maximális pontszám 15 Feladat beküldése 2009. május. 4. 11:59 Sikeres feltöltés pontszáma: 1 Sikertelen feltöltés pontszáma: 0 Feltöltendő file neve feladat.zip Tesztelési időkorlát 2 min Triviális megoldás engedélyezett nem Használható API-k Weka Hasznos és jó munkát kívánunk! 7