Priporočilni sistem: navodila za implementacijo skupinskega filtriranja
Napovedovanje ocen s podobnostjo med produkti (6)
Napišite razred ItemBasedPredictor
, ki v konstruktorju sprejme dva parametra: min_values
in threshold
(privzete vrednosti obeh naj bodo 0). Razred naj na podlagi podobnosti med produkti izračuna pričakovano oceno produktov za izbranega uporabnika. Podobnost izračunajte s popravljeno cosinusno razdaljo. V razredu implementirajte metode fit
in predict
ter similarity(self, p1, p2)
, ki vrne podobnost med produktoma p1
in p2
. Če je izračunana podobnost med produktoma manjša od threshold
ali če imamo manj kot min_values
uporabnikov, ki je ocenilo oba filma, naj bo podobnost med produktoma 0. Predlagam, da v metodi fit
izračunate vse podobnosti in jih v predict
in fit
le uporabljate.
Vzemimo le filme, ki imajo vsaj 1000 ocen, da bo računanje v metodi fit
hitrejše. Moja implementacija potrebuje nekaj sekund.
md = MovieData('data/movies.dat') uim = UserItemData('data/user_ratedmovies.dat', min_ratings=1000) rp = ItemBasedPredictor() rec = Recommender(rp) rec.fit(uim) print(uim.movies) print("Podobnost med filmoma 'Men in black'(1580) in 'Ghostbusters'(2716): ", rp.similarity(1580, 2716)) print("Podobnost med filmoma 'Men in black'(1580) in 'Schindler's List'(527): ", rp.similarity(1580, 527)) print("Podobnost med filmoma 'Men in black'(1580) in 'Independence day'(780): ", rp.similarity(1580, 780))
Rezultat:
Podobnost med filmoma 'Men in black'(1580) in 'Ghostbusters'(2716): 0.233955231768 Podobnost med filmoma 'Men in black'(1580) in 'Schindler's List'(527): 0.0 Podobnost med filmoma 'Men in black'(1580) in 'Independence day'(780): 0.424661258447
Če uporabimo recommender za uporabnika 78, dobimo:
print("Predictions for 78: ") rec_items = rec.recommend(78, n=15, rec_seen=False) for idmovie, val in rec_items: print("Film: {}, ocena: {}".format(md.get_title(idmovie), val))
Film: Shichinin no samurai, ocena: 4.355734702553732 Film: The Usual Suspects, ocena: 4.354681671325777 Film: The Silence of the Lambs, ocena: 4.335305215729613 Film: Sin City, ocena: 4.278687059261374 Film: Monsters, Inc., ocena: 4.2175806874956665 Film: The Incredibles, ocena: 4.207098405922537 Film: The Lord of the Rings: The Fellowship of the Ring, ocena: 4.15279203714804 Film: Batman Begins, ocena: 4.146413660330134 Film: Die Hard, ocena: 4.125915501065452 Film: Rain Man, ocena: 4.071535187988423 Film: The Lord of the Rings: The Return of the King, ocena: 4.020237426179001 Film: A Beautiful Mind, ocena: 4.015142457113093 Film: Good Will Hunting, ocena: 4.009280780263334 Film: The Lord of the Rings: The Two Towers, ocena: 3.9414763181545847 Film: Indiana Jones and the Last Crusade, ocena: 3.7969765828982167
Najbolj podobni filmi (6)
Izpišite 20 parov najbolj podobnih filmov. Če spet uporabimo le filme, ki imajo vsaj 1000 ocen, dobimo:
Film1: The Lord of the Rings: The Return of the King, Film2: The Lord of the Rings: The Two Towers, podobnost: 0.8439842148481411 Film1: The Lord of the Rings: The Two Towers, Film2: The Lord of the Rings: The Return of the King, podobnost: 0.8439842148481411 Film1: The Lord of the Rings: The Two Towers, Film2: The Lord of the Rings: The Fellowship of the Ring, podobnost: 0.8231885401761887 Film1: The Lord of the Rings: The Fellowship of the Ring, Film2: The Lord of the Rings: The Two Towers, podobnost: 0.8231885401761887 Film1: The Lord of the Rings: The Return of the King, Film2: The Lord of the Rings: The Fellowship of the Ring, podobnost: 0.8079374897442487 Film1: The Lord of the Rings: The Fellowship of the Ring, Film2: The Lord of the Rings: The Return of the King, podobnost: 0.8079374897442487 Film1: Kill Bill: Vol. 2, Film2: Kill Bill: Vol. 2, podobnost: 0.7372340224381033 Film1: Kill Bill: Vol. 2, Film2: Kill Bill: Vol. 2, podobnost: 0.7372340224381033 Film1: Star Wars: Episode V - The Empire Strikes Back, Film2: Star Wars, podobnost: 0.7021321132220316 Film1: Star Wars, Film2: Star Wars: Episode V - The Empire Strikes Back, podobnost: 0.7021321132220316 Film1: The Mask, Film2: Ace Ventura: Pet Detective, podobnost: 0.6616471778494041 Film1: Ace Ventura: Pet Detective, Film2: The Mask, podobnost: 0.6616471778494041 Film1: Star Wars: Episode VI - Return of the Jedi, Film2: Star Wars: Episode V - The Empire Strikes Back, podobnost: 0.5992253753778951 Film1: Star Wars: Episode V - The Empire Strikes Back, Film2: Star Wars: Episode VI - Return of the Jedi, podobnost: 0.5992253753778951 Film1: Star Wars: Episode I - The Phantom Menace, Film2: Independence Day, podobnost: 0.5610426219249982 Film1: Independence Day, Film2: Star Wars: Episode I - The Phantom Menace, podobnost: 0.5610426219249982 Film1: Austin Powers: The Spy Who Shagged Me, Film2: Ace Ventura: Pet Detective, podobnost: 0.5546511205201548 Film1: Ace Ventura: Pet Detective, Film2: Austin Powers: The Spy Who Shagged Me, podobnost: 0.5546511205201548 Film1: Star Wars: Episode VI - Return of the Jedi, Film2: Star Wars, podobnost: 0.5537849318137374 Film1: Star Wars, Film2: Star Wars: Episode VI - Return of the Jedi, podobnost: 0.5537849318137374
Priporočanje glede na trenutno ogledano vsebino (7)
Kaj bi pokazali v kategoriji "Gledalci, ki so gledali A, so gledali tudi B"? Razredu ItemBasedPredictor
dodajte metodo similarItems(self, item, n)
, ki vrne n
najbolj podobnih filmov izbranemu filmu.
rec_items = rp.similarItems(4993, 10) print('Filmi podobni "The Lord of the Rings: The Fellowship of the Ring": ') for idmovie, val in rec_items: print("Film: {}, ocena: {}".format(md.get_title(idmovie), val))
Filmi podobni "The Lord of the Rings: The Fellowship of the Ring": Film: The Lord of the Rings: The Two Towers, ocena: 0.8231885401761887 Film: The Lord of the Rings: The Return of the King, ocena: 0.8079374897442487 Film: Star Wars: Episode V - The Empire Strikes Back, ocena: 0.23961943073496453 Film: Star Wars, ocena: 0.21965586527074088 Film: The Matrix, ocena: 0.2151555270688026 Film: Raiders of the Lost Ark, ocena: 0.19944276706345052 Film: The Usual Suspects, ocena: 0.18321188451910767 Film: Blade Runner, ocena: 0.16399681315410303 Film: Schindler's List, ocena: 0.16105905138148724 Film: Monty Python and the Holy Grail, ocena: 0.15780453798519137
Priporočilo zase (7)
Naredite še priporočilo zase z metodo "item-based"; izberite si cca. 20 filmov, ki jih poznate in jih ročno ocenite. Dodajte svoje ocene v movielens bazo in si priporočite 10 filmov.
Napovedovanje z metodo Slope one (7)
Napišite prediktor SlopeOnePredictor
, ki izračuna napovedano vrednost ocen za produkte z metodo Slope one. Primer:
md = MovieData('data/movies.dat')
uim = UserItemData('data/user_ratedmovies.dat', min_ratings=1000)
rp = SlopeOnePredictor()
rec = Recommender(rp)
rec.fit(uim)
print("Predictions for 78: ")
rec_items = rec.recommend(78, n=15, rec_seen=False)
for idmovie, val in rec_items:
print("Film: {}, ocena: {}".format(md.get_title(idmovie), val))
Rezultat:
Predictions for 78:
Film: The Usual Suspects, ocena: 4.325079182263173
Film: The Lord of the Rings: The Fellowship of the Ring, ocena: 4.155293229840448
Film: The Lord of the Rings: The Return of the King, ocena: 4.153135076202185
Film: The Silence of the Lambs, ocena: 4.127978169643881
Film: Shichinin no samurai, ocena: 4.119790444913598
Film: The Lord of the Rings: The Two Towers, ocena: 4.083325894849594
Film: Indiana Jones and the Last Crusade, ocena: 3.9670398355464194
Film: The Incredibles, ocena: 3.9664496674557546
Film: Good Will Hunting, ocena: 3.963362387354114
Film: Sin City, ocena: 3.942619137615212
Film: Batman Begins, ocena: 3.9375326640077017
Film: A Beautiful Mind, ocena: 3.9140940935239508
Film: Rain Man, ocena: 3.9107819079644943
Film: Monsters, Inc., ocena: 3.8819375978658006
Film: Finding Nemo, ocena: 3.8807711131654794
Hibridni prediktor
Napišite razred HybridPredictor
, ki sestavi priporočilo iz do sedaj implementiranih metod. Hibridni prediktor naj torej združi SlopeOne, ItemBased in "najbolje ocenjeno" na enega od uveljavljenih načinov.
Matrična faktorizacija in vizualizacija (*)
Napišite razred MatrixFactorizationPredictor
, ki matriko ocen najprej faktorizira in jo potem uporabi za izračun ocen. Matrična faktorizacija je priljubljena metoda za priporočilne sisteme, saj običajno dosega boljše rezultate kot metoda najbljižjih sosedov; več o njej si lahko pogledate v (Y. Koren et al., Matrix factorization techniques for recommender systems ALI G. Takacs et al., Scalable Collaborative Filtering Approaches for Large Recommender Systems).
Dobljene faktorje vizualizirajte.
Priporočilni sistem s klasičnim strojnim učenjem (*)
Že pred dolgo časa so na Kagglu objavili izziv, kjer je bila naloga napovedati artikle v naslednji kupčevi košarici. V tistem primeru se je izkazalo, da s pametnimi značilkami in osnovnimi metodami strojnega učenja dejansko dobimo najboljše rezultate. Napovedovanje naslednjih kupljenih artiklov pa je zelo podobno napovedovanju naslednjega filma. S strojnim učenjem razvijte model, s katerim lahko napovemo, kateri bo naslednji uporabnikov film. Pri tem naj bo en primer v učni množici kombinacija filma in uporabnika, kjer je razred zadnji ogledani film, atributi pa se domislite sami.
Priporočilni sistem z nevronskimi mrežami (*)
V mnogih domenah nevronske mreže premagujejo tradicionalne metode in vprašanje je, ali je tako tudi pri priporočilnih sistemih.
Implementirajte priporočilni sistem, kjer na poljubni način uporabite nevronsko mrežo. Najlažje bo, če poiščete kakšen blog na to temo, saj jih je na voljo precej. Dva primera: https://towardsdatascience.com/paper-review-neural-collaborative-filtering-explanation-implementation-ea3e031b7f96 in https://www.analyticsvidhya.com/blog/2021/05/movie-recommendations-using-keras-recommender-systems/