dlabs pydata meetup 9/03/2017

Post on 12-Apr-2017

204 Views

Category:

Data & Analytics

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Python w analizie danych

Krzysztof Rykaczewski9 marca 2017

DLabs

1

Analiza przypadku: rekomendacje reklam

• Problem: niski współczynnik konwersji (CTR) w reklamachonline w dużej platformie ad-management w Polsce.

2

Outline

• Systemy rekomendujące• Implementacja

3

Systemy rekomendujące

Rekomendacje

4

“Od nieurodzaju do dostatku”

• Wolna przestrzeń na półce to towar deficytowy dla sprzedawcydetalicznego.

• Sieć umożliwia niemal darmowe udostępnienie informacji oproduktach.

• Przykłady:• książki, muzyka, filmy, ludzie (znajomi z Facebook-a).

5

Długi ogon

6

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

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

Macierz użyteczności

9

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

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

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

Systemy rekomendujące oparte otreść

Rekomendacje oparte o treść

• Główna idea: rekomenduj użytkownikowi rzeczy podobne dorzeczy 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

Plan działania

14

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

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

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

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

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

Plusy tego podejścia

• Nie potrzeba informacji od innych użytkowników: brak zimnegostartu 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 produktpoprzez wgląd w cechy, które spowodowały jego rekomendację.

20

Minusy podejścia

• Znalezienie odpowiednich cech jest trudne, np.: obrazki, filmy,muzyka etc.

• Rekomendacje dla nowych użytkowników: jak zbudować profiluż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

Filtrowanie społecznościowe:Wykorzystanie jakości osądówinnych użytkowników

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

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 jaknegatywne.

• 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

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

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 = 1k

∑y∈N ry,i .

• rx,i =∑

y∈Nsx,y ry,i∑

y∈Nsx,y

, gdzie sx,y = sim(x , y).

• Wiele innych możliwości. . .

25

Produkt-produkt vs użytkownik-użytkownik

26

Filtrowanie społecznościowe produkt-produkt

• Do tej pory omawialiśmy filtrowanie społecznościoweuż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

Produkt-produkt (‖N‖ = 2)

28

Produkt-produkt (‖N‖ = 2)

29

Produkt-produkt (‖N‖ = 2)

30

Produkt-produkt (‖N‖ = 2)

31

Produkt-produkt vs użytkownik-użytkownik

• W praktyce zaobserwowano, że podejście produkt-produktdziała lepiej niż użytkownik-użytkownik.

• Dlaczego? Produkty są proste, a użytkownicy mająróżne/zmienne gusty.

32

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 rekomendacjipopularnych produktów.

33

Metody hybrydowe

• Można zaimplementować dwa lub więcej różne systemyrekomendacji 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

Przykład implementacji

Ładujemy główne biblioteki

1 # --- Import Libraries --- #2 import pandas as pd3 from scipy.spatial.distance import cosine4

5 # --- Read Data --- #6 events = pd.read_csv('data.csv')

35

Przyjrzyjmy się danym

1 print events.head().ix[:, 2:10]

User ID Advertiser ID Campaign ID Banner ID \0 AAAGTHsdebojV3i_I1ddkw 14748 21090 2010901 AAAGTHsdebojV3i_I1cjkw 14748 21090 2010902 AAAGTHsdebojV3i_I1dNsQ 14748 21090 2008923 AAAGTHsdebojV3i_I1dKnw 14748 21090 2010904 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 view3 14751 826507 view [7407]4 14751 4611686018427387905 click [7406,7407]

36

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

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 nadany 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

Rekomendacje produkt-produkt

1 # --- Start Item Based Recommendations --- #2 # Drop any column named "user_placement"3 data_banner = data.drop('user_placement', 1)

39

Rekomendacje produkt-produkt

• Zanim policzymy podobieństwa musimy mieć miejsce, żeby jetrzymać.

• 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. item2 data_ibs = pd.DataFrame(index = data_banner.columns, \3 columns = data_banner.columns)

• Zaczniemy ją wpełniać podobieństwami, a do tego potrzebnanam będzie funkcja podobieństwa cosine.

40

Liczenie podobieństwa

1 # Lets fill in those empty spaces with cosine similarities2 # Loop through the columns3 for i in range(len(data_ibs.columns)):4 # Loop through the columns for each column5 for j in range(len(data_ibs.columns)):6 # Fill in placeholder with cosine similarities7 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 listcomprehension.

41

Szukamy produktów w otoczeniu

• Mając policzone podobieństwa w data_ibs dla każdegoproduktu będziemy poszukiwać produktów, które są munajbliższe.

1 # Create a placeholder items for closes neighbours to an item2 data_neighbours = pd.DataFrame(index = data_ibs.columns, \3 columns = range(1, 11))4

5 # Loop through our similarity dataframe6 # and fill in neighbouring item names7 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

Wyniki: produkt-produkt

1 print data_neighbours.head(6).ix[:6, 2:10]

2 3 4 5 6 7 8 9201345 201090 200892 201093 200595 201494 200557 200695 200587200578 200879 201419 200533 200594 201464 201379 200599 200663201182 200663 201340 201363 201092 201355 201544 201162 201361200557 200569 200590 201379 201179 200592 200562 201352 201349201361 200559 200601 201435 200879 201563 201487 200598 201388201385 201139 201335 201402 201360 200559 201356 200668 200941

43

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

Funkcja podobieństwa

1 # --- Start User Based Recommendations --- #2

3 # Helper function to get similarity scores4 def getScore(history, similarities):5 return sum(history * similarities) / sum(similarities)

45

Przygotowanie zmiennych

• Tworzymy zmienną na potrzeby przetrzymywania podobieństwa.

1 # Create a place holder matrix for similarities,2 # and fill in the user name column3 data_sims = pd.DataFrame(index = data.index, \4 columns = data.columns)5 data_sims.ix[:, :1] = data.ix[:, :1]

46

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

Wypełniamy podobieństwa II

1 #Loop through all rows, skip the user column,2 # and fill with similarity scores3 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

Rekomendacje użytkownik-użytkownik

1 # Instead of top scores, we want to see banner ids2 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

Wyniki: użytkownik-użytkownik

1 # Print a sample2 print data_recommend.ix[:5, :5]

user_placement 1 2 3 40 ('AAAGS3tzeAsjV3i_I1ccPA', 827046) 200895 201090 200605 2011831 ('AAEGTHtpeLYjV3i_I1cj3Q', 632093) 201336 201536 201294 2011802 ('AAEGTHsPeu4jV3i_I1d-fg', 827455) 201347 201091 200593 2014193 ('AAAGS3trepkjV3i_I1cjkg', 827145) 201344 201338 201359 2011464 ('AAAGS3tlefEjV3i_I1cMfw', 588717) 200584 200578 200563 200582

50

Uwagi praktyczne

Ewaluacja

51

Ewaluacja

52

Problemy z pomiarem błędu

• Skupienie się na dokładności może spowodować, że zgubimy toczego 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

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

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

Referencje

• Rysunki zostały zaczerpnięte z:• Mining of Massive Datasets, Jure Leskovec, Anand

Rajaraman, Jeff Ullman – Stanford University, 2006• http://cs246.stanford.edu

56

• Dziękuję za uwagę!

57

Krzysztof Rykaczewski

• Krzysztof Rykaczewski ukończył doktorat zmatematyki na Uniwersytecie Mikołaja Kopernikaw Toruniu. Karierę rozpoczął pracując naUniwersytecie Warszawskim. W swoich badaniachkoncentruje się przede wszystkim na eksploracjidanych, uczeniu maszynowym, analizie nieliniowejoraz teorii sterowania. Autor rozlicznych publikacjioraz recenzent artykułów wielu międzynarodowychczasopism naukowych.

• linkedin.com/in/krykaczewski/• DLabs: dlabs.pl/

58

top related