web-dev-qa-db-ja.com

欠損値を持つRでランダムフォレストを使用する方法は?

library(randomForest)
rf.model <- randomForest(WIN ~ ., data = learn)

ランダムフォレストモデルに適合させたいのですが、このエラーが発生します。

Error in na.fail.default(list(WIN = c(2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L,  : 
missing values in object

16個の数値属性でデータフレームを学習し、WINはレベル0 1の要因です。

68
Borut Flis

この質問に対する私の最初の反応は、「誰も」がランダムフォレストが予測子の欠損値を処理しないことを知っているため、あまり研究努力を示さなかったことです。しかし、?randomForestをチェックする際には、このことについてもっと明確にできることを告白しなければなりません。

(ただし、ドキュメントにリンクされているBreimanの [〜#〜] pdf [〜#〜] は、欠損値はまったく処理されないと明示的に述べています。)

私が見ることができた公式ドキュメントの唯一の明白な手がかりは、na.actionパラメーターのデフォルト値がna.failであるということでした。

いずれにせよ、予測変数に欠損値がある場合、(基本的に)2つの選択肢があります。

  1. 別のツールを使用します(rpartは欠損値をうまく処理します)。
  2. 欠損値を補完する

当然のことながら、randomForestパッケージにはこれを行うための関数rfImputeがあります。 ?rfImputeのドキュメントは、その基本的な使用例を示しています。

少数のケースにのみ欠損値がある場合は、na.action = na.omitを設定して、それらのケースを単にドロップすることもできます。

そしてもちろん、この答えは、あなたの問題が実際に単純に欠損値を持っているという推測の少しです。

111
joran

欠損値が参考になる可能性がある場合は、欠損値を入力し、(new.vars<-is.na(your_dataset)を使用して)追加のバイナリ変数を追加し、new.varyour_datasetに追加するには大きすぎる場合はエラーを下げるかどうかを確認します。それを単独で使用し、varImpPlotで重要な変数を選択してyour_datasetに追加できます。また、NAnew.var <- rowSums(new.vars)の数をカウントする単一の変数をyour_datasetに追加することもできます。

欠損変数は、不完全な代入手順だけによるモデルエラーの増加を修正できる可能性のある欠損変数が有益なアカウンティングである場合、オフトピックの答えではありません。

欠損値は有益であり、非ランダムな原因により発生します。これは、社会実験の設定で特に一般的です。

3
Qbik

randomForestパッケージの基になっているブライマンのランダムフォレストは、実際には欠損値の処理を予測子で行います。 randomForestパッケージでは、次を設定できます。

   na.action = na.roughfix

欠損値の中央値/モードを使用することから始めますが、その後、フォレストを成長させて近接度を計算し、これらの新たに満たされた値などを使用してフォレストを反復および構築します。これはrandomForest documentation(p10 ) 。状態だけ

.... NAは列中央値に置き換えられます....これは、ランダムフォレストによる欠損値の代入の開始点として使用されます。

ブライマンの ホームページ では、もう少し情報が見つかります

missfill = 1,2は、トレーニングセット(1に等しい場合)およびより注意深い置換(2に等しい場合)の欠損値の高速置換を行います。

missfill = 2を指定したmfixrep = kは、トレーニングセットのみでk反復の近接を使用して、より低速ですが、通常はより効果的な置換を行います。 (nprox> 0が必要です)。

1
Brigitte