Klasyfikacja szeregów czasowych - bardzo słabe wyniki

11

Pracuję nad problemem klasyfikacji szeregów czasowych, w którym dane wejściowe to dane użycia głosu w szeregu czasowym (w sekundach) przez pierwsze 21 dni konta telefonu komórkowego. Odpowiednią zmienną docelową jest to, czy to konto zostało anulowane w przedziale 35-45 dni. Jest to więc problem z klasyfikacją binarną.

Otrzymuję bardzo słabe wyniki ze wszystkich metod, które próbowałem do tej pory (w różnym stopniu). Najpierw próbowałem klasyfikacji k-NN (z różnymi modyfikacjami) i uzyskałem bardzo złe wyniki. To doprowadziło mnie do wyodrębnienia cech z szeregów czasowych - tj. Średniej, wariancji, maksimum, min, sumy zer dni, całkowitej końcowej liczby dni zero, różnicy między średnią pierwszą i drugą połową średniej itp., A najbardziej przewidywalne cechy wydawały się całkowite zerowe dni i końcowe końcowe zero dni (przy użyciu kilku algorytmów klasyfikacji). To działało najlepiej, ale wydajność nadal nie była bardzo dobra.

Moją następną strategią było przeanalizowanie negatywnych przypadków w moim zestawie treningowym, ponieważ było ich tak mało. Spowodowało to dokładniejsze przewidywanie anulowania, ale kosztem więcej fałszywych trafień.

Zaczynam myśleć, że być może same dane dotyczące wykorzystania szeregów czasowych po prostu nie są zbyt przewidywalne (choć zdrowy rozsądek mówi, że tak powinno być). Być może istnieje jakaś ukryta zmienna, której nie rozważam. Patrzenie na dane pokazuje również dziwne zachowanie. tzn. niektóre przykłady pokazują bardzo małe lub malejące użycie (lub czasami wcale) i nie anulują, a niektóre pokazują wzrost wykorzystania, które anulują. Być może to sprzeczne zachowanie nie generuje bardzo wyraźnej granicy decyzji dla klasyfikatora.

Innym możliwym źródłem błędu jest fakt, że wiele przykładów szkoleń jest bardzo rzadkich (tj. Wiele dni przy zerowym użyciu). Pomysłem, którego jeszcze nie próbowałem, jest podzielenie szeregów czasowych na segmenty i wygenerowanie w ten sposób niektórych funkcji, ale nie mam wielkich nadziei.

użytkownik1893354
źródło
1
Na początek polecam wypróbowanie następujących wariantów: 1. Agreguj dane użytkowania według godzin / dni. 2. Na podstawie danych treningowych nałóż wykresy tych szeregów czasowych, aby zobaczyć wzorce w dwóch grupach. 3. Poznaj różne modele szeregów czasowych / regresji, które dobrze pasują do twoich danych. 4. Użyj współczynników modelu jako funkcji klasyfikatora.
ramhiser
Podoba mi się twoja technika wyodrębniania obiektów. Spróbuję. Przekonałem się, że moje dane są zbyt rzadkie, aby znaleźć wzorce, ale kto wie. Dzięki!
user1893354,

Odpowiedzi:

13

Miałem całkiem niezły sukces stosując KNN z dynamicznym dopasowaniem czasu jako metryką odległości.

Moje badania (pdf) sugerują, że takie podejście jest bardzo trudne do pokonania. Poniższy schemat pochodzi z mojej implementacji KNN i DTW w Pythonie na github . Lub zobacz w IPython Notebook

KNN i DTW

Jeśli trenujesz zestaw danych jest bardzo duży, sugeruję wykonanie hierarchicznego grupowania macierzy odległości. Następnie próbkuj z pożądanych klastrów, aby uzyskać mniejszy zestaw danych treningowych. hclustZapewni masz szeregów czasowych, które reprezentują szeroki zakres charakterystyk szeregów czasowych w danych.

Mark Regan
źródło
4
Czy możesz zaktualizować link do swojego dokumentu badawczego?
tilaprimera
10

Dwa podejścia do klasyfikacji szeregów czasowych

Istnieją dwa sposoby radzenia sobie z tymczasowymi danymi strukturalnymi dla zadań klasyfikacyjnych:

  1. Dedykowany model szeregów czasowych: Algorytm uczenia maszynowego bezpośrednio uwzględnia szeregi czasowe. W tej kategorii zaliczam KNN z modelem DTW.
  2. Podejście oparte na cechach: tutaj szeregi czasowe są odwzorowane na inną, być może niższą, reprezentację. Oznacza to, że algorytm ekstrakcji cech oblicza takie cechy, jak średnia lub maksymalna wartość szeregów czasowych. Funkcje są następnie przekazywane jako macierz funkcji do „normalnego” uczenia maszynowego, takiego jak sieć neuronowa, losowy las lub maszyna wektorów pomocniczych. Podejście to ma tę zaletę, że lepiej wyjaśnia wyniki. Ponadto pozwala nam korzystać z dobrze rozwiniętej teorii nadzorowanego uczenia maszynowego.

W przeszłości z powodzeniem wdrażałem KNN z DTW. Jednak prawie zawsze byłem w stanie pokonać jego dokładność za pomocą modelu, który wykorzystuje dobrze zaprojektowane funkcje. Ponadto KNN z DTW dla binarnych skal klasyfikacji z O (n_t · m_ {pociąg} · m_ {test}), gdzie n_t jest długością szeregu czasowego, mtrain i mtest odpowiednio liczbą urządzeń w pociągu i zestawie testowym . Oznacza to, że obliczenia trwają dość długo.

Dlatego zalecałbym podejście oparte na cechach.

tsfresh oblicza ogromną liczbę funkcji

Pakiet python tsfresh oblicza ogromną liczbę takich funkcji z pandas.DataFrame zawierającej szeregi czasowe. Dokumentację można znaleźć na stronie http://tsfresh.readthedocs.io .

wprowadź opis zdjęcia tutaj

Możesz spróbować obliczyć ogromną liczbę funkcji. Później możesz przefiltrować funkcje pod kątem ich znaczenia i zidentyfikować obiecujących kandydatów.

Oświadczenie: Jestem jednym z autorów tsfresh.

MaxBenChrist
źródło
Wielkie dzięki za wspaniały post. Mam naprawdę małe szeregi czasowe (np. 10 punktów danych na szereg czasowy). W takim przypadku, czy poleciłbyś użyć tsfresh dla mojego zestawu danych? Dziękuję :)
EmJ