Can scipy.statystyki identyfikują i maskują oczywiste odstające wartości?

Z scipy.statystyki.linregress wykonuję prostą regresję liniową na niektórych zestawach wysoce skorelowanych danych eksperymentalnych X, y i początkowo wizualnie sprawdzając każdy wykres punktowy X, y dla odstających. Ogólniej (tj. programowo) czy istnieje sposób na identyfikację i maskowanie odstających wartości?

Author: a different ben, 0000-00-00

4 answers

Pakiet statsmodels ma to, czego potrzebujesz. Spójrz na ten mały fragment kodu i jego wyjście:

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

Przykład rysunek 1

Outliers: [(15, 220)]

Edit

W nowszej wersji statsmodels, rzeczy się trochę zmieniły. Oto nowy fragment kodu, który pokazuje ten sam Typ detekcji odstających.

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

Przykład rysunek 2

Outliers: [(15, 220)]

 21
Author: xApple,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 12:54:09

Bardziej ogólnie (tj. programowo) czy istnieje sposób na identyfikację i maskowanie odstających wartości?

Istnieją różne algorytmy detekcji odstających; scikit-learn implementuje kilka z nich.

[Zastrzeżenie: jestem współpracownikiem scikit-learn.]

 7
Author: Fred Foo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-19 15:46:58

Scipy.stats nie ma nic bezpośrednio dla odstających, więc jako odpowiedź na kilka linków i reklam statsmodels (co jest uzupełnieniem statystyk dla scipy.Statystyki)

Do identyfikacji outliers

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

Zamiast maskowania, lepszym podejściem jest użycie solidnego estymatora]}

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

Z przykładami, gdzie niestety działki nie są obecnie wyświetlane http://statsmodels.sourceforge.net/devel/examples/generated/tut_ols_rlm.html

RLM downweights outliers. Wyniki estymacji mają atrybut weights, a dla wartości odstających wagi są mniejsze niż 1. Można to również wykorzystać do znajdowania wartości odstających. RLM jest również bardziej wytrzymały, jeśli są kilka odstających.

 7
Author: Josef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 02:49:46

Możliwe jest również ograniczenie efektu odstających za pomocą scipy./ align = "left" / least_squares . W szczególności spójrz na parametr f_scale:

Wartość marginesu miękkiego pomiędzy pozostałościami inlier i outlier, domyślnie wynosi 1.0. ... Parametr ten nie ma wpływu na loss= 'liniowy', ale dla innych wartości strat ma kluczowe znaczenie.

Na stronie porównują 3 różne funkcje: normalną least_squares oraz dwie metody obejmujące 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))

Porównanie najmniejszych kwadratów

Jak widać, na normalne najmniejsze kwadraty mają znacznie większy wpływ wartości odstające danych i warto się bawić różnymi funkcjami loss w połączeniu z różnymi funkcjami f_scales. Możliwe funkcje strat są (wzięte z dokumentacji):

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

The scipy cookbook ma schludny samouczek na temat solidnej nieliniowej regresji.

 0
Author: pingul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-04 14:57:13