Priporočilni sistem: evalvacija priporočilnega sistema
Metoda evaluate(self, test_data, n)
(8)
Napišite metodo razreda Recommender
, ki sprejme testne podatke test_data
in izračuna povprečne MAE, RMSE, priklic, natančnost, F1. Za priklic, natančnost in F1 boste morali za vsakega uporabnika izbrati nekaj priporočenih produktov. Jaz sem se odločil, da vzamem tiste, ki jih je uporabnik ocenil bolje od svojega povprečja. Pri tem upoštevajte, da ne priporočate že gledanih produktov in da parameter n
označuje število priporočenih produktov.
Katera od metod, ki ste jih že implementirali, deluje najbolje?
Primer:
md = MovieData('data/movies.dat') uim = UserItemData('data/user_ratedmovies.dat', min_ratings=1000, end_date='1.1.2008') rp = SlopeOnePredictor() rec = Recommender(rp) rec.fit(uim) uim_test = UserItemData('data/user_ratedmovies.dat', min_ratings=200, start_date='2.1.2008') mse, mae, precision, recall, f = rec.evaluate(uim_test, 20) print(mse, mae, precision, recall, f)
Rezultat:
0.756301097596 0.644772273689 0.10398146371932578 0.1433164697088829 0.12052066985624228
Inkrementalno testiranje in prečno preverjanje (cross-validation)
Namesto enkratnega testiranja je bolje, če razdelitev in ocenjevanje večkrat ponovimo. Pri prečnem preverjanju vse ocene razdelimo v nekaj delov (angl. fold). Npr. predpostavimo, da ocene razdelimo na deset delov. Potem desetkrat ponovimo učenje na devetih delih in testiranje na desetem (vsakič drugem). Končne vrednosti statistik so povprečne vrednosti čez posamezna testiranja.
Inkrementalno testiranje je najboljši približek delovanja realnega sistema, kadar imamo na voljo datume dogodkov (npr. ocen). Najprej izberemo začetni datum in se učimo samo na ocenah do tega datuma. Ta sistem testiramo na nekem oknu, npr. ocenah, ki so bile oddane v naslednjem tednu. Potem vključimo te ocene v učno množico in testiramo na tednu, ki sledi. To ponavljamo, dokler ne zmanjka ocen. Na koncu rezultate povprečimo.