top of page

Come rimuovere e gestire i valori anomali con python nel machine learning



Durante la modellazione, è importante pulire il campione di dati per garantire che le osservazioni rappresentino al meglio il problema.


Come rimuovere e gestire i valori anomali con python  nel machine learning
Come rimuovere e gestire i valori anomali con python nel machine learning

A volte un set di dati può contenere valori estremi che sono al di fuori dell'intervallo di ciò che è previsto e diversi dagli altri dati. Questi sono chiamati valori anomali e spesso la modellazione dell'apprendimento automatico e l'abilità dei modelli in generale possono essere migliorati comprendendo e persino rimuovendo questi valori anomali.

In questo tutorial scoprirai i valori anomali e come identificarli e rimuoverli dal tuo set di dati di machine learning.


Dopo aver completato questo tutorial, saprai:

  • Che un valore anomalo sia un'osservazione improbabile in un set di dati e possa avere una delle molte cause.

  • Come utilizzare semplici statistiche univariate come la deviazione standard e l'intervallo interquartile per identificare e rimuovere valori anomali da un campione di dati.

  • Come utilizzare un modello di rilevamento dei valori anomali per identificare e rimuovere righe da un set di dati di addestramento al fine di migliorare le prestazioni della modellazione predittiva.


Panoramica sulla gestione dei valori anomali con python

Questo tutorial è diviso in cinque parti :

  1. Cosa sono i valori anomali?

  2. Test set di dati

  3. Gestire i valori anomali con il Metodo di deviazione standard

  4. Gestire i valori anomali con il Metodo dell'intervallo interquartile

  5. Rilevamento automatico dei valori anomali


Cosa sono i valori anomali?

Un valore anomalo è un'osservazione che è diversa dalle altre osservazioni.

È raro, o distinto, o non si adatta in qualche modo.

Generalmente definiremo valori anomali come campioni eccezionalmente lontani dal mainstream dei dati.

I valori anomali possono avere molte cause, come ad esempio:

  • Errore di misurazione o input.

  • Corruzione dei dati.

  • Vera osservazione anomala (ad es. Michael Jordan nel basket).


Non esiste un modo preciso per definire e identificare i valori anomali in generale a causa delle specificità di ciascun set di dati. Invece, tu o un esperto di dominio dovete interpretare le osservazioni grezze e decidere se un valore è un valore anomalo o meno.


Anche con una comprensione approfondita dei dati, i valori anomali possono essere difficili da definire. […] Bisogna fare molta attenzione a non rimuovere o modificare frettolosamente i valori, soprattutto se la dimensione del campione è piccola.

Tuttavia, possiamo utilizzare metodi statistici per identificare osservazioni che sembrano essere rare o improbabili dati i dati disponibili.


L'identificazione di valori anomali e dati errati nel set di dati è probabilmente una delle parti più difficili della pulizia dei dati e richiede tempo per essere corretta. Anche se hai una profonda conoscenza delle statistiche e di come i valori anomali potrebbero influenzare i tuoi dati, è sempre un argomento da esplorare con cautela.

Ciò non significa che i valori identificati siano valori anomali e debbano essere rimossi. Tuttavia, gli strumenti descritti in questo tutorial possono essere utili per far luce su eventi rari che potrebbero richiedere una seconda occhiata.

Un buon consiglio è prendere in considerazione la possibilità di tracciare i valori anomali identificati, magari nel contesto di valori non anomali per vedere se esistono relazioni o schemi sistematici con i valori anomali. Se c'è, forse non sono valori anomali e possono essere spiegati, o forse gli stessi valori anomali possono essere identificati in modo più sistematico.




Test set di dati

Prima di esaminare i metodi di identificazione dei valori anomali, definiamo un set di dati che possiamo utilizzare per testare i metodi.

Genereremo una popolazione di 10.000 numeri casuali estratti da una distribuzione gaussiana con una media di 50 e una deviazione standard di 5.

I numeri estratti da una distribuzione gaussiana avranno valori anomali. Cioè, in virtù della distribuzione stessa, ci saranno alcuni valori che saranno molto lontani dai valori medi e rari che possiamo identificare come valori anomali.

Useremo la funzione randn() per generare valori gaussiani casuali con una media di 0 e una deviazione standard di 1, quindi moltiplichiamo i risultati per la nostra deviazione standard e aggiungiamo la media per spostare i valori nell'intervallo preferito.

Il generatore di numeri pseudocasuali viene seminato per garantire che otteniamo lo stesso campione di numeri ogni volta che viene eseguito il codice.



# generiamo dei dati
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import std
# impostiamo il seed
seed(1)
# generiamo delle osservazioni
data = 5 * randn(10000) + 50
# riassumiamo
print('mean=%.3f stdv=%.3f' % (mean(data), std(data)))


L'esecuzione dell'esempio genera il campione e quindi stampa la media e la deviazione standard. Come previsto, i valori sono molto vicini ai valori attesi.



mean=50.049 stdv=4.994


Grstire gli outliers con il Metodo di deviazione standard

Se sappiamo che la distribuzione dei valori nel campione è gaussiana o simile a quella gaussiana, possiamo utilizzare la deviazione standard del campione come cut-off per identificare i valori anomali.


La distribuzione gaussiana ha la proprietà che la deviazione standard dalla media può essere utilizzata per riassumere in modo affidabile la percentuale di valori nel campione.

Ad esempio, entro una deviazione standard della media coprirà il 68% dei dati.

Quindi, se la media è 50 e la deviazione standard è 5, come nel set di dati del test sopra, tutti i dati nel campione tra 45 e 55 rappresenteranno circa il 68% del campione di dati. Possiamo coprire più del campione di dati se espandiamo l'intervallo come segue:

  • 1 Deviazione standard dalla media: 68%

  • 2 Deviazioni standard dalla media: 95%

  • 3 deviazioni standard dalla media: 99,7%


Un valore che non rientra in 3 deviazioni standard fa parte della distribuzione, ma è un evento raro o improbabile a circa 1 su 370 campioni.

Tre deviazioni standard dalla media sono un limite comune in pratica per identificare i valori anomali in una distribuzione gaussiana o simile a quella gaussiana. Per campioni di dati più piccoli, può essere utilizzato forse un valore di 2 deviazioni standard (95%) e per campioni più grandi, può essere utilizzato forse un valore di 4 deviazioni standard (99,9%).

I Dati mu e sigma, un modo semplice per identificare i valori anomali è calcolare uno z-score per ogni xi, che è definito come il numero di deviazioni standard da xi è dalla media […] Valori di dati che hanno uno z-score sigma maggiore di una soglia, ad esempio di tre, sono dichiarati valori anomali.

Rendiamolo concreto con un esempio.


A volte, i dati vengono prima standardizzati (ad es. su un punteggio Z con media zero e varianza unitaria) in modo che il rilevamento dei valori anomali possa essere eseguito utilizzando valori di cut-off del punteggio Z standard. Questa è una comodità e non è richiesta in generale, ed eseguiremo i calcoli nella scala originale dei dati qui per chiarire le cose.

Possiamo calcolare la media e la deviazione standard di un dato campione, quindi calcolare il cut-off per identificare i valori anomali come più di 3 deviazioni standard dalla media.


# calcoliamo le statistiche di base
data_mean, data_std = mean(data), std(data)
# identifichiamo gli outl
cut_off = data_std * 3
lower, upper = data_mean - cut_off, data_mean + cut_off


Possiamo quindi identificare i valori anomali come quegli esempi che cadono al di fuori dei limiti inferiore e superiore definiti.



# identifichiamo gli outliers
outliers = [x for x in data if x < lower or x > upper]


In alternativa, possiamo filtrare dal campione quei valori che non rientrano nei limiti definiti.



# rimuoviamo gli  outliers
outliers_removed = [x for x in data if x > lower and x < upper]


Possiamo mettere tutto questo insieme al nostro set di dati di esempio preparato nella sezione precedente.


L'esempio completo è elencato di seguito.




from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import std

seed(1)

data = 5 * randn(10000) + 50

data_mean, data_std = mean(data), std(data)

cut_off = data_std * 3
lower, upper = data_mean - cut_off, data_mean + cut_off
outliers = [x for x in data if x < lower or x > upper]
print('Identified outliers: %d' % len(outliers))

outliers_removed = [x for x in data if x >= lower and x <= upper]
print('Non-outlier observations: %d' % len(outliers_removed))

Copia e incolla il codice sul nostro editor Python online preconfigurato per il machine learning e data science




L'esecuzione dell'esempio stamperà prima il numero di valori anomali identificati e quindi il numero di osservazioni che non sono valori anomali, dimostrando come identificare e filtrare rispettivamente i valori anomali.



Identified outliers: 29
Non-outlier observations: 9971


Finora abbiamo parlato solo di dati univariati con una distribuzione gaussiana, ad esempio una singola variabile. È possibile utilizzare lo stesso approccio se si dispone di dati multivariati, ad esempio dati con più variabili, ciascuna con una distribuzione gaussiana diversa.


Puoi immaginare limiti in due dimensioni che definirebbero un'ellisse se hai due variabili. Le osservazioni che non rientrano nell'ellisse sarebbero considerate valori anomali. In tre dimensioni, questo sarebbe un ellissoide e così via in dimensioni superiori.

In alternativa, se si conosce meglio il dominio, è possibile che venga identificato un valore anomalo superando i limiti di una o di un sottoinsieme delle dimensioni dei dati.


Metodo dell'intervallo interquartile

Non tutti i dati sono normali o abbastanza normali da considerarli come tratti da una distribuzione gaussiana.

Una buona statistica per riassumere un campione di dati con distribuzione non gaussiana è l'Interquartile Range, o IQR in breve.


L'IQR viene calcolato come la differenza tra il 75° e il 25° percentile dei dati.


Ricorda che i percentili possono essere calcolati ordinando le osservazioni e selezionando i valori in base a indici specifici. Il 50° percentile è il valore medio, o la media dei due valori medi per un numero pari di esempi. Se avessimo 10.000 campioni, il 50° percentile sarebbe la media dei valori 5000 e 5001.


Ci riferiamo ai percentili come quartili (" quart " significa 4) perché i dati sono divisi in quattro gruppi tramite i valori 25, 50 e 75.

L'IQR definisce il 50% centrale dei dati o il corpo dei dati.

Le tecniche di rilevamento dei valori anomali basati su statistiche presuppongono che i punti dati normali appaiano nelle regioni ad alta probabilità di un modello stocastico, mentre i valori anomali si verificherebbero nelle regioni a bassa probabilità di un modello stocastico.

L'IQR può essere utilizzato per identificare i valori anomali definendo limiti sui valori del campione che sono un fattore k dell'IQR al di sotto del 25° percentile o al di sopra del 75° percentile. Il valore comune per il fattore k è il valore 1,5. Un fattore k di 3 o più può essere utilizzato per identificare valori che sono valori anomali estremi o " lontani " .


Questi limiti sono disegnati come recinzioni sui baffi (o sulle linee) che vengono tracciati dalla scatola. I valori che non rientrano in questi valori vengono disegnati come punti.


Possiamo calcolare i percentili di un set di dati usando la funzione percentile() NumPy che prende il set di dati e la specifica del percentile desiderato. L'IQR può quindi essere calcolato come la differenza tra il 75° e il 25° percentile.



# calcoliamo il rancge interquartile 
q25, q75 = percentile(data, 25), percentile(data, 75)
iqr = q75 - q25


Possiamo quindi calcolare il limite per i valori anomali come 1,5 volte l'IQR e sottrarre questo limite dal 25° percentile e aggiungerlo al 75° percentile per fornire i limiti effettivi sui dati.




# calcoliamo gli outlier cutoff
cut_off = iqr * 1.5
lower, upper = q25 - cut_off, q75 + cut_off


Possiamo quindi utilizzare questi limiti per identificare i valori anomali.



# adesso identifichiamo gli outliers outliers
outliers = [x for x in data if x < lower or x > upper]


Possiamo anche utilizzare i limiti per filtrare i valori anomali dal set di dati.



# rimuoviamo gli outliers
outliers_removed = [x for x in data if x > lower and x < upper]


Possiamo collegare tutto questo insieme e dimostrare la procedura sul set di dati di test.


L'esempio completo è elencato di seguito.



from numpy.random import seed
from numpy.random import randn
from numpy import percentile

seed(1)

data = 5 * randn(10000) + 50

q25, q75 = percentile(data, 25), percentile(data, 75)

print('Percentiles: 25th=%.3f, 75th=%.3f, IQR=%.3f' % (q25, q75, iqr))

cut_off = iqr * 1.5
lower, upper = q25 - cut_off, q75 + cut_off

outliers = [x for x in data if x < lower or x > upper]
print('Identified outliers: %d' % len(outliers))

outliers_removed = [x for x in data if x >= lower and x <= upper]
print('Non-outlier observations: %d' % len(outliers_removed))

Copia e incolla il codice sul nostro editor Python online preconfigurato per il machine learning e data science, senza dover perdere tempo per installare le librerie.




L'esecuzione dell'esempio stampa prima il 25° e il 75° percentile identificato e l'IQR calcolato. Viene stampato il numero di outlier individuato seguito dal numero di osservazioni non outlier.



Percentiles: 25th=46.685, 75th=53.359, IQR=6.674
Identified outliers: 81
Non-outlier observations: 9919



L'approccio può essere utilizzato per dati multivariati calcolando a turno i limiti di ciascuna variabile nel set di dati e prendendo i valori anomali come osservazioni che cadono al di fuori del rettangolo o dell'iper-rettangolo.


Rilevamento automatico dei valori anomali

Nell'apprendimento automatico, un approccio per affrontare il problema del rilevamento dei valori anomali è la classificazione a una classe .


La classificazione di una classe, o OCC in breve, implica l'adattamento di un modello sui dati " normali " e la previsione se i nuovi dati sono normali o un'anomalia/anomalia.

Un classificatore a una classe mira a catturare le caratteristiche delle istanze di formazione, in modo da essere in grado di distinguerle dai potenziali valori anomali che appaiono.

Un classificatore a una classe è adatto a un set di dati di addestramento che contiene solo esempi della classe normale. Una volta preparato, il modello viene utilizzato per classificare nuovi esempi come normali o non normali, ovvero valori anomali o anomalie.


Un approccio semplice per identificare i valori anomali consiste nell'individuare quegli esempi che sono lontani dagli altri esempi nello spazio delle caratteristiche.


Questo può funzionare bene per gli spazi delle caratteristiche con una bassa dimensionalità (poche funzioni), sebbene possa diventare meno affidabile all'aumentare del numero di funzioni, indicato come la maledizione della dimensionalità.


Il fattore anomalo locale, o LOF in breve, è una tecnica che tenta di sfruttare l'idea dei vicini più vicini per il rilevamento dei valori anomali. A ogni esempio viene assegnato un punteggio di quanto sia isolato o quanto sia probabile che siano valori anomali in base alle dimensioni del suo quartiere locale. È più probabile che gli esempi con il punteggio più alto siano valori anomali.

Introduciamo un outlier locale (LOF) per ogni oggetto nel set di dati, indicando il suo grado di outlier-ness.

La libreria scikit-learn fornisce un'implementazione di questo approccio nella classe LocalOutlierFactor .

Possiamo dimostrare il metodo LocalOutlierFactor su un set di dati di modellazione predittiva.


Useremo il problema della regressione immobiliare di Boston che ha 13 input e un target numerico e richiede l'apprendimento della relazione tra le caratteristiche dei sobborghi e i prezzi delle case.


Puoi trovare qualsiasi dataset tu abbia in mente per provare qui




Guardando nel set di dati, dovresti vedere che tutte le variabili sono numeriche.



0.00632,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,396.90,4.98,24.00
0.02731,0.00,7.070,0,0.4690,6.4210,78.90,4.9671,2,242.0,17.80,396.90,9.14,21.60
0.02729,0.00,7.070,0,0.4690,7.1850,61.10,4.9671,2,242.0,17.80,392.83,4.03,34.70
0.03237,0.00,2.180,0,0.4580,6.9980,45.80,6.0622,3,222.0,18.70,394.63,2.94,33.40
0.06905,0.00,2.180,0,0.4580,7.1470,54.20,6.0622,3,222.0,18.70,396.90,5.33,36.20
...


Non è necessario scaricare il set di dati, lo scaricheremo automaticamente.

Innanzitutto, possiamo caricare il set di dati come un array NumPy, separarlo in variabili di input e output e quindi dividerlo in set di dati di training e test.

L'esempio completo è elencato di seguito.




from pandas import read_csv
from sklearn.model_selection import train_test_split

url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
df = read_csv(url, header=None)

data = df.values

X, y = data[:, :-1], data[:, -1]

print(X.shape, y.shape)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)



L'esecuzione dell'esempio carica il set di dati e prima riporta il numero totale di righe e colonne nel set di dati, quindi il numero di dati degli esempi allocati al treno e ai set di dati di test.



(506, 13) (506,)
(339, 13) (167, 13) (339,) (167,)



È un problema di modellazione predittiva di regressione, il che significa che prevediamo un valore numerico. Tutte le variabili di input sono anche numeriche.


In questo caso, adatteremo un algoritmo di regressione lineare e valuteremo le prestazioni del modello addestrando il modello sul set di dati del test ed effettuando una previsione sui dati del test e valuteremo le previsioni utilizzando l'errore medio assoluto (MAE).

L'esempio completo di valutazione di un modello di regressione lineare sul set di dati è elencato di seguito.



from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
df = read_csv(url, header=None)

data = df.values

X, y = data[:, :-1], data[:, -1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)

model = LinearRegression()
model.fit(X_train, y_train)


mae = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % mae)



L'esecuzione dell'esempio adatta e valuta il modello, quindi segnala il MAE.


Nota : i risultati possono variare a causa della natura stocastica dell'algoritmo o della procedura di valutazione, o delle differenze nella precisione numerica. Esegui l'esempio alcune volte e confrontare il risultato medio.


In questo caso, possiamo vedere che il modello ha raggiunto un MAE di circa 3.417.



MAE: 3.417



Successivamente, possiamo provare a rimuovere i valori anomali dal set di dati di addestramento.


L'aspettativa è che i valori anomali inducano il modello di regressione lineare ad apprendere un pregiudizio o una comprensione distorta del problema e che la rimozione di questi valori anomali dal set di addestramento consentirà di apprendere un modello più efficace.


Possiamo raggiungere questo obiettivo definendo il modello LocalOutlierFactor e utilizzandolo per fare una previsione sul set di dati di addestramento, contrassegnando ogni riga nel set di dati di addestramento come normale (1) o un valore anomalo (-1). Utilizzeremo gli iperparametri predefiniti per il modello di rilevamento dei valori anomali, sebbene sia una buona idea ottimizzare la configurazione in base alle specifiche del set di dati.




lof = LocalOutlierFactor()
yhat = lof.fit_predict(X_train)


Possiamo quindi utilizzare queste previsioni per rimuovere tutti i valori anomali dal set di dati di addestramento.




# seleziona tutte le righe che non sono valori anomali
mask = yhat != -1
X_train, y_train = X_train[mask, :], y_train[mask]


Possiamo quindi adattare e valutare il modello come di consueto.

L'esempio aggiornato di valutazione di un modello di regressione lineare con valori anomali eliminati dal set di dati di addestramento è elencato di seguito.




from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import LocalOutlierFactor
from sklearn.metrics import mean_absolute_error

url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
df = read_csv(url, header=None)

data = df.values

X, y = data[:, :-1], data[:, -1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)

print(X_train.shape, y_train.shape)

lof = LocalOutlierFactor()
yhat = lof.fit_predict(X_train)

mask = yhat != -1
X_train, y_train = X_train[mask, :], y_train[mask]

print(X_train.shape, y_train.shape)

model = LinearRegression()
model.fit(X_train, y_train)

yhat = model.predict(X_test)

mae = mean_absolute_error(y_test, yhat)
print('MAE: %.3f' % mae)



L'esecuzione dell'esempio adatta e valuta il modello di regressione lineare con valori anomali eliminati dal set di dati di addestramento.


Nota : i risultati possono variare a causa della natura stocastica dell'algoritmo o della procedura di valutazione, o delle differenze nella precisione numerica. Considera di eseguire l'esempio alcune volte e confrontare il risultato medio.


In primo luogo, possiamo vedere che il numero di esempi nel set di dati di addestramento è stato ridotto da 339 a 305, il che significa che sono state identificate ed eliminate 34 righe contenenti valori anomali.

Possiamo anche vedere una riduzione del MAE da circa 3,417 da un adattamento del modello sull'intero set di dati di addestramento, a circa 3,356 su un adattamento del modello sul set di dati con i valori anomali rimossi.



(339, 13) (339,)
(305, 13) (305,)
MAE: 3.356



La libreria Scikit-Learn fornisce altri algoritmi di rilevamento anomali che possono essere utilizzati allo stesso modo dell'algoritmo IsolationForest.


Estensioni

Questa sezione elenca alcune idee per estendere il tutorial che potresti voler esplorare.

  • Sviluppa il tuo set di dati di test gaussiano e traccia i valori anomali e non anomali su un istogramma.

  • Testare il metodo basato su IQR su un set di dati univariato generato con una distribuzione non gaussiana.

  • Scegli un metodo e crea una funzione che filtrerà i valori anomali per un determinato set di dati con un numero arbitrario di dimensioni.

Se esplori una di queste estensioni, ci piacerebbe saperlo nei commenti

PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page