キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
DataRobot コミュニティ

外れ値は処理すべきでしょうか?

SeijiH
NiCdバッテリー

外れ値は処理すべきでしょうか?

大きい外れ値が含まれたデータは行ごと全て削除するべきでしょうか?

0 件の賞賛
8件の返信8
A_Morita
イメージセンサー

場合によると思いますね。外れ値を機械的に全部処理してしまうのは恣意的なモデルになってしまう恐れがあります。(その外れ値にもしかしたらちゃんと意味があるかもしれませんし。)

私はDataRobotでは外れ値による悪影響を避けるためにビニングやlog化やリジット変換などの手法を取ってくれると聞いたので、明らかな異常な値で無ければそのままにして、そのレコードの計測ミスなどの裏付けが取れた場合には削除するということをしています。

 

ShinichiroOhno
リニアアクチュエータ

観点を変えて外れ値について議論してみるというのも良いと思っています。

例えば、

  • 限度額を超えて貸付をしている。
  • 基準生産量を超えて生産しているとか。

外れるには、外れる理由がある場合もあり、その理由を突き詰めると考慮できていないビジネスルールにたどりつく事も、少なくありません。

そういった事実がビジネスルールとして正しく、「意図的に外れている」のであれば、

  • 限度額オーバ貸付フラグ
  • 基準超過 生産日フラク

といった、ビジネスルールを説明変数に追加することも可能です。

なので、トンチの様な感じになってしまうのですが、

  • 外れ値は、
    • 処理すべきではなく
    • 議論すべきなのかもしれません。

変化球な回答となってしまいスミマセン。

Miogawa
データサイエンティスト
データサイエンティスト

議論するべきとの発想いいですね!

どこまでこだわるかという視点だと、特徴量にある外れ値であれば特徴量のインパクトの上位にくるなどしない限りよほど気合い入れるモデリングでない限りくまなくを探求しませんが、ターゲットにある外れ値は、絶対に議論したいですね。

外れ値がターゲットにある時点で回帰の問題になりますが、回帰の問題ではターゲットの分布は最適化指標を決める上でも重要で、変な外れ値がモデルの収束を邪魔してしまう可能性になります。2stageモデルにすることも視野に入れながらどうしてその外れ値が出ているのか、どれくらいの頻度で出るのかはターゲットの場合には分析のスタートでみたいかなと思います。

ShinichiroOhno
リニアアクチュエータ

どの変数に対して、外れ値を丁寧に扱うか?も重要ですね。
やはり、ターゲット変数 と 上位特徴量は丁寧に扱いたいです。

ターゲット変数の外れ値 と 2stageモデルというキーワードを聞いて思い出したのですが、
回帰問題において、損害保険の保険金のように、まれに事象が起き、その時に数値が出現するといった

  • ターゲットが大量のゼロ(事故は、ふつう起きない)
  • 外れ値というかたまに、数値が存在(事故が起きると、保険金)

といった場合に、普通に回帰すると大量のゼロが邪魔をするZero-Boost問題が発生しますが。
DataRobotの場合、

  • 2stageモデルである、frequency severity modelが適用されたXGBがブループリントに存在し
  • 最適化指標も自動でTweedie Devianceが選択される。

という点に驚いた記憶があります。

AutoML製品も様々出てきていますが、こういったZero-Boost状態でも、大量のゼロが学習の邪魔にならないよう、モデルと最適化指標の両面からユーザを支えてくれる、DataRobotはやはり凄いなと以前思いましたw

保険業界でよく利用される、frequency severity modelがブループリントに入っているあたりが、成り立ちと歴史を感じさせてくれますw

Dependent-frequency-severity-modeling-of-insurance-claims.pdf 

Miogawa
データサイエンティスト
データサイエンティスト

製品の歴史としては、もともとゼロブースト問題にはTweedie Devianceを損失関数で利用することによって対応していたのですが、そこからfrequency severity modelが加わりこういうエッジな部分でのエンハンスがあることに感動したのを今でも覚えています。

frequency severityモデルはオートパイロットでゼロブースト問題を検知すれば自動で動くのでよく知られていますが、実は高度なオプションにイベント数という項目があり、ここではまさにfrequencyに該当する発生回数を明示的にセットすることができます。発生頻度がバラバラでそこが正確に捉えられいるゼロブースト問題ではより精度をあげることができます。

以下マニュアル抜粋ですが、

イベント数は、ゼロでないイベントの頻度に関する情報を追加することによってゼロ過剰ターゲットのモデリングを向上させます。これは、頻度 x 強度モデルで特別な列として扱われます。頻度ステージでは、この列を使用してゼロでないイベントの頻度をモデル化します。強度ステージでは、列内のゼロでないイベントの強度を正規化し、その値をウェイトとして使用します。これは、頻度と強度の係数の解釈性を向上させるために特に必要です。

 

ShinichiroOhno
リニアアクチュエータ

@Miogawa 
ありがとうございます!!
なるほど。ターゲットにゼロ過剰な列を指定すると、オプションで指定できるんですね。
勉強になります!

0 件の賞賛
IJICHI_DR
データサイエンティスト
データサイエンティスト

アンスコムの例」におけるデータ例Ⅳのようなケースに気づかず無意味なモデリングを行うリスクを考えないといけないかなと思っています。

その意味では、「外れ値に気づく」こと自体がまずは大事。自分の経験では、「外れ値をうまく処理できていない」よりも「外れ値に気づいていない」ことで問題になることが遥かに多い気がします。

外れ値の議論とはずれますが、アンスコムの例はすごく示唆に富んでいます。
(どのデータからもほぼ同じ回帰モデルが得られ、相関係数もほぼ一致する)

Miogawa
データサイエンティスト
データサイエンティスト

こうなると外れ値をどう見つけるのがポイントですね。

モデリング前の作業としては

  • ヒストグラムの外れ値
  • 出現頻度の少ないもの
  • 型と一致しないもの(想定した型として認識されない場合にはその行を見る)
  • 文字列に置いて文字長が異常に長いもの、異常に短いもの

モデリング後としては

  • 異常検知アルゴリズムでスコアの高いもの
  • 教師ありモデルの検定において大きく予測と実測が乖離しているもの
  • 想定以上にインパクトの高い特徴量

シンプルにはこんなところをみています。特にモデリング後の外れ値探索は見逃した外れ値を見つける手伝いになったりするので列数が膨大な時などは特に便利です。