Mam bazę danych z mojej aplikacji na Facebooku i staram się używać uczenia maszynowego do szacowania wieku użytkowników na podstawie tego, co lubią na Facebooku.
Istnieją trzy kluczowe cechy mojej bazy danych:
rozkład wieku w moim zestawie szkoleniowym (łącznie 12 tys. użytkowników) jest przekrzywiony w stosunku do młodszych użytkowników (tj. mam 1157 użytkowników w wieku 27 lat i 23 użytkowników w wieku 65 lat);
wiele witryn ma nie więcej niż 5 polubień (odfiltrowałem strony FB z mniej niż 5 polubieniami).
jest o wiele więcej funkcji niż próbek.
Moje pytania brzmią zatem: jaką strategię zaproponowałbyś w celu przygotowania danych do dalszej analizy? Czy powinienem wykonać redukcję wymiarów? Którą metodę ML najlepiej zastosować w tym przypadku?
Używam głównie Pythona, więc wskazówki dotyczące Pythona byłyby bardzo mile widziane.
źródło
Odpowiedzi:
Jedną rzeczą na początek byłoby k-NN. Chodzi o to, że masz macierz użytkowników / przedmiotów, a dla niektórych użytkowników masz zgłoszony wiek. Wiek osoby w matrycy przedmiotów użytkownika może być dobrze określony przez coś w rodzaju średniego lub średniego wieku kilku najbliższych sąsiadów w obszarze przedmiotów.
Tak więc każdy użytkownik wyrażony jest jako wektor w przestrzeni przedmiotów, znajdź najbliższych sąsiadów i przypisz temu wektorowi podsumowującą statystykę wieku najbliższych sąsiadów. Możesz wybrać k dla odcięcia odległości lub bardziej realistycznie, iteracyjnie przypisując wiek do przytrzymania pociągu i wybierając k, który minimalizuje błąd w tym przydziale.
Jeśli problemem jest wymiarowość, możesz z łatwością przeprowadzić redukcję w tym układzie przez rozkład pojedynczej wartości, wybierając wektory m, które wychwytują największą wariancję w grupie.
We wszystkich przypadkach, ponieważ każda funkcja jest binarna, wydaje się, że podobieństwo kosinusowe byłoby metryką odległości.
Muszę trochę więcej pomyśleć o innych podejściach (regresja, rf itp.), Biorąc pod uwagę wąskie skupienie twojej przestrzeni funkcji (wszystkie warianty tej samej akcji, polubienie). Myślę, że podejście użytkownika / przedmiotu może być najlepsze.
Jedna uwaga, jeśli wieki dla twojego pociągu są zgłaszane przez siebie, być może będziesz musiał poprawić niektóre z nich. Ludzie na Facebooku zwykle zgłaszają wiek w dekadzie, w której się urodzili. Wykreśl histogram dat urodzenia (pochodzących z wieków) i sprawdź, czy masz skoki w dekadach, takich jak lata 70., 80., 90.
źródło
sklearn.neighbors.KNeighborsRegressor
z metryką cosinus na przestrzeni zredukowanej SVD (po zastosowaniu SVD średni błąd oszacowania spadł z ~ 6 lat do ~ 4). Użytkownicy w mojej bazie danych mają 18–65 lat (starsi użytkownicy zostali odfiltrowani), więc istnieje 48 możliwych klas. Zastanawiam się, czy nie jest to zbyt wiele klas dla kNN i czy powinienem traktować to jako regresję czy problem klasyfikacji (myślę, że obie mają zastosowanie).Niedawno zrobiłem podobny projekt w Pythonie (przewidywanie opinii przy użyciu danych podobnych do FB) i miałem dobre wyniki w następującym podstawowym procesie:
W twoim przypadku musisz wymienić klasyfikator na regressor (więc patrz tutaj: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ), ale w przeciwnym razie ten sam proces powinien działać bez większych problemów.
Ponadto powinieneś zdawać sobie sprawę z najbardziej niesamowitej funkcji losowych lasów w Pythonie: natychmiastowa równoległość! Ci z nas, którzy zaczęli robić to w R, a następnie przeprowadzili się, są zawsze zaskoczeni, zwłaszcza gdy pracujesz na maszynie z kilkadziesiąt rdzeni (patrz tutaj: http://blog.yhathq.com/posts/comparing- random-woods-in-python-and-r.html ).
Na koniec zauważ, że byłaby to idealna aplikacja do analizy sieci, jeśli masz dane dotyczące znajomych, a także samych osób. Jeśli możesz przeanalizować wiek znajomych użytkownika, wiek użytkownika prawie na pewno będzie w ciągu roku lub dwóch mediany wśród jego znajomych, szczególnie jeśli użytkownicy są wystarczająco młodzi, aby zbudować sieci znajomych, będąc jeszcze w szkoła (ponieważ większość to koledzy z klasy). Ta prognoza prawdopodobnie przebije wszystkie modele. --- To jest podręcznikowy przykład problemu, w którym właściwe dane> właściwy model za każdym razem.
Powodzenia!
źródło
Inną sugestią jest przetestowanie regresji logistycznej . Jako dodatkowy bonus, wagi (współczynniki) modelu dadzą Ci wyobrażenie, które witryny są pozbawione znaczenia dla wieku.
Sklearn oferuje sklearn.linear_model.LogisticRegression pakiet zaprojektowany również do obsługi rzadkich danych.
Jak wspomniano w komentarzach, w niniejszej sprawie, przy większej liczbie zmiennych wejściowych niż w próbkach, należy uregulować model (w przypadku sklearn.linear_model.LogisticRegression użyj
penalty='l1'
argumentu).źródło
Niektóre badania D. Nguyena i in. spróbuj przewidzieć wiek użytkownika Twittera na podstawie jego tweetów. Może uznasz je za przydatne. Używają regresji logistycznej i liniowej.
źródło
Oprócz bardziej wyrafinowanych metod można wypróbować formułę Bayesa
P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))
P (I | p1 ... pn) to prawdopodobieństwo, że użytkownik należy do grupy wiekowej I, jeśli lubił p1, .., pn
P (i) to prawdopodobieństwo, że użytkownik należy do grupy wiekowej i
P (p1 .. pn | i) to prawdopodobieństwo, że użytkownik polubił p1, .., pn, jeśli należy do grupy wiekowej i.
Aby oszacować P (p1 ... pn | i), dla każdej grupy wiekowej szacuję prawdopodobieństwo (częstotliwość) p_ij, aby polubić stronę j. Aby p_ij było niezerowe dla wszystkich j, możesz mieszać częstotliwość dla całej populacji z niewielką wagą.
Następnie log P (p1 ... pn | i) = suma (log p_ij, i = p1, .., pn), suma na wszystkich stronach, które nowy użytkownik lubi. Ta formuła byłaby w przybliżeniu prawdziwa, zakładając, że użytkownik lubi strony w swojej grupie wiekowej niezależnie.
Jeśli Ty lub ktoś inny spróbowałeś tego, skomentuj wynik.
źródło
To bardzo interesujący problem.
Napotkałem podobny, analizując zdjęcia przesyłane przez użytkowników do sieci społecznościowej. Zastosowałem następujące podejście:
Podejście to jest częściowo nadzorowane, dlatego polecam je, jeśli masz tylko niektóre dane.
Zauważ, że w sieci społecznościowej ludzie zwykle kłamią na temat wieku (tylko dla zabawy, a czasem dlatego, że chcą się zamaskować w sieci społecznościowej).
źródło