0

次のコード スニペットは、数値のリストが渡され、リストから異常値 (つまり、非常に大きいまたは非常に小さい数値) を削除することになっている関数の 1 つからのものです。

出力が確認するように、コードは意図したとおりに機能していないようです。

EXTREMA_CUTOFF_THRESHOLD=3.0

if list_values:    
    avg_val = sum(list_values)/float(len(list_values))
    print 'DEBUG: BEFORE:', min(list_values), max(list_values), avg_val
    list_values = [x for x in list_values if math.fabs(x - avg_val)/float(avg_val) < EXTREMA_CUTOFF_THRESHOLD]

    list_values_len = len(list_values)
    if (list_values_len > 0) and (min_sample_size > 0) and (list_values_len < min_sample_size):
        print 'DEBUG: Insufficient data for stats calculation for row'
    elif (list_values_len > 0):
        print 'DEBUG: AFTER:', min(list_values), max(list_values), avg_val

出力:

DEBUG: BEFORE: 11.0 302.0 113.897260274
DEBUG: AFTER: 11.0 302.0 113.897260274
DEBUG: BEFORE: 12.5 273.0 108.382352941
DEBUG: AFTER: 12.5 273.0 108.382352941
DEBUG: BEFORE: 2.5 245.5 69.9166666667
DEBUG: AFTER: 2.5 245.5 69.9166666667
DEBUG: BEFORE: 136.5 499.5 363.775
DEBUG: AFTER: 136.5 499.5 363.775
DEBUG: BEFORE: 39.5 422.5 166.035759097
DEBUG: AFTER: 39.5 422.5 166.035759097
DEBUG: BEFORE: 39.5 422.0 152.305007587
DEBUG: AFTER: 39.5 422.0 152.305007587
DEBUG: BEFORE: 20.5 331.0 84.41015625
DEBUG: AFTER: 20.5 331.0 84.41015625
DEBUG: BEFORE: 7.0 267.5 155.810126582
DEBUG: AFTER: 7.0 267.5 155.810126582

極端な値が除外されないのはなぜですか?

4

4 に答える 4

5

avg_val1 つのこと:リストをフィルタリングした後、 を再計算しません。

別のこと:あなたはあなたので遊んだことがありますEXTREMA_CUTOFF_THRESHOLDか?おそらく、3.0 ではテスト データ セットから何もフィルタリングされませんが、値が小さいほどフィルタリングされます。

一般的なコメント:numpyこの場合、外れ値を判断するためにデータセットの標準偏差 ( numpy.std(dataarray)) を使用します (特定の方法に関する @mgilson のコメントを参照)。外れ値検出に関する優れたリソースは、このウィキペディアの記事のようです: http://en.wikipedia.org/wiki/Outlier

于 2012-09-11T13:25:14.800 に答える
1

平均を計算する素朴な方法では、sum / len数値の精度が失われることに注意してください。さらに、おそらく標準偏差も計算する必要があります。

あなたの閾値化方程式

math.fabs(x - avg_val)/float(avg_val) < EXTREMA_CUTOFF_THRESHOLD

おそらく次のようなものになるはずです

math.fabs(x - avg_val)/float(   standard_deviation  ) < EXTREMA_CUTOFF_THRESHOLD

少なくとも、標準偏差の観点から定義されている古典的な正規分布の仮定 (例: 3 シグマの外れ値) を使用する予定がある場合は!

どのしきい値を使用しますか? を使用している場合、最初のデータ セットでは3、値が 455.58904109600002 より大きいか、または -227.79452054800001 より小さいことを確認するのは非常に簡単です。

(正規化に標準偏差を使用すると、これを修正できることに注意してください。盲目的にしきい値を下げないでください。)

また、間違った長さを計算しています:list_values_len = len(bid_values)

于 2012-09-11T13:33:06.440 に答える
1

あなたのコードは機能しています。極端な値のどれも、平均から平均の 3 倍以上離れていないというだけです。これは、アルゴリズムが意味することです。

于 2012-09-11T13:34:21.277 に答える
1

あなたの用語math.fabs(x - avg_val)/float(avg_val)は、「平均に対する1つのデータムから平均までの距離」を意味します。これはあまり意味がないと思います。一連の生年月日、つまりすべてが 1920 年から 2010 年までの範囲の数字を想像してみてください。距離を平均の絶対値に関連付けることはあまり意味がありません。

正方形の 1 に戻ります。削除する要素を見つけるためのより適切なルールを検討してください。ここでの他の回答は、すでにそれを参照しています。

于 2012-09-11T13:34:23.753 に答える