2012-04-19 13 views

Antwort

21

Das statsmodels Paket hat, was Sie brauchen. Schauen Sie sich diesen kleinen Code-Schnipsel und seine Ausgabe:

# 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)]

bearbeiten

Mit der neueren Version von statsmodels haben sich die Dinge ein wenig verändert. Hier ist ein neues Code-Snippet, das dieselbe Art der Ausreißererkennung anzeigt.

# 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

Danke für das Hinzufügen der neuen Info! Großartige Beispiele, sie haben mir wirklich geholfen, es zu verstehen. –

7

Allgemeiner (d. H. Programmatisch) gibt es eine Möglichkeit, Ausreißer zu identifizieren und zu maskieren?

Verschiedene Ausreißererkennungsalgorithmen existieren; scikit-learn implementiert einige von ihnen.

[Disclaimer:. Ich bin ein Scikit-Learn Mitwirkenden vor]

7

scipy.stats nichts direkt für Ausreißer, also als Antwort einige Links und Werbung für statsmodels (die eine Statistik Ergänzung für scipy ist .stats)

zur Identifizierung von Ausreißern

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

statt Maskierung, eine bessere Lösung zu Verwendung ist ein robuster Schätzer

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

mit Beispielen, wo leider sind die Grundstücke zur Zeit nicht http://statsmodels.sourceforge.net/devel/examples/generated/tut_ols_rlm.html

RLM angezeigt downweights Ausreißern . Die Schätzergebnisse haben ein weights Attribut und für Ausreißer sind die Gewichte kleiner als 1. Dies kann auch zum Finden von Ausreißern verwendet werden. RLM ist auch robuster, wenn es mehrere Ausreißer sind.

+1

Was ist eine exogene Designmatrix? Ich habe einige x, y Daten: y = f (x). Es ist eine meist lineare Funktion: y = mx + b. Wo fange ich mit diesem robusten Schätzer an? Die Terminologie der Dokumente ist für mich undurchdringlich. –

0

Es ist auch möglich, die Wirkung von Ausreißern zu begrenzen scipy.optimize.least_squares verwenden.Sehen Sie sich speziell den Parameter f_scale an:

Wert des weichen Rands zwischen Inlier- und Ausreißer-Residuen, Standardwert ist 1,0. ... Dieser Parameter hat keine Auswirkung mit Verlust = 'linear', aber für andere Verlustwerte ist es von entscheidender Bedeutung.

auf der Seite vergleichen sie drei verschiedene Funktionen: die normale least_squares und zwei Methoden, bei denen 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

Wie man sehen kann, ist die normalen kleinsten Quadrate viel mehr von Daten Ausreißer betroffen, und es kann sich lohnen, mit verschiedenen loss Funktionen in Kombination mit anderen f_scales zu spielen. Die möglichen Verlustfunktionen werden (aus der Dokumentation entnommen):

‘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’. 

Die scipy Kochbuch has a neat tutorial auf robuste nichtlineare Regression.

Verwandte Themen