Ho bisogno di aiuto su quello che dovrebbe essere il mio prossimo passo in un algoritmo che sto progettando.
A causa delle NDA, non posso rivelare molto, ma cercherò di essere generico e comprensibile.
Fondamentalmente, dopo diversi passaggi negli algoritmi, ho questo:
Per ogni cliente che ho e gli eventi che fanno durante un mese, durante i primi passi ho raggruppato gli eventi in diverse categorie (ogni cliente avrà gli eventi separati in categorie che vanno da 1 a x essendo x tra 1 e 25, generalmente le prime categorie hanno una maggiore densità di eventi rispetto alle altre).
Per ogni categoria e cliente ho creato una serie temporale che aggrega gli eventi del mese all'ora (ottenendo modelli di quando questi eventi vengono svolti). Inoltre sto usando un paio di variabili normalizzanti in base al numero di giorni in un mese (30 giorni) in cui il ragazzo esegue almeno un evento e il numero di giorni con almeno un evento sul totale dei giorni con almeno uno evento (aggregando tutti i cluster). Il primo mi dà un rapporto su quanto il cliente è attivo durante il mese e il secondo valuta la categoria rispetto agli altri.
Il tavolo finale è simile a questo
|*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 ...
Le variabili delle serie temporali sono la percentuale sul totale degli eventi al giorno per ciascuna categoria specifica (ciò significa che per ogni riga sommando tutte le variabili dovrebbe essere 1). Il motivo per farlo in questo modo è perché, ad esempio, una serie temporale con eventi 0 0 0 1 0
e 1 1 1 2 1
sono completamente diversi e la standardizzazione alla normalità darebbe risultati simili. E a causa dell'elevato disallineamento tra le diverse categorie, controllo i valori delle serie storiche indipendentemente dalle altre.
Quello che devo fare ora è identificare queste categorie (ricordate, possono essere da 1 a x essendo x qualsiasi numero da 1 a 25) in 3 tag: tag A, tag B e Nessuno di loro. Osservando queste variabili posso identificare manualmente a quale tag appartengono, e l'idea è quella di identificare manualmente il più possibile e utilizzare qualsiasi algoritmo di classificazione per imparare da ciò e identificarli tutti.
La mia idea era quella di utilizzare più regressioni logistiche sulla tabella, ma tutte le variabili delle serie temporali sono correlate (poiché sono una combinazione lineare l'una dell'altra), quindi ho pensato di usare meglio un algoritmo di clustering solo nelle serie temporali usando euclidean distanza per classificare i diversi modelli e utilizzare il risultato e le altre due variabili normalizzanti nella regressione logistica.
L'altra preoccupazione che ho è che questo approccio prende ogni riga indipendentemente dalle altre e, in teoria, per ogni cliente dovrebbero esserci solo 0 o 1 tag A, 0 o 1 tag B e il resto di loro dovrebbe essere Nessuno (un altro il suggerimento è che normalmente i tag A e B sono tra le prime categorie, perché è fortemente dipendente dalle funzionalità di normalizzazione (se i giorni sul totale sono alti, c'è un'alta possibilità che la riga sia A o B, a seconda del modello di serie temporale) .
Modifica: questa non è più una preoccupazione, eseguirò solo due diverse regressioni logistiche, una per Tag A o Altro e un'altra per Tag B o un'altra, con le probabilità di risultato che posso selezionare solo il meglio di ciascuna.
Il set di dati è enorme e l'algoritmo finale deve essere applicato utilizzando SQL (su Teradata), ma per ottenere i coefficienti della regressione logistica o i centri del cluster ho un campione e utilizzo R.