2012-01-20 12 views
5

mi piacerebbe trovare quale sia il modo migliore per rilevare i valori anomali. ecco il problema e alcune cose che probabilmente non funzioneranno. diciamo che vogliamo analizzare alcuni dati quasi uniformi da una colonna dirty varchar (50) in mysql. iniziamo facendo un'analisi per lunghezza della stringa.rilevamento di valori anomali in una distribuzione sparsa?

| strlen | freq | 
|  0 | 2312 | 
|  3 |  45 | 
|  9 |  75 | 
|  10 | 15420 | 
|  11 | 395 | 
|  12 | 114 | 
|  19 |  27 | 
|  20 | 1170 | 
|  21 |  33 | 
|  35 |  9 | 

cosa vorrei fare è elaborare un algoritmo per determinare quale lunghezza stringa ha una elevata probabilità di essere volutamente unico anziché essere typeo di rifiuti o casuale. questo campo ha la possibilità di essere un tipo "enum", quindi ci possono essere diversi picchi di frequenza per valori validi. chiaramente 10 e 20 sono validi, 0 è solo dati omessi. 35 e 3 potrebbero essere alcuni rifiuti casuali nonostante entrambi siano molto diversi nella frequenza. 19 e 21 potrebbero essere type-os attorno al formato 20. 11 potrebbe essere di tipo OS per 10, ma che dire di 12?

sembra semplicemente utilizzare la frequenza di occorrenza% non è sufficiente. c'è bisogno di hotspots di probabilità più alta "solo un errore" attorno ai valori anomali ovvi.

anche, con una soglia fissa non riesce quando ci sono 15 lunghezze univoche che possono variare tra 5-20 caratteri, ciascuna con occorrenza tra il 7% e il 20%.

deviazione standard non funziona perché si basa sulla media. la deviazione assoluta mediana probabilmente non funzionerà perché si può avere un valore anomalo ad alta frequenza che non può essere scartato.

sì, ci saranno altri parametri per la pulizia dei dati nel codice, ma la lunghezza sembra molto rapidamente prefiltrare e classificare i campi con qualsiasi quantità di struttura.

esistono metodi noti che funzionino in modo efficiente? Non ho molta familiarità con i filtri bayesiani o con l'apprendimento automatico ma forse possono aiutarti?

grazie! leon

+0

+1 per la domanda interessante – cctan

risposta

2

Suoni come il rilevamento delle anomalie è il modo in cui andare. Il rilevamento di anomalie è una sorta di apprendimento automatico che viene utilizzato per trovare valori anomali. È disponibile in un paio di varietà, comprese quelle supervisionate e non sorvegliate. Nell'apprendimento supervisionato, l'algoritmo si sta allenando utilizzando esempi di valori anomali. Nell'apprendimento non supervisionato, l'algoritmo tenta di trovare valori anomali senza alcun esempio. Qui ci sono un paio di link per iniziare:

http://en.wikipedia.org/wiki/Anomaly_detection

http://s3.amazonaws.com/mlclass-resources/docs/slides/Lecture15.pdf

non ho trovato alcun legame con prontamente disponibili librerie. Qualcosa come MATLAB, o il suo cugino libero, Octave, potrebbe essere un bel modo se non riesci a trovare una libreria di rilevamento anomalie nella tua lingua preferita. https://goker.wordpress.com/tag/anomaly-detection/

+0

grazie, questo è molto interessante e sembra essere azzeccato, ma non sembra abbastanza facile da implementare per essere utile per il mio progetto :(Continuerò a esplorare alcuni più semplici ponderati - l'implementazione decente che è decentemente efficace – leeoniya

+0

anche questo: http://en.wikipedia.org/wiki/Local_outlier_factor – leeoniya

+0

@leeoniya. Il fattore anomalo locale sembra un'ottima scelta L'articolo a cui si fa riferimento include un grafico di Dim2 rispetto a Dim1, che in questo caso sarebbe la frequenza rispetto alla lunghezza della stringa ... Sembra abbastanza semplice da implementare, ma non c'è molto da vedere nell'articolo. Puoi indicarci alcune fonti diverse dai riferimenti ai documenti alla fine dell'articolo – ahoffer

Problemi correlati