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 : U ser × 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 kell1 . 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ális2 ! • 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íteni3 . 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ítja4 , 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! 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. 4
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