Potrzebuję pomocy na temat tego, jaki powinien być mój następny krok w projektowanym algorytmie.
Ze względu na NDA nie mogę wiele ujawnić, ale postaram się być ogólny i zrozumiały.
Zasadniczo po kilku krokach w algorytmach mam to:
Dla każdego mojego klienta i wydarzeń, które robią w ciągu miesiąca, w pierwszych krokach pogrupowałem wydarzenia w kilka kategorii (każdy klient będzie miał zdarzenia podzielone na kategorie, których wartości od 1 do x wynoszą x od 1 do 25, ogólnie pierwsze kategorie mają większą gęstość zdarzeń niż inne).
Dla każdej kategorii i klienta stworzyłem szereg czasowy agregujący zdarzenia miesiąca na godzinę (uzyskiwanie wzorców, kiedy te zdarzenia są wykonywane). Używam również kilku zmiennych normalizujących na podstawie liczby dni w ciągu miesiąca (30 dni), że facet wykonuje co najmniej jedno zdarzenie, oraz liczby dni z co najmniej jednym zdarzeniem w sumie dni z co najmniej jednym zdarzenie (agregowanie wszystkich klastrów). Pierwszy pokazuje stosunek aktywności klienta w ciągu miesiąca, a drugi porównuje kategorię z pozostałymi.
Stół finałowy wygląda tak
|*Identifier*| *firstCat* | *feature1* | *feature2* | { *(TIME SERIES)* }
CustomerID | ClusterID | DaysOver30 | DaysOverTotal | Events9AM Events10AM ...
xx | 1 | 0,69 | 0,72 | 0,2 0,13 ...
xx | 2 | 0,11 | 0,28 | 0,1 0,45 ...
xy | 1 | 0,23 | 0,88 | 0,00 0,60 ...
xy | 2 | 0,11 | 0,08 | 1,00 0,00 ...
xy | 3 | 0,10 | 0,04 | 0,40 0,60 ...
Zmienne szeregów czasowych są procentem w stosunku do całkowitej liczby zdarzeń na dzień dla każdej określonej kategorii (oznacza to, że dla każdego wiersza sumując wszystkie zmienne powinno wynosić 1). Powodem robi to tak jest, bo na przykład szeregu czasowego z wydarzeń 0 0 0 1 0
i 1 1 1 2 1
są zupełnie różne i standaryzacji do normy dałoby podobne wyniki. A ze względu na duże odchylenie między różnymi kategoriami, sprawdzam wartości w szeregu czasowym niezależnie od innych.
Teraz muszę zidentyfikować te kategorie (pamiętaj, że mogą to być od 1 do x, czyli x dowolna liczba od 1 do 25) w 3 znacznikach: znacznik A, znacznik B i Żaden z nich. Patrząc na te zmienne, mogę ręcznie zidentyfikować, do którego znacznika należą, a chodzi o to, aby zidentyfikować ręcznie tyle, ile mogę i użyć dowolnego algorytmu klasyfikującego, aby wyciągnąć z tego naukę i zidentyfikować je wszystkie.
Moim pomysłem było użycie wielu regresji logistycznych na stole, ale wszystkie zmienne szeregów czasowych są skorelowane (ponieważ są one liniową kombinacją), więc pomyślałem, że lepiej użyć algorytmu grupowania tylko w szeregach czasowych przy użyciu euklidesa odległość, aby skategoryzować różne wzorce i użyć wyniku oraz dwóch pozostałych zmiennych normalizujących w regresji logistycznej.
Innym problemem, który mam, jest to, że takie podejście bierze każdy wiersz niezależnie od innych i teoretycznie dla każdego klienta powinno być tylko 0 lub 1 znacznik A, 0 lub 1 znacznik B, a pozostały z nich powinien być Brak (inny wskazówka jest taka, że normalnie znaczniki A i B znajdują się pomiędzy pierwszymi kategoriami, ponieważ w dużym stopniu zależą od funkcji normalizujących (jeśli liczba dni powyżej sumy jest wysoka, istnieje duże prawdopodobieństwo, że wiersz jest albo A albo B, w zależności od wzorca szeregów czasowych) .
Edycja: To już nie jest problem, po prostu wykonam dwie różne regresje logistyczne, jedną dla Tagu A lub Innego i drugą dla Tagu B lub innego, z prawdopodobieństwami wyników mogę wybrać tylko najlepsze z nich.
Zbiór danych jest ogromny i ostateczny algorytm należy zastosować za pomocą SQL (na Teradata), ale aby uzyskać współczynniki regresji logistycznej lub centra klastrowania, pobieram próbkę i używam R.