2012-04-19 18 views

risposta

21

Il pacchetto statsmodels ha ciò di cui hai bisogno. Guardate questo piccolo frammento di codice e la sua uscita:

# Imports # 
import statsmodels.api as smapi 
import statsmodels.graphics as smgraphics 
# Make data # 
x = range(30) 
y = [y*10 for y in x] 
# Add outlier # 
x.insert(6,15) 
y.insert(6,220) 
# Make graph # 
regression = smapi.OLS(x, y).fit() 
figure = smgraphics.regressionplots.plot_fit(regression, 0) 
# Find outliers # 
test = regression.outlier_test() 
outliers = ((x[i],y[i]) for i,t in enumerate(test) if t[2] < 0.5) 
print 'Outliers: ', list(outliers) 

Example figure 1

Outliers: [(15, 220)]

Modifica

Con la versione più recente di statsmodels, le cose sono cambiate un po '. Ecco un nuovo snippet di codice che mostra lo stesso tipo di rilevamento anomalo.

# Imports # 
from random import random 
import statsmodels.api as smapi 
from statsmodels.formula.api import ols 
import statsmodels.graphics as smgraphics 
# Make data # 
x = range(30) 
y = [y*(10+random())+200 for y in x] 
# Add outlier # 
x.insert(6,15) 
y.insert(6,220) 
# Make fit # 
regression = ols("data ~ x", data=dict(data=y, x=x)).fit() 
# Find outliers # 
test = regression.outlier_test() 
outliers = ((x[i],y[i]) for i,t in enumerate(test.icol(2)) if t < 0.5) 
print 'Outliers: ', list(outliers) 
# Figure # 
figure = smgraphics.regressionplots.plot_fit(regression, 1) 
# Add line # 
smgraphics.regressionplots.abline_plot(model_results=regression, ax=figure.axes[0]) 

Example figure 2

Outliers: [(15, 220)]

+1

Grazie per aver aggiunto le nuove informazioni! Grandi esempi, mi hanno davvero aiutato a capirlo. –

7

Più in generale (cioè a livello di codice) esiste un modo per identificare e mascherare i valori anomali?

Esistono diversi algoritmi di rilevamento di anomalie; scikit-learn implementa alcuni di essi.

[Disclaimer:. Sono un collaboratore scikit-learn]

7

scipy.stats non ha nulla direttamente per valori anomali, in modo da rispondere alcuni link e pubblicità per statsmodels (che è un complemento per le statistiche SciPy .stats)

per valori anomali che identificano

http://jpktd.blogspot.ca/2012/01/influence-and-outlier-measures-in.html

http://jpktd.blogspot.ca/2012/01/anscombe-and-diagnostic-statistics.html

http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.outliers_influence.OLSInfluence.html

invece di mascheramento, un approccio migliore è quello di uso uno stimatore robusto

http://statsmodels.sourceforge.net/devel/rlm.html

con esempi, dove purtroppo non sono al momento visualizzate le trame http://statsmodels.sourceforge.net/devel/examples/generated/tut_ols_rlm.html

RLM downweights valori anomali . I risultati della stima hanno un attributo weights e per i valori anomali i pesi sono inferiori a 1. Questo può essere utilizzato anche per trovare valori anomali. RLM è anche più robusto se ci sono diversi valori anomali.

+1

cos'è una matrice di progettazione esogena? Ho alcuni dati x, y: y = f (x). È una funzione prevalentemente lineare: y = mx + b. Dove comincio con questo stimatore robusto? La terminologia dei documenti è impenetrabile per me. –

0

È anche possibile limitare l'effetto di valori anomali utilizzando scipy.optimize.least_squares.In particolare, dai un'occhiata al parametro f_scale:

Valore del margine morbido tra i valori inlomerali e quelli in uscita, il valore predefinito è 1.0. ... Questo parametro non ha effetto con loss = 'linear', ma per altri valori di perdita è di cruciale importanza.

Nella pagina si confronta 3 diverse funzioni: la normale least_squares, e due metodi che coinvolgono f_scale:

res_lsq =  least_squares(fun, x0, args=(t_train, y_train)) 
res_soft_l1 = least_squares(fun, x0, loss='soft_l1', f_scale=0.1, args=(t_train, y_train)) 
res_log =  least_squares(fun, x0, loss='cauchy', f_scale=0.1, args=(t_train, y_train)) 

Least squares comparison

Come si può vedere, le normali minimi quadrati è molto di più influenzato da dati anomali, e può valere la pena di giocare con diverse funzioni loss in combinazione con diversi f_scales. Le funzioni possibili di perdita sono (presi dalla documentazione):

‘linear’ : Gives a standard least-squares problem. 
‘soft_l1’: The smooth approximation of l1 (absolute value) loss. Usually a good choice for robust least squares. 
‘huber’ : Works similarly to ‘soft_l1’. 
‘cauchy’ : Severely weakens outliers influence, but may cause difficulties in optimization process. 
‘arctan’ : Limits a maximum loss on a single residual, has properties similar to ‘cauchy’. 

Il libro di cucina SciPy has a neat tutorial sulla robusta regressione non lineare.

Problemi correlati