Ich brauche Hilfe bei meinem nächsten Schritt in einem Algorithmus, den ich entwerfe.
Aufgrund von NDAs kann ich nicht viel preisgeben, aber ich werde versuchen, allgemein und verständlich zu sein.
Grundsätzlich habe ich nach mehreren Schritten in den Algorithmen Folgendes:
Für jeden Kunden, den ich habe, und Ereignisse, die sie in einem Monat machen, habe ich in den ersten Schritten die Ereignisse in mehrere Kategorien gruppiert (bei jedem Kunden werden die Ereignisse in Kategorien unterteilt, die von 1 bis x gehen, wobei x zwischen 1 bis 25 liegt, In der Regel haben die ersten Kategorien eine größere Ereignisdichte als die anderen.
Für jede Kategorie und jeden Kunden habe ich eine Zeitreihe erstellt, in der die Ereignisse des Monats pro Stunde zusammengefasst sind (und Muster abgerufen werden, wann diese Ereignisse ausgeführt werden). Außerdem verwende ich ein paar normalisierende Variablen, die auf der Anzahl der Tage in einem Monat (30 Tage) basieren, an denen der Typ mindestens ein Ereignis durchführt, und auf der Anzahl der Tage mit mindestens einem Ereignis über die Gesamtzahl der Tage mit mindestens einem Ereignis (Aggregation aller Cluster). Der erste gibt mir ein Verhältnis, wie aktiv der Kunde während des Monats ist, und der zweite bewertet die Kategorie mit den anderen.
Der Final Table sieht so aus
|*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 ...
Die Zeitreihenvariablen sind der Prozentsatz über der Gesamtzahl der Ereignisse pro Tag in jeder bestimmten Kategorie (dies bedeutet, dass für jede Zeile, in der alle Variablen addiert werden, 1 angegeben werden sollte). Der Grund dafür , wie das zu tun ist , weil zum Beispiel eine Zeitreihe mit Ereignissen 0 0 0 1 0
und 1 1 1 2 1
völlig verschieden sind, und in den normalen Standardisierung zu ähnlichen Ergebnissen führen. Und aufgrund der starken Abweichung zwischen verschiedenen Kategorien überprüfe ich die Werte in den Zeitreihen unabhängig voneinander.
Was ich jetzt tun muss, ist, diese Kategorien zu identifizieren (denken Sie daran, sie können von 1 bis x sein, wobei x eine beliebige Zahl von 1 bis 25 ist) in 3 Tags: Tag A, Tag B und Keiner von ihnen. Wenn ich mir diese Variablen anschaue, kann ich manuell identifizieren, zu welchem Tag sie gehören. Die Idee ist, so viel wie möglich manuell zu identifizieren und einen beliebigen Klassifizierungsalgorithmus zu verwenden, um daraus zu lernen und alle zu identifizieren.
Meine Idee war es, mehrere logistische Regressionen für die Tabelle zu verwenden, aber alle Variablen der Zeitreihen sind korreliert (da sie eine lineare Kombination voneinander sind), daher dachte ich, ich sollte einen Clustering-Algorithmus nur für die Zeitreihen mit euklidischem Algorithmus verwenden Abstand, um die verschiedenen Muster zu kategorisieren und das Ergebnis und die beiden anderen normalisierenden Variablen in der logistischen Regression zu verwenden.
Die andere Sorge, die ich habe, ist, dass dieser Ansatz jede Zeile unabhängig von den anderen nimmt, und theoretisch sollte es für jeden Kunden nur 0 oder 1 Tag A, 0 oder 1 Tag B geben, und der Rest von ihnen sollte None sein (eine andere) Tipp: Normalerweise liegen Tag A und B zwischen den ersten Kategorien, da dies in hohem Maße von den Normalisierungsfunktionen abhängt. .
Bearbeiten: Dies ist kein Problem mehr. Ich führe nur zwei verschiedene logistische Regressionen durch, eine für Tag A oder Andere und eine andere für Tag B oder Andere. Mit den Ergebniswahrscheinlichkeiten kann ich jeweils nur die besten auswählen.
Der Datensatz ist riesig und der endgültige Algorithmus muss mit SQL (auf Teradata) angewendet werden, aber um die Koeffizienten der logistischen Regression oder die Zentren der Clusterbildung zu erhalten, erhalte ich eine Stichprobe und verwende R.
quelle
Antworten:
Ich weiß, dass es eine Weile her ist, dass die Frage gestellt wurde, aber für zukünftige Leser schlage ich hier eine andere Lösung für das Problem der Klassifizierung von Zeitreihen proportionaler Daten vor, dh Vektoren von Proportionen.
Hidden Markov Models (HMMs) werden häufig für die Klassifizierung von Zeitreihen verwendet. Die ursprünglichen Implementierungen wurden für diskrete und Gaußsche Daten entwickelt, aber seitdem wurden sie auf mehr Wahrscheinlichkeitsverteilungen erweitert.
Darunter befinden sich die Distributionen Dirichlet, Generalized Dirichlet und Beta-Liouville, die sich perfekt für die Arbeit mit proportionalen Daten eignen.
In der Regel wird für jede Kategorie (in dieser Frage "Tag") aus Zeitreihen, für die die Kategorie bekannt ist, ein Modell trainiert. Wenn eine neue Zeitreihe klassifiziert werden muss, wird ihre Wahrscheinlichkeit in Bezug auf jedes Modell berechnet. Die neue Zeitreihe wird in der Regel der Kategorie zugeordnet, die die höchste Wahrscheinlichkeit aufweist.
Hier sind die Nachschlagewerke für diese Modelle, die sie ausführlicher darstellen und alle für die Implementierung erforderlichen Gleichungen enthalten:
Für die zusätzlichen zwei in der Frage erwähnten Merkmale wurden HMMs für gemischte Daten auch in der folgenden Forschungsarbeit entwickelt: Hybrid-Hidden-Markov-Modell für gemischte kontinuierliche / kontinuierliche und diskrete / kontinuierliche Datenmodellierung, E. Epaillard, N. Bouguila, MMSP, Seiten 1-6, 2015.
Diese Modelle sind schwerer zu implementieren als Regressionsmodelle, haben jedoch den Vorteil, dass sie diskriminierende und generative Modelle sind und sich gut verallgemeinern lassen, wenn die verarbeiteten Daten eine gewisse Variabilität aufweisen.
quelle