web-dev-qa-db-ja.com

scikits機械学習の欠損値

Scikit-learnに欠損値がある可能性はありますか?それらはどのように表現されるべきですか?それに関するドキュメントは見つかりませんでした。

30
Vladtn

欠落した値はscikit-learnではサポートされていません。これについてはメーリングリストで以前に議論されましたが、それらを処理するコードを実際に作成する試みはありません。

アルゴリズムの多くはNaNを含むサンプルの処理を拒否するため、何をするにしても、しないNaNを使用して欠損値をエンコードしないでください。

上記の答えは時代遅れです。 scikit-learnの最新リリースにはクラス Imputer があり、機能ごとの単純な欠損値補完を行います。 NaNを含む配列をフィードして、対応する特徴の平均値、中央値、またはモードで置き換えることができます。

30
Fred Foo

簡単な例を提供できればいいのですが、RandomForestRegressorがNaNを適切に処理するnotを実行できることがわかりました。 NaNのパーセンテージが増加する機能を追加すると、パフォーマンスは着実に悪化します。 「数が多すぎる」NaNを持つ機能は、nanが非常に有用な情報を示している場合でも、完全に無視されます。

これは、アルゴリズムがneverの判断を "isnan"または "ismissing"に分割するためです。アルゴリズムは、その特徴のサンプルのサブセットに単一のNaNがある場合、ツリーの特定のレベルで特徴を無視を実行します。ただし、ツリーの下位レベルでは、サンプルサイズが小さい場合、サンプルのサブセットが特定のフィーチャの値にNaNを持たない可能性が高くなり、そのフィーチャで分割が発生する可能性があります。

私はこの問題に対処するためにさまざまな代入手法(平均値/中央値で置き換える、別のモデルを使用して欠損値を予測するなど)を試しましたが、結果はさまざまでした。

代わりに、これは私の解決策です:NaNを単一の明らかに範囲外の値(-1.0など)に置き換えます。これにより、「未知の値と既知の値」という基準でツリーを分割できます。ただし、このような範囲外の値を使用すると、奇妙な副作用があります。範囲外の値に近い既知の値は、アルゴリズムが適切な場所を見つけようとすると、範囲外の値と一緒にまとめられる可能性があります。分割します。たとえば、既知の0は、NaNを置き換えるために使用される-1と一緒にまとめられます。したがって、モデルは、範囲外の値が最小値よりも小さいか、最大値よりも大きいかどうかに応じて変化する可能性があります(それぞれ最小値または最大値に集中する可能性があります)。これは手法の一般化に役立つ場合とそうでない場合があります。結果は、動作の最小値または最大値サンプルがNaN値サンプルとどの程度類似しているかによって異なります。

15
John Prior

欠損値を平均値/中央値/その他の統計で置き換えると、値が欠損しているという事実が重要になる可能性があるため、問題を解決できない場合があります。たとえば、身体的特徴に関する調査では、異常に背が高いまたは小さいことに戸惑っていた場合、回答者は身長を示さないことがあります。これは、欠損値が回答者が異常に高いまたは小さいことを示していることを意味します-中央値の反対です。

必要なのは、欠損値に対して別のルールを持つモデルです。欠損値を推測しようとすると、モデルの予測力が低​​下する可能性があります。

例えば:

df['xvariable_missing'] = np.where(df.xvariable.isna(),1,0)
df.xvariable = df.xvariable.fillna(df.xvariable.median())
12
Johnny V

データに対してRandomForestRegressorを実行すると、非常によく似た問題に遭遇しました。 NA値の存在は、予測のために「nan」をスローしていました。ブライマンによるドキュメンテーションは、いくつかのディスカッションをスクロールしながら、連続データとカテゴリカルデータの2つのソリューションをそれぞれ推奨しています。

  1. 列(機能)からのデータの中央値を計算し、これを使用します(連続データ)
  2. 最も頻繁に発生するカテゴリを特定し、これを使用します(カテゴリデータ)

ブライマンによれば、アルゴリズムのランダムな性質とツリーの数により、予測の精度にあまり影響を与えずに修正が可能になります。これは、NA値の存在がまばらである場合に当てはまると思います。多くのNA値を含む機能が影響を与える可能性が最も高いと思います。

9
Jcrow06

オレンジ は別のpython代入に専用の機能を備えた機械学習ライブラリです。私はそれらを使用する機会がありませんでしたが、ナンをゼロ、平均、または中央値に置き換えると、すべて重大な問題が発生します。

3
John Prior

私はこの問題に出会います。実際のケースでは、RでmissForestと呼ばれるパッケージを見つけました。このパッケージはこの問題を適切に処理し、欠損値を補完して私の予測を大幅に向上させます。

NAを中央値または平均値で単に置き換えるのではなく、 missForest は、欠損値がどうあるべきかを予測して置き換えます。データマトリックスの観測値でトレーニングされたランダムフォレストを使用して予測を行います。多数の欠損値を含む大規模なデータセットでは、実行が非常に遅くなる可能性があります。したがって、この方法にはトレードオフがあります。

pythonの同様のオプションは predictive_imputer です

2
M.Jeremy

入力フィーチャで欠損値に遭遇した場合、ビジネスの最初の順序は、欠損値を補完する方法ではありません。最も重要な質問は、なぜあなたを守るべきかです。データの背後にある「真の」現実が何であるかを明確かつ明確に考えていない限り、偽りを言う衝動を抑えることができます。これはそもそもテクニックやパッケージについてではありません。

歴史的に、主に決定木のようなツリー法に頼っていました。なぜなら、少なくとも一部の人は、線形回帰、ロジスティック回帰、またはNNのような回帰を推定するために欠損値を代入することは、列 '。いわゆる行方不明の情報。これは、たとえばベイジアンに精通している人にとって、精通している概念であるべきです。

ビッグデータを実際にモデル化している場合、それについて話す以外に、多数の列に直面する可能性があります。テキスト分析などの特徴抽出の一般的な慣例では、欠落はcount = 0と非常によく言えます。あなたは根本的な原因を知っているのでそれは大丈夫です。特に構造化されたデータソースに直面しているときの現実は、根本的な原因がわからない、または単に知る時間がないということです。しかし、エンジンが許容できる値であるNANや他のプレースホルダーであっても、エンジンは値を強制的にプラグインします。モデルが代入するのと同じくらい優れていると私は非常によく主張するかもしれませんが、意味がありません。

1つの興味深い質問は、次のとおりです。分割プロセス内の近いコンテキストによって欠落が判断されると、1次または2次代理が発生します。コンテキスト自体はランダムな選択であるため、フォレスト化は実際にコンテキスト判断を無効にしますか?ただし、これは「より良い」問題です。少なくともそれほど害はありません。それは確かに欠落の保存を不必要にするはずです。

実際問題として、入力フィーチャが多数ある場合、結局のところ、代入する「良い」戦略を立てることはできません。純粋な帰属の観点から、ベストプラクティスは一変量以外のものです。これは、RFのコンテストに参加することであり、RFを使用してモデル化する前に代入することを意味します。

したがって、誰かが私たち(または私たち)に「それを行うことはできません」と言わない限り、失われた「細胞」を持ち越し、「最善の」方法を完全に迂回できるようにする必要があります。

1
opt135