63
Python w analizie danych Krzysztof Rykaczewski 9 marca 2017 DLabs 1

DLabs PyData MeetUp 9/03/2017

  • Upload
    dlabs

  • View
    203

  • Download
    0

Embed Size (px)

Citation preview

Page 1: DLabs PyData MeetUp 9/03/2017

Python w analizie danych

Krzysztof Rykaczewski9 marca 2017

DLabs

1

Page 2: DLabs PyData MeetUp 9/03/2017

Analiza przypadku: rekomendacje reklam

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

2

Page 3: DLabs PyData MeetUp 9/03/2017

Outline

• Systemy rekomendujące• Implementacja

3

Page 4: DLabs PyData MeetUp 9/03/2017

Systemy rekomendujące

Page 5: DLabs PyData MeetUp 9/03/2017

Rekomendacje

4

Page 6: DLabs PyData MeetUp 9/03/2017

“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

Page 7: DLabs PyData MeetUp 9/03/2017

Długi ogon

6

Page 8: DLabs PyData MeetUp 9/03/2017

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

Page 9: DLabs PyData MeetUp 9/03/2017

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

Page 10: DLabs PyData MeetUp 9/03/2017

Macierz użyteczności

9

Page 11: DLabs PyData MeetUp 9/03/2017

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

Page 12: DLabs PyData MeetUp 9/03/2017

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

Page 13: DLabs PyData MeetUp 9/03/2017

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

Page 14: DLabs PyData MeetUp 9/03/2017

Systemy rekomendujące oparte otreść

Page 15: DLabs PyData MeetUp 9/03/2017

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

Page 16: DLabs PyData MeetUp 9/03/2017

Plan działania

14

Page 17: DLabs PyData MeetUp 9/03/2017

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

Page 18: DLabs PyData MeetUp 9/03/2017

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

Page 19: DLabs PyData MeetUp 9/03/2017

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

Page 20: DLabs PyData MeetUp 9/03/2017

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

Page 21: DLabs PyData MeetUp 9/03/2017

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

Page 22: DLabs PyData MeetUp 9/03/2017

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

Page 23: DLabs PyData MeetUp 9/03/2017

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

Page 24: DLabs PyData MeetUp 9/03/2017

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

Page 25: DLabs PyData MeetUp 9/03/2017

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

Page 26: DLabs PyData MeetUp 9/03/2017

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

Page 27: DLabs PyData MeetUp 9/03/2017

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

Page 28: DLabs PyData MeetUp 9/03/2017

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

Page 29: DLabs PyData MeetUp 9/03/2017

Produkt-produkt vs użytkownik-użytkownik

26

Page 30: DLabs PyData MeetUp 9/03/2017

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

Page 31: DLabs PyData MeetUp 9/03/2017

Produkt-produkt (‖N‖ = 2)

28

Page 32: DLabs PyData MeetUp 9/03/2017

Produkt-produkt (‖N‖ = 2)

29

Page 33: DLabs PyData MeetUp 9/03/2017

Produkt-produkt (‖N‖ = 2)

30

Page 34: DLabs PyData MeetUp 9/03/2017

Produkt-produkt (‖N‖ = 2)

31

Page 35: DLabs PyData MeetUp 9/03/2017

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

Page 36: DLabs PyData MeetUp 9/03/2017

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

Page 37: DLabs PyData MeetUp 9/03/2017

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

Page 38: DLabs PyData MeetUp 9/03/2017

Przykład implementacji

Page 39: DLabs PyData MeetUp 9/03/2017

Ł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

Page 40: DLabs PyData MeetUp 9/03/2017

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

Page 41: DLabs PyData MeetUp 9/03/2017

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

Page 42: DLabs PyData MeetUp 9/03/2017

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

Page 43: DLabs PyData MeetUp 9/03/2017

Rekomendacje produkt-produkt

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

39

Page 44: DLabs PyData MeetUp 9/03/2017

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

Page 45: DLabs PyData MeetUp 9/03/2017

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

Page 46: DLabs PyData MeetUp 9/03/2017

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

Page 47: DLabs PyData MeetUp 9/03/2017

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

Page 48: DLabs PyData MeetUp 9/03/2017

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

Page 49: DLabs PyData MeetUp 9/03/2017

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

Page 50: DLabs PyData MeetUp 9/03/2017

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

Page 51: DLabs PyData MeetUp 9/03/2017

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

Page 52: DLabs PyData MeetUp 9/03/2017

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

Page 53: DLabs PyData MeetUp 9/03/2017

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

Page 54: DLabs PyData MeetUp 9/03/2017

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

Page 55: DLabs PyData MeetUp 9/03/2017

Uwagi praktyczne

Page 56: DLabs PyData MeetUp 9/03/2017

Ewaluacja

51

Page 57: DLabs PyData MeetUp 9/03/2017

Ewaluacja

52

Page 58: DLabs PyData MeetUp 9/03/2017

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

Page 59: DLabs PyData MeetUp 9/03/2017

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

Page 60: DLabs PyData MeetUp 9/03/2017

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

Page 61: DLabs PyData MeetUp 9/03/2017

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

Page 62: DLabs PyData MeetUp 9/03/2017

• Dziękuję za uwagę!

57

Page 63: DLabs PyData MeetUp 9/03/2017

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