2. Analiza przypadku: rekomendacje reklam
• Problem: niski współczynnik konwersji (CTR) w reklamach
online w dużej platformie ad-management w Polsce.
2
6. “Od nieurodzaju do dostatku”
• Wolna przestrzeń na półce to towar deficytowy dla sprzedawcy
detalicznego.
• Sieć umożliwia niemal darmowe udostępnienie informacji o
produktach.
• Przykłady:
• książki, muzyka, filmy, ludzie (znajomi z Facebook-a).
5
8. Od dostatku głowa nie boli. . .
• Więcej możliwości wyboru wymaga lepszych filtrów.
• Systemy rekomendujące.
• Jak “Into Thin Air” spowodowało sukces “Touching the Void”?
7
9. Typy rekomendacji
• Redakcyjna i ręcznie uporządkowana.
• Lista faworytów.
• Lista “właściwych” rzeczy.
• Proste agregacje:
• top 10 (IMDB), najbardziej popularne, ostatnio dodane.
• Dopasowane do indywidualnych użytkowników:
• Amazon, Netflix, Filmweb, IMDB, Pandora.
8
11. Najważniejsze problemy
1. Jak zebrać dane do macierzy użyteczności?
2. Ekstrapolowanie nieznanych ocen ze znanych danych.
• Głównie interesują nas wysokie oceny.
• Chcemy wiedzieć co lubimy, a nie czego nie lubimy.
3. Ewaluacja metod ekstrapolacji.
• Jak mierzyć skuteczność systemów rekomendujących?
10
12. Zbieranie ocen/danych
• Explicite:
• Pytaj ludzi o oceny rzeczy.
• Nie działa dobrze w praktyce, bo użytkownicy nie chcą
współpracować.
• Niewiele ocen — nieskalowalne.
• Implicite:
• Ucz się ocen z zachowania użytkownika, np. zakup oznacza
ocenę.
• Co z niskimi ocenami?
• W praktyce mamy model mieszany z tych dwóch podejść.
11
13. Ekstrapolowanie nieznanych ocen
• Główny problem:
• Macierz użyteczności jest rzadka, ponieważ ludzie nie są w
stanie ocenić wszystkich/większości rzeczy.
• Zimy start (cold start):
• Nowe produkty nie mają żadnych ocen.
• Nowi użytkownicy nie mają historii.
• Trzy podejścia do problemu:
• oparte na treści (content-based).
• społecznościowe (collaborative),
• zmienne ukryte (latent factor).
12
15. Rekomendacje oparte o treść
• Główna idea: rekomenduj użytkownikowi rzeczy podobne do
rzeczy wcześniej wysoko ocenionych przez niego.
• Przykład:
• Oceny filmów: rekomenduj filmy z tymi samymi aktorami, tym
samym reżyserem, gatunkiem etc.
• Strony internetowe, blogi, news: rekomenduj strony o podobnej
treści.
• Ludzie: rekomenduje tych, z którymi mamy wspólnych
znajomych.
13
17. Profil produktu
• Dla każdego produktu stwórz jego profil.
• Profil to zbiór (wektor) cech:
• filmy: twórca, tytuł, aktor, reżyser, etc.
• zdjęcia, wideo: metadata, tagi,
• ludzie: zbiór znajomych,
• tekst: zbiór najważniejszych słów w tekście.
15
18. Profil użytkownika
• Użytkownik ocenił produkty o profilach (wektorach): i1, i2, . . .,
in.
• Możliwe profile użytkownika:
• ważona średnia profili ocenionych produktów,
• wariant: znormalizuj wagi używając średniej oceny użytkownika,
agregacja etc.
16
19. Przykład — boolowska macierz użyteczności
• Produkty to filmy, a cechą jest aktor.
• Profil filmu to wektor 0 i 1.
• Niech użytkownik obejrzał 5 filmów:
• 2 z aktorem A,
• 3 z aktorem B.
• Profile użytkownika — średnia:
• waga cechy A = 2/5 = 0.4,
• waga cechy B = 3/5 = 0.6.
17
20. Przykład — oceny gwiazdkami
• Przykład jak wyżej z ocenami w skali 1–5.
• Filmy z A ocenione na 3 i 5.
• Filmy z B ocenione na 1, 2 i 4.
• Normalizujemy dane:
• Dla A: 0, 2. Waga = (0 + 2)/2 = 1
• Dla B: -2, -1, 1. Waga = −2/3.
18
21. Predykcja dla użytkownika
• Heurystyka predykcji:
• Przyznaj profilowi użytkownika x oraz produktowi i ocenę
u(x, i) = cos(x, i) =
x · i
x · i
. (1)
19
22. Plusy tego podejścia
• Nie potrzeba informacji od innych użytkowników: brak zimnego
startu i problemów z rzadkością danych.
• Można rekomendować użytkownikom ze specyficznym gustem.
• Można rekomendować nowe i niepopularne produkty.
• Dostajemy wyjaśnienie:
• Można wytłumaczyć dlaczego rekomendowaliśmy dany produkt
poprzez wgląd w cechy, które spowodowały jego rekomendację.
20
23. Minusy podejścia
• Znalezienie odpowiednich cech jest trudne, np.: obrazki, filmy,
muzyka etc.
• Rekomendacje dla nowych użytkowników: jak zbudować profil
użytkownika?
• Specjalizacja:
• nie rekomenduje produktów spoza profilu użytkownika,
• ludzie mają wiele zainteresowań,
• gusta się zmieniają,
• nie można wykorzystać ocen innych użytkowników.
21
25. Filtrowanie społecznościowe
• Rozważmy użytkownika x.
• Znajdź zbiór N użytkowników o podobnym
zestawie ocen do x.
• Oszacuj oceny użytkownika x opierając się
na ocenach ze zbioru N.
22
26. Znajdowanie podobnych użytkowników
• Niech rx oznacza wektor ocen użytkownika x.
• Podobieństwo kosinusowe:
• sim(x, y) = cos(rx , ry ) =
rx ·ry
rx · ry
.
• Problem: takie podobieństwo traktuje brakujące wartości jak
negatywne.
• Współczynnik korelacji Pearsona:
• Sx,y = produkty wspólnie ocenione przez x oraz y.
sim(x, y) = rxy =
s∈Sx,y
(rxs − rx )(rys − ry )
s∈Sx,y
(rxs − rx )2
s∈Sx,y
(rys − ry )2
.
(2)
23
27. Miara podobieństwa
• Intuicyjnie chcielibyśmy, żeby sim(A, B) > sim(A, C).
• Podobieństwo kosinusowe: 0.386 > 0.322.
• Brakujące wartości traktuje jako ujemne.
• Rozwiązanie: odejmij średnią (z rzędu)
24
28. Ocena predykcji
• Od miary podobieństwa do rekomendacji:
• Niech rx to wektor ocen użytkownika x.
• Niech N to zbiór k użytkowników najbardziej podobnych do x,
którzy wspólnie ocenili produkt i.
• Predykcja produktu i dla użytkownika x
• rx,i = 1
k y∈N
ry,i .
• rx,i = y∈N
sx,y ry,i
y∈N
sx,y
, gdzie sx,y = sim(x, y).
• Wiele innych możliwości. . .
25
30. Filtrowanie społecznościowe produkt-produkt
• Do tej pory omawialiśmy filtrowanie społecznościowe
użytkownik-użytkownik.
• Inne spojrzenie: produkt-produkt.
• dla produktu i znajdź podobne,
• zweryfikuj ocenę produktu i na podstawie ocen innych
produktów,
• można użyć podobnych metryk podobieństwa jak w przypadku
modelu użytkownik-użytkownik.
27
35. Produkt-produkt vs użytkownik-użytkownik
• W praktyce zaobserwowano, że podejście produkt-produkt
działa lepiej niż użytkownik-użytkownik.
• Dlaczego? Produkty są proste, a użytkownicy mają
różne/zmienne gusty.
32
36. Plusy/minusy CF
• Plusy:
• Działa dla każdego rodzaju produktów.
• Minusy:
• Zimny start: brak wystarczającej liczby użytkowników do
znalezienia dopasowania.
• Rzadkość: macierz ocen jest rzadka; ciężko znaleźć dwóch
użytkowników, którzy ocenili te same produkty.
• Pierwsza ocena: nie można ocenić produktu, który nie był
oceniony do tej pory.
• Popularność: nie można rekomendować produktu
użytkownikowi o indywidualnym guście; dąży do rekomendacji
popularnych produktów.
33
37. Metody hybrydowe
• Można zaimplementować dwa lub więcej różne systemy
rekomendacji i połącz ich predykcje.
• Można dodać metody oparte o treść:
• profile produktu dla nowych produktów,
• dane demograficzne pomogą poradzić sobie z nowymi
użytkownikami.
34
39. Ładujemy główne biblioteki
1 # --- Import Libraries --- #
2 import pandas as pd
3 from scipy.spatial.distance import cosine
4
5 # --- Read Data --- #
6 events = pd.read_csv('data.csv')
35
40. Przyjrzyjmy się danym
1 print events.head().ix[:, 2:10]
User ID Advertiser ID Campaign ID Banner ID
0 AAAGTHsdebojV3i_I1ddkw 14748 21090 201090
1 AAAGTHsdebojV3i_I1cjkw 14748 21090 201090
2 AAAGTHsdebojV3i_I1dNsQ 14748 21090 200892
3 AAAGTHsdebojV3i_I1dKnw 14748 21090 201090
4 AAAGTHsdebojV3i_I1dKnw 14748 21090 201093
Publisher ID Placement ID Event type Traits (JSON)
0 14751 826507 view [7407]
1 14751 826507 click [7406,7407]
2 14749 826297 view
3 14751 826507 view [7407]
4 14751 4611686018427387905 click [7406,7407]
36
41. Jak wyglądało wstępne przetworznie danych?
• Należało uzupełnić brakujące pola Traits.
• Z powodów technicznych należało położenie
4611686018427387905 zamienić na inny id.
37
42. Jak wyglądało wstępne przetworznie danych?
• Musimy zamienić tę tabelkę na macierz
(user,placement)/banner, gdzie wartość pola oznacza liczbę
klików (click) przez danego użytkownika w danym położeniu na
dany baner.
1 print data.head(4)
user_placement 201030 201139 201138 200894...
0 ('AAAGS3tzeAsjV3i_I1ccPA', 827046) 0 1 0 0...
1 ('AAEGTHtpeLYjV3i_I1cj3Q', 632093) 1 0 0 2...
2 ('AAEGTHsPeu4jV3i_I1d-fg', 827455) 1 0 0 0...
3 ('AAAGS3trepkjV3i_I1cjkg', 827145) 0 0 0 0...
38
43. Rekomendacje produkt-produkt
1 # --- Start Item Based Recommendations --- #
2 # Drop any column named "user_placement"
3 data_banner = data.drop('user_placement', 1)
39
44. Rekomendacje produkt-produkt
• Zanim policzymy podobieństwa musimy mieć miejsce, żeby je
trzymać.
• Tworzymy zmienną data_ibs typu ramki danych w pandas
(myślmy o tym jak o tabelce w Excel-u).
1 # Create a placeholder dataframe listing item vs. item
2 data_ibs = pd.DataFrame(index = data_banner.columns,
3 columns = data_banner.columns)
• Zaczniemy ją wpełniać podobieństwami, a do tego potrzebna
nam będzie funkcja podobieństwa cosine.
40
45. Liczenie podobieństwa
1 # Lets fill in those empty spaces with cosine similarities
2 # Loop through the columns
3 for i in range(len(data_ibs.columns)):
4 # Loop through the columns for each column
5 for j in range(len(data_ibs.columns)):
6 # Fill in placeholder with cosine similarities
7 data_ibs.ix[i, j] = 1 - cosine(data_banner.ix[:, i],
data_banner.ix[:, j])
• Gdyby to była lista, to możnaby było to zrobić szybciej w list
comprehension.
41
46. Szukamy produktów w otoczeniu
• Mając policzone podobieństwa w data_ibs dla każdego
produktu będziemy poszukiwać produktów, które są mu
najbliższe.
1 # Create a placeholder items for closes neighbours to an item
2 data_neighbours = pd.DataFrame(index = data_ibs.columns,
3 columns = range(1, 11))
4
5 # Loop through our similarity dataframe
6 # and fill in neighbouring item names
7 for i in range(len(data_ibs.columns)):
8 data_neighbours.ix[i, :10] =
9 data_ibs.ix[0:, i].order(ascending = False)[:10].index
10
11 # --- End Item Based Recommendations --- #
42
48. Rekomendacje użytkownik-użytkownik
• Proces wygląda następująco:
• potrzebujemy macierzy podobieństwa produkt-produkt (mamy!);
• sprawdź, które produkty (banery) trafiły do danego użytkownika;
• dla każdego klikniętego baneru weź jego otoczenie;
• dla tego otoczeniu policz kliknięcia użytkownika;
• policz rangę podobieństwa ze wzoru;
• rekomenduje te produkty, które mają najwyższą rangę.
44
49. Funkcja podobieństwa
1 # --- Start User Based Recommendations --- #
2
3 # Helper function to get similarity scores
4 def getScore(history, similarities):
5 return sum(history * similarities) / sum(similarities)
45
50. Przygotowanie zmiennych
• Tworzymy zmienną na potrzeby przetrzymywania podobieństwa.
1 # Create a place holder matrix for similarities,
2 # and fill in the user name column
3 data_sims = pd.DataFrame(index = data.index,
4 columns = data.columns)
5 data_sims.ix[:, :1] = data.ix[:, :1]
46
51. Wypełniamy podobieństwa I
• Wypełniamy macierz wartościami podobieństwa.
• Banery, które użytkownik już klinkął są ustawiane na 0, bo nie
ma sensu sugerować mu tego jeszcze raz.
47
52. Wypełniamy podobieństwa II
1 #Loop through all rows, skip the user column,
2 # and fill with similarity scores
3 for i in range(len(data_sims.index)):
4 for j in range(1, len(data_sims.columns)):
5 user = data_sims.index[i]
6 product = data_sims.columns[j]
7
8 if data.ix[i][j] == 1:
9 data_sims.ix[i][j] = 0
10 else:
11 product_top_names = data_neighbours.ix[product][1:10]
12 product_top_sims = data_ibs.ix[product].order(
ascending = False)[1:10]
13 user_rank = data_banner.ix[user, product_top_names]
14
15 data_sims.ix[i][j] = getScore(user_rank,
product_top_sims)
48
53. Rekomendacje użytkownik-użytkownik
1 # Instead of top scores, we want to see banner ids
2 for i in range(len(data_sims.index)):
3 data_recommend.ix[i, 1:] = data_sims.ix[i, :]
4 .order(ascending = False).ix[1:7,].index.transpose()
49
58. Problemy z pomiarem błędu
• Skupienie się na dokładności może spowodować, że zgubimy to
czego szukamy.
• Różnorodność predykcji.
• Kontekst predykcji.
• Porządek predykcji.
• W praktyce staramy się przewidzieć tylko najwyższe oceny:
• RSME: może karać metodę, która dobrze radzi sobie na
produktach z wysokimi ocenami, a gorzej na innych produktach.
53
59. CF: złożoność
• Koszt znalezienia k najbardziej podobnych użytkowników:
O( X ), gdzie X to zbiór użytkowników.
• Zbyt kosztowne, żeby wykonać w czasie rzeczywistym.
• Można wyliczyć wcześniej.
• Naiwny algorytm potrzebuje O(k X ).
• Można to przyspieszyć:
• Szukanie najbliższych sąsiadów w wysokich wymiarach (LSH).
• Grupowanie (clustering).
• Redukcja wymiarów.
54
60. Wszystkie dane
• Wykorzystaj wszystkie dane:
• nie zmniejszaj danych tylko dlatego, żeby jakiś algorytm lepiej
działał.
• proste metody na dużych danych lepiej sobie radzą.
• Dodaj więcej danych:
• np. dodaj dane o gatunku w IMDB.
• Więcej danych potrafi pobić lepsze algorytmy.
55
63. Krzysztof Rykaczewski
• Krzysztof Rykaczewski ukończył doktorat z
matematyki na Uniwersytecie Mikołaja Kopernika
w Toruniu. Karierę rozpoczął pracując na
Uniwersytecie Warszawskim. W swoich badaniach
koncentruje się przede wszystkim na eksploracji
danych, uczeniu maszynowym, analizie nieliniowej
oraz teorii sterowania. Autor rozlicznych publikacji
oraz recenzent artykułów wielu międzynarodowych
czasopism naukowych.
• linkedin.com/in/krykaczewski/
• DLabs: dlabs.pl/
58