Zeitreihenklassifikation - sehr schlechte Ergebnisse

11

Ich arbeite an einem Zeitreihenklassifizierungsproblem, bei dem die Eingabe Zeitreihen-Sprachnutzungsdaten (in Sekunden) für die ersten 21 Tage eines Mobiltelefonkontos sind. Die entsprechende Zielvariable ist, ob dieses Konto im Bereich von 35 bis 45 Tagen gekündigt wurde oder nicht. Es handelt sich also um ein binäres Klassifizierungsproblem.

Ich erhalte sehr schlechte Ergebnisse mit allen Methoden, die ich bisher ausprobiert habe (in unterschiedlichem Maße). Zuerst habe ich die k-NN-Klassifizierung (mit verschiedenen Modifikationen) ausprobiert und extrem schlechte Ergebnisse erzielt. Dies führte mich dazu, Merkmale aus den Zeitreihen zu extrahieren - dh Mittelwert, Varianz, Max, Min, Gesamtzahl der Nulltage, Gesamtzahl der nachfolgenden Nulltage, Differenz zwischen dem Durchschnitt der ersten Hälfte und dem Durchschnitt der zweiten Hälfte usw. - und die prädiktivsten Merkmale schienen insgesamt zu sein Null-Tage und insgesamt nachfolgende Null-Tage (unter Verwendung mehrerer Klassifizierungsalgorithmen). Dies war die beste Leistung, aber die Leistung war immer noch nicht sehr gut.

Meine nächste Strategie bestand darin, die negativen Instanzen in meinem Trainingsset zu übertasten, da es so wenige davon gab. Dies führte zu einer korrekteren Stornierungsvorhersage, jedoch auf Kosten von mehr falsch positiven Ergebnissen.

Ich fange an zu denken, dass die Zeitreihen-Nutzungsdaten selbst einfach nicht sehr prädiktiv sind (obwohl der gesunde Menschenverstand dies vorschreibt). Vielleicht gibt es eine latente Variable, die ich nicht in Betracht ziehe. Das Betrachten der Daten zeigt auch ein seltsames Verhalten. Das heißt, einige Beispiele zeigen eine sehr geringe oder abnehmende Nutzung (oder manchmal gar keine) und werden nicht abgebrochen, und einige zeigen eine Zunahme der Nutzung, die abgebrochen wird. Vielleicht erzeugt dieses widersprüchliche Verhalten keine sehr klare Entscheidungsgrenze für einen Klassifikator.

Eine weitere mögliche Fehlerquelle ist die Tatsache, dass viele Trainingsbeispiele sehr spärlich sind (dh viele Tage mit 0 Verwendung). Eine Idee, die ich noch nicht ausprobiert habe, ist, die Zeitreihen in Segmente aufzuteilen und auf diese Weise einige Funktionen zu generieren, aber ich habe keine großen Hoffnungen.

user1893354
quelle
1
Für den Anfang empfehle ich Ihnen, Varianten der folgenden zu versuchen.1. Aggregieren Sie die Nutzungsdaten nach Stunden / Tagen. 2. Überlagern Sie anhand Ihrer Trainingsdaten Diagramme dieser Zeitreihen, um Muster innerhalb der beiden Gruppen anzuzeigen. 3. Untersuchen Sie verschiedene Zeitreihen- / Regressionsmodelle, die gut zu Ihren Daten passen. 4. Verwenden Sie die Modellkoeffizienten als Merkmale für Ihren Klassifikator.
Ramhiser
Ich mag Ihre Feature-Extraktionstechnik. Ich werde es versuchen. Ich bin überzeugt, dass meine Daten zu spärlich sind, um Muster zu finden, aber wer weiß. Vielen Dank!
user1893354

Antworten:

13

Ich hatte ziemlich gute Erfolge bei der Anwendung von KNN mit Dynamic Time Warping als Entfernungsmetrik.

Meine Forschung (pdf) legt nahe, dass dieser Ansatz sehr schwer zu übertreffen ist. Das folgende Schema stammt aus meiner Python-Implementierung von KNN und DTW auf Github . Oder in IPython Notebook anzeigen

KNN und DTW

Wenn Ihr Trainingsdatensatz sehr groß ist, empfehle ich, eine hierarchische Gruppierung der Distanzmatrix durchzuführen. Dann Stichproben aus gewünschten Clustern, um Ihren kleineren Trainingsdatensatz zu erstellen. Dadurch hclustwird sichergestellt, dass Sie Zeitreihen haben, die eine breite Palette von Zeitreihenmerkmalen in Ihren Daten darstellen.

Mark Regan
quelle
4
Könnten Sie den Link zu Ihrem Forschungsbericht aktualisieren?
Tilaprimera
10

Die beiden Ansätze zur Klassifizierung von Zeitreihen

Es gibt zwei Möglichkeiten, mit zeitlich strukturierten Eingaben für Klassifizierungsaufgaben umzugehen:

  1. Spezielles Zeitreihenmodell: Der Algorithmus für maschinelles Lernen bezieht die Zeitreihen direkt ein. Ich zähle das KNN mit DTW-Modell in dieser Kategorie.
  2. Funktionsbasierter Ansatz: Hier werden die Zeitreihen einer anderen, möglicherweise niedrigerdimensionalen Darstellung zugeordnet. Dies bedeutet, dass der Merkmalsextraktionsalgorithmus Merkmale wie den Durchschnitts- oder Maximalwert der Zeitreihe berechnet. Die Merkmale werden dann als Merkmalsmatrix an ein "normales" maschinelles Lernen wie ein neuronales Netzwerk, eine zufällige Gesamtstruktur oder eine Unterstützungsvektormaschine übergeben. Dieser Ansatz hat den Vorteil einer besseren Erklärbarkeit der Ergebnisse. Darüber hinaus können wir eine gut entwickelte Theorie des überwachten maschinellen Lernens anwenden.

Ich habe KNN in der Vergangenheit auch erfolgreich mit DTW bereitgestellt. Ich war jedoch fast immer in der Lage, seine Genauigkeit mit einem Modell zu übertreffen, das gut gestaltete Funktionen verwendet. Außerdem skaliert KNN mit DTW für binäre Klassifikationen mit O (n_t · m_ {Zug} · m_ {Test}), wobei n_t die Länge der Zeitreihe ist, wobei mtrain und mtest die Anzahl der Geräte im Zug bzw. im Testsatz sind . Dies bedeutet, dass die Berechnungen ziemlich lange dauern.

Daher würde ich empfehlen, einen funktionsbasierten Ansatz zu verfolgen.

tsfresh berechnet eine Vielzahl von Funktionen

Das Python-Paket tsfresh berechnet eine große Anzahl solcher Funktionen aus einem pandas.DataFrame, der die Zeitreihen enthält. Die Dokumentation finden Sie unter http://tsfresh.readthedocs.io .

Geben Sie hier die Bildbeschreibung ein

Sie können versuchen, eine große Anzahl von Funktionen zu berechnen. Später können Sie die Features nach ihrer Bedeutung filtern und vielversprechende Kandidaten identifizieren.

Haftungsausschluss: Ich bin einer der Autoren von tsfresh.

MaxBenChrist
quelle
Vielen Dank für Ihren wunderbaren Beitrag. Ich habe eine sehr kleine Zeitreihe (z. B. 10 Datenpunkte pro Zeitreihe). Würden Sie in diesem Fall die Verwendung von tsfresh für meinen Datensatz empfehlen? Vielen Dank :)
EmJ