Подтвердить что ты не робот

Может ли scipy.stats идентифицировать и маскировать очевидные выбросы?

С scipy.stats.linregress Я выполняю простую линейную регрессию на некоторых наборах высококоррелированных x, y экспериментальных данных и изначально визуально проверяя каждый график рассеяния x, y для выбросов. В более общем плане (то есть программно) есть ли способ идентифицировать и маскировать выбросы?

4b9b3361

Ответ 1

Пакет statsmodels имеет то, что вам нужно. Посмотрите на этот небольшой фрагмент кода и его вывод:

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

Изменить

В новой версии statsmodels все немного изменилось. Вот новый фрагмент кода, который показывает обнаружение обнаружения такого же типа.

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

Ответ 2

scipy.stats не имеет ничего прямого для выбросов, так что ответьте на некоторые ссылки и рекламу для statsmodels (который является дополнением статистики для scipy.stats)

для определения выбросов

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

вместо маскировки лучше использовать использовать надежную оценку

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

с примерами, где, к сожалению, графики в настоящее время не отображаются http://statsmodels.sourceforge.net/devel/examples/generated/tut_ols_rlm.html

Отклонения RLM. Результаты оценки имеют атрибут weights, а для выбросов весов меньше 1. Это также можно использовать для поиска выбросов. RLM также более устойчив, если несколько выходов.

Ответ 3

В более общем плане (т.е. программно) есть ли способ идентифицировать и маскировать выбросы?

Существуют различные алгоритмы обнаружения выбросов; scikit-learn реализует несколько из них.

[Отказ от ответственности: я автор scikit-learn.]

Ответ 4

Также можно ограничить эффект выбросов, используя scipy.optimize.least_squares. В частности, посмотрите параметр f_scale:

Значение мягкого поля между остаточными и остаточными выбросами по умолчанию - 1.0.... Этот параметр не влияет на потерю = 'linear', но для других значений потерь это имеет решающее значение.

На странице они сравнивают 3 разные функции: обычный least_squares и два метода с участием 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))

Сравнение наименьших квадратов

Как можно видеть, нормальные наименьшие квадраты намного больше зависят от выбросов данных, и стоит поиграть с различными функциями loss в сочетании с разными f_scales. Возможные функции потерь (взяты из документации):

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

В сводной кулинарной книге содержится аккуратный учебник по надежной нелинейной регрессии.