web-dev-qa-db-ja.com

scipy.statsは明らかな外れ値を識別してマスクできますか?

Scipy.stats.linregressを使用して、相関性の高いx、y実験データのいくつかのセットに対して単純な線形回帰を実行し、最初に各x、y散布図で外れ値を視覚的に検査しています。より一般的に(つまりプログラム的に)、外れ値を識別してマスクする方法はありますか?

21
a different ben

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

27
xApple

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は、いくつかの外れ値がある場合にも、より堅牢になります。

8
Josef

より一般的に(つまりプログラム的に)、外れ値を識別してマスクする方法はありますか?

さまざまな外れ値検出アルゴリズムが存在します。 scikit-learn それらのいくつかを実装します。

[免責事項:私はscikit-learnの寄稿者です。]

6
Fred Foo

scipy.optimize.least_squares を使用して、外れ値の影響を制限することもできます。特に、f_scaleパラメータを見てください。

インライアとアウトライアの残差間のソフトマージンの値。デフォルトは1.0です。 ...このパラメータは、loss = 'linear'では効果がありませんが、他の損失値の場合は非常に重要です。

このページでは、3つの異なる関数を比較しています。通常のleast_squaresと、f_scaleを含む2つのメソッドです。

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

ご覧のとおり、通常の最小二乗法はデータの外れ値の影響をはるかに受けます。さまざまなf_scalesと組み合わせてさまざまなloss関数を試してみる価値があります。考えられる損失関数は次のとおりです(ドキュメントから取得)。

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

Scipyクックブック きちんとしたチュートリアルがあります ロバストな非線形回帰について。

0
pingul