PYTANIA
Grupowanie unikalnych użytkowników według useragent, ip, session_id
Biorąc pod uwagę dane dostępu do witryny w postaci session_id, ip, user_agent i opcjonalnie znacznik czasu, zgodnie z poniższymi warunkami, w jaki sposób najlepiej zgrupować sesje w unikalnych użytkowników? session_id: to identyfikator nadawany każdemu nowemu odwiedzającemu. Nie wygasa jednak, jeśli użytkownik nie akceptuje plików cookie / usuwa pliki cookie / zmienia przeglądarkę / zmienia urządzenie, nie będzie już rozpoznawany Adres IP może być współużytkowany przez różnych użytkowników (Wyobraź sobie darmową kawiarnię Wi-Fi lub zmianę adresu IP przez Twojego dostawcę usług internetowych), i często będą mieli co najmniej 2, dom i praca. User_agent to wersja przeglądarki + systemu operacyjnego, umożliwiająca rozróżnienie urządzeń. Na przykład użytkownik prawdopodobnie będzie korzystał zarówno z telefonu, jak i laptopa, ale raczej nie będzie korzystał z laptopów z systemem Windows i Apple. Jest mało prawdopodobne, aby ten sam identyfikator sesji miał wielu użytkowników.
Oczywiście mówimy o założeniach, ale chodzi o to, aby zbliżyć się do rzeczywistości tak, jak to możliwe. Na przykład, jeśli napotkamy ten sam adres IP i identyfikator użytkownika w ograniczonym przedziale czasowym z innym identyfikatorem session_id, można założyć, że jest to ten sam użytkownik, z pewnymi wyjątkami dotyczącymi krawędzi.
Edycja: język, w którym problem został rozwiązany, nie ma znaczenia, dotyczy głównie logiki, a nie implementacji. Pseudokod jest w porządku.
Edycja: ze względu na powolny charakter skrzypiec możesz alternatywnie czytać / uruchamiać mysql:
select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from
(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
from
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
order by 1
)d
inner join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 )e
on d.nr>=e.nr
ODPOWIEDZI:
Jedną z możliwości, jest zdefiniowanie „stabilnego użytkownika”. Dla podanych informacji możesz sobie wyobrazić utworzenie id_użytkownika, który jest skrótem adresu IP i niektórych informacji o kliencie użytkownika (pseudo-kod):
uid = MD5Hash (ip + UA.device + UA.model)
Następnie oflagujesz te identyfikatory jako „stabilne” lub „niestabilne” na podstawie heurystyki użytkowania, którą obserwujesz dla użytkowników. Może to być próg liczby wizyt w danym oknie czasowym, czas przechowywania plików cookie, pewne działania końcowe w witrynie (zdaję sobie sprawę, że nie zostało to określone w Twoim oryginalnym dzienniku) itp.
Chodzi o to, aby oddzielić użytkowników, którzy nie opuszczają plików cookie, od tych, którzy to robią. Stąd możesz przypisać session_ids do stabilnych UID z twoich logów. Będziesz wtedy miał „resztki” session_ids dla niestabilnych użytkowników, co do których jesteś stosunkowo niepewny. Być może sesje są nadmiernie lub niedostatecznie liczone, przypisując zachowanie wielu osobom, gdy jest tylko jedna itd. Ale to jest co najmniej ograniczone do użytkowników, których jesteś teraz „mniej pewny”. Następnie wykonujesz analizy na stabilnej grupie i projektujesz ją na niestabilną grupę. Weźmy na przykład liczbę użytkowników, znasz całkowitą liczbę sesji, ale nie masz pewności, ilu użytkowników wygenerowało te sesje. Możesz znaleźć # sesji / unikalnego stabilnego użytkownika i użyć go do wyświetlenia „szacunkowej” liczby unikalnych użytkowników w niestabilnej grupie, ponieważ znasz liczbę sesji przypisanych do tej grupy.
projected_num_unstable_users = num_sess_unstable / num_sess_per_stable_uid
To nie pomaga w dochodzeniu na poziomie użytkownika dotyczącym niestabilnych użytkowników, ale możesz przynajmniej uzyskać przebieg z kohorty stabilnych użytkowników, którzy utrzymują się przez pewien czas. Za pomocą różnych metod możesz projektować zachowanie i zaliczać się do niestabilnej grupy. Powyżej jest prostym przykładem czegoś, co możesz chcieć wiedzieć. Ogólnym pomysłem jest ponowne zdefiniowanie zestawu użytkowników, których zachowanie jest pewne, zmierzenie tego, co chcesz zmierzyć, i wykorzystanie pewnych podstawowych prawd (liczba wyszukiwań, odwiedzin, kliknięć itp.) W celu wyświetlenia w nieznanej przestrzeni użytkownika i oszacowania im. Jest to długotrwały problem związany z unikalnym liczeniem użytkowników, logowaniem itp.… W przypadku usług, które nie wymagają logowania.
Z tymi danymi niewiele możesz zrobić, ale to, co niewiele możesz zrobić, nie zależy od uczenia maszynowego. Tak, sesje z tego samego adresu IP, ale różni użytkownicy użytkownika są prawie na pewno różnymi użytkownikami. Sesje z tym samym adresem IP i User-Agent to zwykle ten sam użytkownik, z wyjątkiem serwerów proxy / punktów dostępu Wi-Fi. Te, które możesz zidentyfikować, patrząc na rozkład liczby sesji według adresu IP, aby zidentyfikować prawdopodobne „zagregowane” adresy IP. Sesje z tego samego IP / User-Agent, które nakładają się w czasie, są prawie na pewno różne. Aby dodatkowo rozróżnić użytkowników, potrzebujesz więcej informacji. Na przykład witryny lub adresy IP, z którymi łączy się użytkownik, byłyby bardzo mocną podstawą do rozróżnienia sesje. Następnie możesz przejść do bardziej wyrafinowanej nauki, aby dowiedzieć się, kiedy sesje są tymi samymi lub różnymi użytkownikami.
K-średnie vs. K-średnie online
K-średnich jest dobrze znanym algorytmem do tworzenia klastrów, ale istnieje również wariant online takiego algorytmu (K-średnich online). Jakie są zalety i wady tych podejść i kiedy należy je preferować?
K-średnie online (bardziej znane jako sekwencyjne k-średnie) i tradycyjne k-średnie są bardzo podobne. Różnica polega na tym, że k-średnich online umożliwia aktualizację modelu po otrzymaniu nowych danych. Online k-średnich należy używać, gdy oczekujesz, że dane będą odbierane jeden po drugim (a może w kawałkach). Umożliwia to aktualizację modelu w miarę uzyskiwania dodatkowych informacji na jego temat. Wadą tej metody jest to, że zależy ona od kolejności otrzymywania danych
Oryginalna publikacja k-średnie MacQueena (pierwsza, która używa nazwy „kmeans”) jest algorytmem online. Po przypisaniu każdego punktu średnia jest stopniowo aktualizowana za pomocą prostej formuły średniej ważonej (stara średnia jest ważona n, nowa obserwacja jest ważona 1, jeśli średnia miała n obserwacji wcześniej). O ile mi wiadomo, miało to również być pojedyncze przejście tylko przez dane, chociaż można to wielokrotnie powtarzać w trywialny sposób, aby ponownie przypisać punkty do zbieżności. MacQueen zwykle zbiera mniej iteracji niż Lloyds, jeśli dane są tasowane (ponieważ aktualizuje średnią szybciej!). Na zamówionych danych może to mieć problemy. Z drugiej strony wymaga więcej obliczeń dla każdego obiektu, więc każda iteracja trwa nieco dłużej (oczywiście dodatkowe operacje matematyczne).
Grupowanie danych z długimi ogonami / pareto przed grupowaniem
Chcę zgrupować zestaw danych o długich ogonach / pareto w kilka przedziałów (w rzeczywistości numer przedziału nie jest jeszcze określony). Czy mogę zastosować jakieś algorytmy lub modele?
Istnieje kilka podejść. Możesz zacząć od drugiego.
Partycjonowanie równej szerokości (odległość):
* Dzieli zakres na N przedziałów o równej wielkości: jednolita siatka
* jeśli A i B są najniższą i najwyższą wartością atrybutu, szerokość przedziałów będzie wynosić: W = (B-A) / N.
* Najprostsze – Wartości odstające mogą zdominować prezentację – Przekrzywione dane nie są odpowiednio obsługiwane.
Podział na jednakową głębokość (częstotliwość):
* Dzieli zakres na N przedziałów, z których każdy zawiera w przybliżeniu taką samą liczbę próbek
* Dobre skalowanie danych
* Zarządzanie atrybutami kategorycznymi może być trudne.
Inne metody
* Ranga: Ranga liczby to jej wielkość w stosunku do innych wartości zmiennej numerycznej. Najpierw sortujemy listę wartości, a następnie przypisujemy pozycję wartości jako jej pozycję. Te same wartości otrzymują tę samą rangę, ale obecność zduplikowanych wartości wpływa na szeregi kolejnych wartości (np. 1,2,3,3,5). Ranga jest solidną metodą grupowania z jedną główną wadą, wartości mogą mieć różne stopnie na różnych listach.
* Kwantyle (mediana, kwartyle, percentyle, …): Kwantyle są również bardzo duże ale użyteczne metody grupowania, ale jak Ranga, jedna wartość może mieć inny kwantyl, jeśli lista wartości się zmieni.
* Funkcje matematyczne: Na przykład binowanie logarytmiczne jest skuteczną metodą dla zmiennych numerycznych o silnie przekrzywionym rozkładzie (np. Dochód).
Binning oparty na Entropii
Metoda oparta na entropii wykorzystuje podejście podzielone. Entropia (lub treść informacyjna) jest obliczana na podstawie etykiety klasy. Intuicyjnie znajduje najlepszy podział, dzięki czemu pojemniki są tak czyste, jak to możliwe, to znaczy większość wartości w pojemniku odpowiada tej samej etykiecie klasy. Formalnie charakteryzuje się znalezieniem podziału z maksymalnym zyskiem informacji.
Jaki jest najlepszy algorytm Data Mining do prognozowania na podstawie pojedynczej zmiennej?
Mam zmienną, której wartość chciałbym przewidzieć i chciałbym użyć tylko jednej zmiennej jako predyktora. Na przykład przewiduj natężenie ruchu na podstawie pogody. Początkowo myślałem o użyciu map samoorganizujących się (SOM), które wykonują bez nadzoru klastrowanie + regresję. Ponieważ jednak ma on istotny składnik redukcji wymiarów, uważam go za bardziej odpowiedni dla dużej liczby zmiennych. Czy warto używać go dla jednej zmiennej jako predyktora? Być może istnieją bardziej odpowiednie techniki dla tego prostego przypadku: w tytule mojego pytania użyłem „Data Mining” zamiast „uczenia maszynowego”, ponieważ myślę, że może regresja liniowa mogłaby wykonać zadanie…
Powszechną zasadą w uczeniu maszynowym jest wypróbowanie prostych rzeczy w pierwszej kolejności. Do przewidywania zmiennych ciągłych nie ma nic bardziej podstawowego niż prosta regresja liniowa. „Prosty” w nazwie oznacza, że używana jest tylko jedna zmienna predykcyjna (+ przecięcie, oczywiście):
y = b0 + x * b1
gdzie b0 jest przecięciem, a b1 jest nachyleniem. Na przykład możesz przewidzieć zużycie lemoniady w parku na podstawie temperatury:
cons = b0 + temp * b1
Temperatura jest dobrze zdefiniowaną zmienną ciągłą. Ale jeśli mówimy o czymś bardziej abstrakcyjnym, takim jak „pogoda”, trudniej jest zrozumieć, w jaki sposób mierzymy i kodujemy. Można powiedzieć, że pogoda przyjmuje wartości {okropne, złe, normalne, dobre, doskonałe} i przypisuje wartości liczbowe od -2 do +2 (co oznacza, że „doskonała” pogoda jest dwa razy lepsza niż „dobra”). Ale co, jeśli pogodę podają słowa {błyszcząca, deszczowa, chłodna, …}? Nie możemy uporządkować tych zmiennych. Takie zmienne nazywamy kategorycznymi. Ponieważ nie ma naturalnego porządku między różnymi kategoriami, nie możemy zakodować ich jako jednej zmiennej liczbowej (a regresja liniowa oczekuje tylko liczb), ale możemy zastosować tak zwane kodowanie zastępcze: zamiast jednej zmiennej pogodowej używamy 3 zmiennych – [weather_shiny, weather_rainy, weather_cool], z których tylko jedna może przyjąć wartość 1, i inne powinny przyjmować wartość 0. W rzeczywistości będziemy musieli upuścić jedną zmienną z powodu kolinearności. Model przewidywania ruchu na podstawie pogody może więc wyglądać następująco:
traffic = b0 + weather_shiny * b1 + weather_rainy * b2 # weather_cool spadł tam, gdzie b1 lub b2 wynosi 1 lub oba są równe 0. Zauważ, że możesz również napotkać nieliniową zależność między zmiennymi predykcyjnymi i przewidywanymi (możesz to łatwo sprawdzić, wykreślając (x, y) pary). Najprostszym sposobem radzenia sobie z nim bez odmowy modelu liniowego jest użycie funkcji wielomianu – wystarczy dodać wielomiany swojej funkcji jako nowe funkcje. Na przykład. na przykład temperatura (w przypadku zmiennych zastępczych tak nie jest i ma sens, ponieważ 1 ^ n i 0 ^ n są nadal 1 i 0 dla dowolnego n):
traffic = b0 + temp * b1 + temp ^ 2 * b2 [+ temp ^ 3 * b3 + …]
Korzystanie z klastrowania w przetwarzaniu tekstu
Chcę stworzyć algorytm do klasyfikacji tekstu. Załóżmy, że mam duży zestaw tekstu i artykułów. Powiedzmy, że około 5000 zwykłych tekstów. Najpierw używam prostej funkcji do określenia częstotliwości wszystkich czterech i więcej słów znakowych. Następnie używam tego jako cechy każdej próbki treningowej. Teraz chcę, aby mój algorytm mógł grupować zestawy szkoleniowe zgodnie z ich funkcjami, czyli tutaj jest częstotliwość każdego słowa w artykule. (Zauważ, że w tym przykładzie każdy artykuł by to zrobił , mają swoją unikalną cechę, ponieważ każdy artykuł ma inną funkcję, na przykład artykuł ma 10 „wody i 23„ czystej ”, a inny ma 8„ polityki ”i 14„ dźwigni ”). Czy możesz zasugerować najlepszy możliwy algorytm grupowania dla tego przykładu?
Analizując słowa, pomyśl, że „komputer”, „komputery”, „komputeryzacja”… reprezentują jedną koncepcję, a więc tylko jedną cechę. Bardzo ważne dla poprawnej analizy. Mówiąc o algorytmie klastrowania, możesz użyć hierarchicznego klastrowania. Na każdym etapie algo łączysz 2 najbardziej podobne teksty zgodnie z ich cechami (na przykład za pomocą miary odmienności, na przykład odległości euklidesowej). Dzięki takiemu współczynnikowi podobieństwa możesz znaleźć najlepszą liczbę klastrów, a tym samym najlepszą klaster dla swoich tekstów i artykułów.
Jeśli chcesz podążać swoją dotychczasową ścieżką, sugeruję znormalizowanie częstotliwości każdego terminu według jego popularności w całym korpusie, dlatego promowane są rzadkie, a zatem przewidujące słowa. Następnie użyj losowych rzutów, aby zmniejszyć wymiary bardzo długich wektorów do rozmiarów, aby algorytm grupowania działał lepiej (nie chcesz grupować w przestrzeniach o dużych wymiarach). Istnieją jednak inne sposoby modelowania tematów.
Nie można powiedzieć, że jest najlepsza, ale ukryta analiza semantyczna może być jedną z opcji. Zasadniczo opiera się na współwystępowaniu, musisz najpierw go zważyć.
http://en.wikipedia.org/wiki/Latent_semantic_analysis
http://lsa.colorado.edu/papers/dp1.LSAintro.pdf
Problem polega na tym, że LSA nie ma solidnego wsparcia statystycznego.
Szybkie k-średnie jak algorytm dla 10 ^ 10 punktów?
Szukam k-średnie do grupowanie na zbiorze punktów 10-wymiarowych. Haczyk: jest 10 ^ 10 punktów. Szukam tylko środka i wielkości największych klastrów (powiedzmy od 10 do 100 klastrów); Nie dbam o to, w jakim klastrze kończy się każdy punkt. Używanie k-średnich nie jest ważne; Właśnie szukam podobnego efektu, każdy przybliżony średni k lub związany z nim algorytm byłby świetny (minibatch-SGD oznacza…). Ponieważ GMM jest w pewnym sensie tym samym problemem co k-znaczy, robienie GMM na danych o tym samym rozmiarze jest również interesujące. W tej skali podpróbkowanie danych prawdopodobnie nie zmienia znacząco wyniku: szanse znalezienia tych samych 10 najlepszych klastrów przy użyciu 1/10000 próbki danych są bardzo dobre. Ale nawet wtedy jest to problem 10 ^ 6 punktów, który jest na / poza krawędzią możliwą do przełknięcia.
k-średnie opiera się na średnich. Modeluje klastry za pomocą środków, dlatego poprawa poprzez dodanie większej ilości danych jest marginalna. Błąd średniej oceny zmniejsza się o 1 / sqrt (n); więc dodając więcej danych opłaca się coraz mniej… Strategie dla tak dużych danych zawsze opierają się na próbkowaniu: jeśli chcesz podprogramowego środowiska wykonawczego, musisz próbkować! W rzeczywistości Mini-Batch-Kmeans itp. Robią dokładnie to: wielokrotnie próbkując z zestawu danych. Jednak próbkowanie (w szczególności próbkowanie bezstronne) również nie jest całkowicie bezpłatne… zazwyczaj musisz odczytać dane liniowo, aby pobrać próbkę, ponieważ nie masz losowego dostępu do indywidualnych rekordów. Wybrałbym algorytm MacQueena. To jest online; domyślnie wykonuje pojedyncze przełożenie danych (chociaż popularne jest iterowanie). Dystrybucja nie jest łatwa, ale myślę, że możesz sobie pozwolić na liniowy odczyt swoich danych, powiedz 10 razy z dysku SSD?
Jako komentarz boczny zauważ, że użycie k-średnich dla danych 10D może skończyć się nigdzie zgodnie z przekleństwem wymiarowości. Oczywiście różni się nieco w zależności od charakteru danych, ale kiedy próbowałem ustalić próg, w którym K-Means zaczyna zachowywać się dziwnie w odniesieniu do wymiaru, otrzymałem coś w rodzaju 7D. Po 7 wymiarach zaczęło brakować poprawnych klastrów (moje dane zostały wygenerowane ręcznie zgodnie z 4 dobrze oddzielonymi rozkładami Gaussa i użyłem funkcji kmeans MATLAB do mojego małego eksperymentu).
Jak utworzyć klastry danych pozycji?
Zadaję to pytanie, ponieważ poprzednie nie było zbyt pomocne i zapytałem o inne rozwiązanie tego samego problemu.
Problem Mam pozycje boczne, xcoord, pojazdów w czasie, które zostały zarejestrowane jako odległości od prawej krawędzi drogi. Można to zobaczyć dla jednego pojazdu poniżej wątek:
autko.PNG (do tłumaczenia)
Każdy punkt na wykresie reprezentuje pozycję przedniego środka pojazdu. Kiedy pojazd zmienia pas (numery pasów nie pokazano), następuje drastyczna zmiana pozycji, jak widać po „Początku zmiany pasa” na wykresie. Dane leżące u podstaw tego wykresu są następujące:
Vehicle.ID Frame.ID xcoord Lane
1 2 13 16,46700 2
2 2 14 16,44669 2
3 2 15 16,42600 2
4 2 16 16.40540 2
5 2 17 16,38486 2
6 2 18 16,36433 2
Chcę zidentyfikować początkowe i końcowe punkty danych zmiany linii, grupując dane, jak pokazano na wykresie. Punkty danych na wykresie zaznaczone na czerwono są bardziej do siebie podobne, ponieważ różnica między nimi jest mniejsza w porównaniu do punktów danych na środku
które widzą duże różnice w pozycji (xcoord). Moje pytania brzmią: czy można zastosować jakąkolwiek technikę grupowania, aby segmentować te dane w taki sposób że mogę zidentyfikować punkt początkowy i końcowy zmiany pasa? Jeśli tak, która technika byłaby najbardziej odpowiednia? Używam R. Wcześniej próbowałem grupowania hierarchicznego, ale nie wiem, jak go zastosować w tym kontekście.
Wątpię, aby którykolwiek z algorytmów klastrowania działał dobrze. Zamiast tego powinieneś przyjrzeć się: segmentacji (tak, to coś innego), w szczególności wykrywaniu zmiany segmentacji szeregów czasowych (jak powiedziałeś, najpierw jest raczej stały rozkład, potem zmiana, a potem raczej stały rozkład, regresja segmentowa może również działać: spróbuj znaleźć najlepsze dopasowanie, które jest stałe, liniowo zmieniające się i stałe ponownie. Zasadniczo w tym ograniczonym modelu należy zoptymalizować cztery parametry: średnia przed i po + początku i końcu przejścia.