Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

DLabs PyData MeetUp 9/03/2017

419 views

Published on

PyData meetup in Gdansk - 9/03/2017

Published in: Data & Analytics
  • Be the first to comment

  • Be the first to like this

DLabs PyData MeetUp 9/03/2017

  1. 1. Python w analizie danych Krzysztof Rykaczewski 9 marca 2017 DLabs 1
  2. 2. Analiza przypadku: rekomendacje reklam • Problem: niski współczynnik konwersji (CTR) w reklamach online w dużej platformie ad-management w Polsce. 2
  3. 3. Outline • Systemy rekomendujące • Implementacja 3
  4. 4. Systemy rekomendujące
  5. 5. Rekomendacje 4
  6. 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
  7. 7. Długi ogon 6
  8. 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. 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
  10. 10. Macierz użyteczności 9
  11. 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. 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. 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
  14. 14. Systemy rekomendujące oparte o treść
  15. 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
  16. 16. Plan działania 14
  17. 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. 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. 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. 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. 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. 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. 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
  24. 24. Filtrowanie społecznościowe: Wykorzystanie jakości osądów innych użytkowników
  25. 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. 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. 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. 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
  29. 29. Produkt-produkt vs użytkownik-użytkownik 26
  30. 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
  31. 31. Produkt-produkt ( N = 2) 28
  32. 32. Produkt-produkt ( N = 2) 29
  33. 33. Produkt-produkt ( N = 2) 30
  34. 34. Produkt-produkt ( N = 2) 31
  35. 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. 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. 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
  38. 38. Przykład implementacji
  39. 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. 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. 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. 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. 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. 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. 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. 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
  47. 47. Wyniki: produkt-produkt 1 print data_neighbours.head(6).ix[:6, 2:10] 2 3 4 5 6 7 8 9 201345 201090 200892 201093 200595 201494 200557 200695 200587 200578 200879 201419 200533 200594 201464 201379 200599 200663 201182 200663 201340 201363 201092 201355 201544 201162 201361 200557 200569 200590 201379 201179 200592 200562 201352 201349 201361 200559 200601 201435 200879 201563 201487 200598 201388 201385 201139 201335 201402 201360 200559 201356 200668 200941 43
  48. 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. 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. 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. 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. 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. 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
  54. 54. Wyniki: użytkownik-użytkownik 1 # Print a sample 2 print data_recommend.ix[:5, :5] user_placement 1 2 3 4 0 ('AAAGS3tzeAsjV3i_I1ccPA', 827046) 200895 201090 200605 201183 1 ('AAEGTHtpeLYjV3i_I1cj3Q', 632093) 201336 201536 201294 201180 2 ('AAEGTHsPeu4jV3i_I1d-fg', 827455) 201347 201091 200593 201419 3 ('AAAGS3trepkjV3i_I1cjkg', 827145) 201344 201338 201359 201146 4 ('AAAGS3tlefEjV3i_I1cMfw', 588717) 200584 200578 200563 200582 50
  55. 55. Uwagi praktyczne
  56. 56. Ewaluacja 51
  57. 57. Ewaluacja 52
  58. 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. 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. 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
  61. 61. 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
  62. 62. • Dziękuję za uwagę! 57
  63. 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

×