Classificazione delle serie storiche - risultati molto scarsi


11

Sto lavorando a un problema di classificazione delle serie temporali in cui l'input sono dati di utilizzo vocale delle serie temporali (in secondi) per i primi 21 giorni di un account di telefono cellulare. La variabile target corrispondente è se quell'account è stato cancellato o meno nell'intervallo 35-45 giorni. Quindi è un problema di classificazione binaria.

Sto ottenendo risultati molto scarsi da tutti i metodi che ho provato finora (a vari livelli). Per prima cosa ho provato la classificazione k-NN (con varie modifiche) e ho ottenuto risultati estremamente negativi. Questo mi ha portato ad estrarre funzionalità dalle serie temporali - ovvero media, varianza, max, min, giorni zero totali, giorni zero finali totali, differenza tra media prima metà e media seconda metà, ecc. E le caratteristiche più predittive sembravano essere totali giorni zero e zero giorni finali totali (utilizzando diversi algoritmi di classificazione). Questo ha dato il meglio, ma le prestazioni non sono state ancora molto buone.

La mia prossima strategia era quella di sovrastampare le istanze negative nel mio set di allenamento dato che ce ne erano così poche. Ciò ha comportato una previsione di cancellazione più corretta ma a scapito di più falsi positivi.

Sto iniziando a pensare che forse i dati di utilizzo delle serie storiche non sono semplicemente molto predittivi (anche se il buon senso dice che dovrebbero essere). Forse c'è qualche variabile latente che non sto prendendo in considerazione. Guardare i dati mostra anche alcuni comportamenti strani. vale a dire che alcuni esempi mostrano un utilizzo molto ridotto o in diminuzione (o talvolta nessuno) e non si annullano, e alcuni mostrano un aumento dell'utilizzo che si annulla. Forse questo comportamento contraddittorio non genera un confine decisionale molto chiaro per un classificatore.

Un'altra possibile fonte di errore è il fatto che molti esempi di formazione sono molto scarsi (vale a dire molti giorni con 0 utilizzo). Un'idea che non ho ancora provato è quella di dividere le serie temporali in segmenti e generare alcune funzionalità in quel modo, ma non ho grandi speranze.


1
Per i principianti, ti consiglio di provare varianti di quanto segue.1. Aggrega i dati di utilizzo per ore / giorni. 2. Dai dati di allenamento, sovrapporre i grafici di queste serie temporali per vedere i modelli all'interno dei due gruppi. 3. Esplora vari modelli di serie temporali / regressione che si adattano bene ai tuoi dati. 4. Utilizzare i coefficienti del modello come funzioni per il classificatore.
Ramhiser,

Mi piace la tua tecnica di estrazione delle caratteristiche. Lo proverò. Mi sono convinto che i miei dati sono troppo scarsi per trovare schemi, ma chi lo sa. Grazie!
user1893354

Risposte:


13

Ho avuto un discreto successo applicando KNN con il warping Dynamic Time come metrica della distanza.

La mia ricerca (pdf) suggerisce che questo approccio è molto difficile da battere. Lo schema seguente è tratto dalla mia implementazione di Python di KNN e DTW su github . Oppure visualizza in Notebook IPython

KNN e DTW

Se il tuo set di dati di allenamento è molto grande, ti suggerisco di eseguire un raggruppamento gerarchico della matrice della distanza. Quindi campionare dai cluster desiderati per produrre il set di dati di allenamento più piccolo. Il hclustvi assicurerà serie temporali che rappresentano una vasta gamma di caratteristiche di serie temporali nei dati.


4
Potresti aggiornare il link al tuo documento di ricerca?
Tilaprimera,


10

I due approcci alla classificazione delle serie storiche

Esistono due modi per gestire l'input strutturato temporale per le attività di classificazione:

  1. Modello dedicato di serie temporali: l'algoritmo di apprendimento automatico incorpora direttamente le serie storiche. Conto il KNN con il modello DTW in questa categoria.
  2. Approccio basato sulle caratteristiche: qui le serie temporali sono mappate su un'altra rappresentazione, possibilmente di dimensione inferiore. Ciò significa che l'algoritmo di estrazione delle caratteristiche calcola caratteristiche come il valore medio o massimo delle serie temporali. Le funzioni vengono quindi passate come una matrice di caratteristiche a un "normale" machine learning come una rete neurale, una foresta casuale o una macchina vettoriale di supporto. Questo approccio ha il vantaggio di una migliore spiegabilità dei risultati. Inoltre ci consente di utilizzare una teoria ben sviluppata dell'apprendimento automatico supervisionato.

In passato stavo anche implementando con successo KNN con DTW. Tuttavia, sono stato quasi sempre in grado di battere la sua precisione con un modello che utilizza funzionalità ben progettate. Inoltre, KNN con DTW per le classificazioni binarie scala con O (n_t · m_ {train} · m_ {test}) con n_t la lunghezza delle serie temporali, mtrain e mtest il numero di dispositivi nel treno e nel set di test, rispettivamente . Ciò significa che i calcoli richiedono abbastanza tempo ..

Pertanto, consiglierei di perseguire un approccio basato sulle funzionalità.

tsfresh calcola un numero enorme di funzioni

Il pacchetto python tsfresh calcola un numero enorme di tali funzionalità da un panda.DataFrame contenente le serie temporali. Puoi trovare la sua documentazione su http://tsfresh.readthedocs.io .

inserisci qui la descrizione dell'immagine

Puoi provarlo per calcolare un'enorme quantità di funzionalità. Successivamente puoi filtrare le caratteristiche per il loro significato e identificare candidati promettenti.

Disclaimer: sono uno degli autori di Tsfresh.


Grazie mille per il tuo meraviglioso post. Ho una serie temporale molto piccola (ad es. 10 punti dati per serie storica). In tal caso, consiglieresti di usare tsfresh per il mio set di dati? Grazie :)
EmJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.