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.
źródło
Odpowiedzi:
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
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.
hclust
Zapewni masz szeregów czasowych, które reprezentują szeroki zakres charakterystyk szeregów czasowych w danych.źródło
Dwa podejścia do klasyfikacji szeregów czasowych
Istnieją dwa sposoby radzenia sobie z tymczasowymi danymi strukturalnymi dla zadań klasyfikacyjnych:
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 .
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.
źródło