Eliminare l’incertezza dal rilevamento delle anomalie lasciate che gli istogrammi impostino la soglia

Sconfiggere l'incertezza nel rilevamento delle anomalie affidati agli istogrammi per stabilire la soglia

Immergiti velocemente nel codice Python

Foto di Randy Fath su Unsplash. Pedina di colore diverso che rappresenta un valore anomalo di colori.

Nel campo del rilevamento delle anomalie, la ricerca di irregolarità nascoste è simile alla ricerca di tesori nascosti in un vasto panorama di dati. Tuttavia, anche con gli algoritmi e le tecniche più avanzate di rilevamento delle anomalie a disposizione, c’è una decisione critica da prendere: dove tracciare la linea tra ciò che viene considerato un’anomalia e ciò che non lo è?

Benvenuti nel affascinante mondo della selezione della soglia di rilevamento delle anomalie, un passaggio cruciale nel processo di rilevamento delle anomalie. È la soglia che determina cosa viene individuato come insolito e cosa rimane entro i limiti della normalità. Trovare quel delicato equilibrio è la chiave per sbloccare preziose intuizioni, dalla individuazione di transazioni fraudolente all’identificazione di malfunzionamenti dell’attrezzatura e altro ancora.

Tuttavia, come ogni avventura, non è priva di sfide. La selezione della soglia corretta richiede una profonda comprensione dei dati, degli obiettivi specifici dell’analisi e un pizzico di intuizione. Questa decisione può fare la differenza tra sfruttare appieno il potenziale del rilevamento delle anomalie e affogare in un mare di falsi allarmi.

cosa è considerato normale? Questa domanda è al centro della definizione della soglia di rilevamento delle anomalie, una parte vitale del processo che può determinare il successo o il fallimento del tuo sistema di rilevamento delle anomalie.

In questo blog, esploreremo un modo più semplice per scegliere la soglia corretta. Esamineremo un metodo che utilizza la distribuzione dei punteggi in un istogramma per alleggerire il carico di lavoro. È un cambiamento epocale per migliorare l’accuratezza del rilevamento delle anomalie non supervisionato.

Rilevamento della soglia di taglio dell’istogramma (HCTT)

Tipicamente, quando imposti un sistema di rilevamento delle anomalie, devi decidere se un dato è un’anomalia assegnandogli uno score di 0 o 1. Ma cosa succede se non sei sicuro?

Per ora, saltiamo la parte complessa della costruzione del modello e concentriamoci su una sfida comune: la maggior parte dei blog assume che tu sappia già quante anomalie ci sono nei tuoi dati. Ma se non lo sai?

Ecco dove entrano in gioco i metodi di rilevamento delle anomalie supervisionati e semi-supervisionati. Sono come una rete di sicurezza, ma c’è un piccolo problema. I dati possono cambiare nel tempo, quindi devi monitorare il tuo sistema e regolare la soglia quando le cose cambiano. È un passaggio cruciale che molti blog trascurano, ma è essenziale nelle applicazioni reali.

Unisciti a me mentre semplifichiamo il processo di scelta della soglia corretta per il rilevamento delle anomalie. Scomponiamo le complessità e ti mostreremo come adattarti ai dati in evoluzione. Trovare la soglia perfetta è come trovare la strada attraverso un labirinto, e io sono qui per guidarti.

Questo metodo è semplice, una volta che hai adattato il tuo modello di riferimento ai dati corrispondenti, avrai sempre un metodo per determinare il punteggio di anomalia. Per una distribuzione gaussiana può essere il logaritmo delle probabilità, per K-Means la distanza dal centroide, ecc. Ma c’è un dettaglio: hai ora uno score per determinare se tale valore ha senso in base all’intero gruppo e con questo stiamo lavorando. Per farlo, separiamo il grafico della distribuzione in 100 bin, ci aspettiamo che questo istogramma rifletta un cambiamento ogni variazione del 1% sui dati accumulati ed è lì che selezioniamo la soglia corrispondente.

Grafico che rappresenta la rappresentazione del conteggio tramite taglio dell'istogramma. Immagine dell'autore.

Dopo aver analizzato l’istogramma, riesci a individuare la nostra direzione? Riesci a suggerire una soglia basata sulla distribuzione dell’istogramma? Possiamo determinare una soglia quando si verifica una disconnessione evidente tra i bin dei punteggi. Tuttavia, la sfida sta nell’integrare tutto ciò in una funzione algoritmica. Dobbiamo definire uno o due parametri principali, opzionali, che possono essere determinati in base alle tue intuizioni osservative. I parametri scelti dovrebbero idealmente essere robusti ai cambiamenti se impostati intuitivamente. Questi potrebbero essere la Differenza Percentuale e la Distribuzione Cumulativa dei Dati (opzionali).

Grafico che rappresenta i bin degli outlier confrontati con la differenza percentuale e la distribuzione cumulativa dei dati. Immagine dell'autore.

Taglio della Differenza Percentuale: Questa è la differenza nella proporzione accumulata tra un bin dell’istogramma e il successivo. Si prega di notare che l’ordine può variare a seconda dell’uso dell’algoritmo. Ad esempio, se si sta considerando una miscela gaussiana e si utilizza la probabilità logaritmica, il taglio dei bin dovrebbe essere eseguito da destra a sinistra. D’altra parte, se si utilizza Kmeans e si misura la distanza dal centroide, i bin devono essere elaborati da sinistra a destra, considerando sinistra come valori negativi e destra come valori positivi. Una configurazione compresa tra il 3% e il 6% spesso produce risultati robusti. Questo è il punto in cui l’aggiunta di nuovi dati non modifica significativamente la distribuzione accumulata in precedenza, quindi possiamo decidere di effettuare il taglio. Dati mappati dopo questo punto non corrisponderanno alla maggioranza.

Distribuzione Cumulativa dei Dati (Opzionale): Questo parametro si basa principalmente su una selezione intuitiva dei criteri di allarme. Può essere impostato come limite superiore della proporzione di outlier che si desidera consentire all’algoritmo di rilevare. Ad esempio, se non si desidera che più del 20% dei dati venga segnalato come outlier, questo può fungere da doppio controllo sicuro.

Come si può vedere, questo algoritmo è semplice ed intuitivo. Ho deciso di condividere questo metodo perché non ho trovato altri metodi di rilevamento trasferibili, indipendentemente dal modello utilizzato. Credo che altri possano trovare questo approccio interessante per i loro scopi.

Diamo un’occhiata e vediamo quanto funziona bene!

Azione!

Esempio 1: Miscela Gaussiana

Iniziamo lavorando con il Modello di Miscela Gaussiana. Creeremo osservazioni anomale utilizzando la libreria PyOD. Inizialmente, genereremo dati in cui la percentuale di outlier è del 15%. Questa è la proporzione che vogliamo identificare utilizzando l’algoritmo proposto.

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom pyod.utils.data import generate_datafrom sklearn.mixture import GaussianMixturecontamination = 0.15 # percentuale di outliersn_train = 1000      # numero di punti di addestramenton_test = 100        # numero di punti di testn_features = 6      # numero di caratteristicheX_train, X_test, y_train, y_test = generate_data(    n_train=n_train,     n_test=n_test,     n_features= n_features,     contamination=contamination,     random_state=123)X_train_pd = pd.DataFrame(X_train)X_train_pd.head()

Dai dati già sappiamo quali sono i punti anomali (y=1) e quali no (y=0). Con questo, testeremo se funziona. Prima effettuiamo un adattamento di una Miscela Gaussiana al modello

df_model = X_train_pdgm = GaussianMixture(n_components = 1, covariance_type = 'full', random_state=0)gm.fit(df_model)df_model['log'] = gm.score_samples(df_model)

Adesso tracciamo l’istogramma per controllare le probabilità log di ogni valore

Osserviamo uno spostamento netto nel valore -5, possiamo inferire che tutto a sinistra di -5 potrebbe essere un outlier. Ora mettiamo in funzione il nostro algoritmo di taglio. Imposteremo il Taglio della Differenza Percentuale a 0.005 e la Distribuzione Cumulativa dei Dati a 80%.

perc_dif = 0.0005cum_perc = 0.8df_histogram_change = df_model['log'].value_counts(bins=100).sort_index(ascending=False)df_histogram_change = pd.DataFrame(df_histogram_change)df_histogram_change['cumsum'] = df_histogram_change['log'].cumsum()df_histogram_change['index'] = range(len(df_histogram_change))df_histogram_change['cumsum_diff'] = df_histogram_change['cumsum'].pct_change()df_histogram_change['interval'] = df_histogram_change.indexdf_histogram_change['cum_pct'] = df_histogram_change['cumsum']/sum(df_histogram_change['log'])df_histogram_changefilter_df = df_histogram_change[(df_histogram_change['cumsum_diff']<perc_dif) & (df_histogram_change['cum_pct']>cum_perc)]index = filter_df.iloc[0]['index']tresh = df_histogram_change.index[index].leftdf_model = df_model.copy()df_model['outlier'] = np.where(df_model ['log']<tresh,1,0)

Il dataframe dell’istogramma corrispondente che contiene le variabili di nostro interesse

Si noti che “cumsum” rappresenta la somma cumulativa da destra a sinistra sul grafico dell’istogramma. “cumsum_diff” si riferisce alla differenza tra i bin e “cum_pct” rappresenta la percentuale dei valori rispetto al numero totale di valori.

Ora vogliamo determinare con questo metodo che la soglia determinata dal metodo è 0,15 (15%)

df_cases = df_model['outlier'].value_counts()df_cases[1]/sum(df_cases)#0.15

Possiamo vedere che la differenza tra i valori stimati e quelli reali è 0.

Esempio 2: K-means su serie temporali

Raffiniamo il nostro approccio basato sulla metodologia delineata nel blog associato, che utilizza il k-means per analizzare le anomalie dei dati delle serie temporali. Tuttavia, diventa evidente che c’è margine per un miglioramento nella selezione della soglia.

from sklearn.cluster import KMeansfrom numpy import sqrt, random, array, argsortfrom sklearn.preprocessing import scaleimport matplotlib.pyplot as plt

Generiamo i dati corrispondenti

random.seed(123)def makeData(N):  x = []  for i in range(N):      a = i/1000 + random.uniform(-3, 2)      r = random.uniform(-5, 10)      if(r >= 9.9):            r = r + 10      elif(r<(-4.8)):          r = r +(- 10)                   x.append([a + r])       return array(x)x = makeData(500)

Facciamone un grafico

x_ax = range(500)plt.title("Serie Temporali")plt.xlabel('Tempo')plt.ylabel('Valore')plt.plot(x_ax, x)plt.show()

Applichiamo il modello K-means e scaliamo l’insieme di dati per lavorare con questo metodo

x = scale(x)kmeans = KMeans(n_clusters = 1).fit(x)center = kmeans.cluster_centers_distance = sqrt((x - center)**2)df = pd.DataFrame(x)df['distance'] = distance

Facciamo il grafico dell’istogramma corrispondente dei punteggi

import seaborn as snsplt.figure(    figsize=(10, 6),  # Imposta qui la dimensione della figura    dpi=100,  # Imposta qui il dpi (o la risoluzione)sns.histplot(data=df, x="distance", bins=100)# Imposta il sottotitoloplt.title(    "Istogramma di Log",  # Testo del sottotitolo    fontsize=14)  # Imposta la dimensione del font)

È fondamentale notare che questo metodo è progettato per funzionare da sinistra a destra, poiché l’entità del punteggio corrisponde a una maggiore distanza dal centro. Comprendere questo aspetto fondamentale è essenziale per applicare il metodo.

df_histogram_change = df['distance'].value_counts(bins=100).sort_index(ascending=True)df_histogram_change = pd.DataFrame(df_histogram_change)df_histogram_change['cumsum'] = df_histogram_change['distance'].cumsum()df_histogram_change['index'] = range(len(df_histogram_change))df_histogram_change['cumsum_diff'] = df_histogram_change['cumsum'].pct_change()df_histogram_change['interval'] = df_histogram_change.indexdf_histogram_change['cum_pct'] = df_histogram_change['cumsum']/sum(df_histogram_change['distance'])df_histogram_changefilter_df = df_histogram_change[(df_histogram_change['cumsum_diff']<0.0005) & (df_histogram_change['cum_pct']>0.8)]index = filter_df.iloc[0]['index']tresh = df_histogram_change.index[index].leftdf = df.copy()df['outlier'] = np.where(df['distance']>tresh,1,0)#tresh 1.99

La soglia è 1,99, dopo di che tutto sarà considerato un valore anomalo

indici = df[df['outlier']==1].indexvalori = df.loc[indici,0]

Ora tracciamo gli outlier e voilà! Funziona alla perfezione

Nel vivace panorama della rilevazione delle anomalie, in cui è fondamentale distinguere tra dati normali e insoliti, il processo di impostazione della soglia di rilevazione delle anomalie assume un ruolo centrale. Questo blog approfondisce le complessità di questo processo decisionale, sottolineando il suo ruolo cruciale nel fornire insights preziosi, dalla rilevazione delle transazioni fraudolente all’individuazione di malfunzionamenti dell’attrezzatura.

Riconoscendo le sfide connesse alla scelta della soglia corretta, il blog introduce il metodo di rilevazione taglio istogramma (HCT – Histogram Cut Detection) come soluzione rivoluzionaria. L’HCT semplifica il processo di impostazione della soglia utilizzando la distribuzione dei punteggi in un istogramma, offrendo un approccio più accessibile ed accurato alla rilevazione non supervisionata delle anomalie.

Il metodo, dimostrato attraverso esempi come i modelli Gaussian Mixture e K-Means, prevede la separazione del grafico di distribuzione in 100 bin, ciascuno riflettendo una variazione del 1% dei dati accumulati. Questa analisi dettagliata consente una selezione intuitiva delle soglie basata su una disconnessione evidente dei bin dei punteggi.

Il blog introduce inoltre parametri chiave, come la Differenza Percentuale e la Distribuzione Cumulativa dei Dati, per migliorare l’adattabilità e la robustezza dell’algoritmo ai cambiamenti. Questi parametri aggiungono un livello intuitivo alla determinazione della soglia, garantendo l’efficacia dell’algoritmo nel tempo.

Nell’applicazione pratica, il blog presenta la semplicità e l’efficacia del metodo, incoraggiando i lettori a testarne le prestazioni nei loro specifici scenari di rilevazione delle anomalie. Gli esempi dimostrati illustrano l’applicabilità del metodo a diversi modelli e ne evidenziano il potenziale per un uso diffuso.

In conclusione, il metodo di rilevazione taglio istogramma offre un approccio semplice, intuitivo e trasferibile all’impostazione della soglia per la rilevazione delle anomalie. Condiviso con l’obiettivo di beneficiare gli altri nel settore, il blog incoraggia i lettori ad esplorare e implementare questo metodo nei loro sforzi di rilevazione delle anomalie.