web-dev-qa-db-ja.com

Rのランダムフォレスト(yの空のクラスと引数の長さ0)

ランダムフォレストを初めて扱っているのですが、理解できない問題がいくつかあります。すべてのデータセット(約3000行)で分析を実行しても、エラーメッセージは表示されません。しかし、データセットのサブセット(約300行)で同じ分析を実行すると、エラーが発生します。

_dataset <- read.csv("datasetNA.csv", sep=";", header=T)
names (dataset)
dataset2 <- dataset[complete.cases(dataset$response),]
library(randomForest)
dataset2 <- na.roughfix(dataset2)
data.rforest <- randomForest(dataset2$response ~ dataset2$predictorA + dataset2$predictorB+ dataset2$predictorC + dataset2$predictorD + dataset2$predictorE + dataset2$predictorF + dataset2$predictorG + dataset2$predictorH + dataset2$predictorI, data=dataset2, ntree=100, keep.forest=FALSE, importance=TRUE)

# subset of my original dataset:
groupA<-dataset2[dataset2$order=="groupA",]
data.rforest <- randomForest(groupA$response ~ groupA$predictorA + groupA$predictorB+ groupA$predictorC + groupA$predictorD + groupA$predictorE + groupA$predictorF + groupA$predictorG + groupA$predictorH + groupA$predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)

Error in randomForest.default(m, y, ...) : Can't have empty classes in y.
_

ただし、応答変数に空のクラスはありません。

代わりに、_(a+b+c,y)_ではなく_(y ~ a+b+c)_のようにrandomForestを記述すると、次のメッセージが表示されます。

_Error in if (n == 0) stop("data (x) has 0 rows") : 
  argument length zero
Warning messages:
1: In Ops.factor(groupA$responseA + groupA$responseB,  :
  + not meaningful for factors
_

2番目の問題は、rfImpute()を介してデータを補完しようとすると、エラーが発生することです。

_Errore in na.roughfix.default(x) :  roughfix can only deal with numeric data
_

ただし、私の列はすべて因子であり、数値です。

誰かが私が間違っているところを見ることができますか?

13
user1842218

コメントでの議論に基づいて、ここに潜在的な解決策の推測があります。

ここでの混乱は、因子のレベルが変数の属性であるという事実から生じます。これらのレベルは、データのサブセットを取得しても、そのサブセットがどれほど小さくても、同じままです。これは機能であり、バグではなく、一般的な混乱の原因です。

dropサブセット化時に不足しているレベルが必要な場合は、サブセット操作をdroplevels()でラップします。

_groupA <- droplevels(dataset2[dataset2$order=="groupA",])
_

この種の煩わしさを避けるために、多くのRユーザーが新しいセッションを開始するときに(たとえば、.Rprofileファイルで)options(stringsAsFactors = FALSE)を設定することも追加する必要があります。これを行うことの欠点は、コードを他の人と頻繁に共有する場合、Rのデフォルトオプションを変更していないと問題が発生する可能性があることです。

22
joran

サブセット化によって因子レベルが削除された場合、レベルをリセットする必要があります。

levels(train11$str);
[1] "B" "D" "E" "G" "H" "I" "O" "T" "X" "Y" "b";
train11$str <- factor(train11$str);
levels(train11$str);
[1] "B" "D" "E" "G" "H" "I" "O" "T" "b"
7
Robert Williams

これは、ランダムフォレストにデータを送信する前にトレーニングセットをサブ設定しているためです。サブ設定中に、サブ設定後に応答変数からいくつかのレベルが失われる可能性があるため、これを使用して係数を再割り当てする必要があります。

datadata2 $ response <-factor(dataset2 $ response)

サブ設定後、データに存在しない追加のレベルを削除します。

4
user6045163

RandomForestに渡す前に、関数式を使用してみてください。

formula("y ~ a+b+c")

これで問題は解決しました。

または、randomForestがパラメータを別のパラメータと間違えている可能性があります。

各パラメーターを指定してみてください。

randomForest(,,, data=my_data, mtry=my_mtry, etc)
3
Timothée HENRY

Callステートメントに問題があるようです。フォーミュラインターフェースを使用する場合は、

randomForest(response ~ predictorA + predictorB + ... + predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)

ただし、xyを明示的に渡す方が便利で高速です。

randomForest(y = groupA$response, x = groupA[,c("predictorA", "predictorB", ...)], ntree=100, keep.forest=FALSE, importance=TRUE)

変数の名前の代わりに、それらのインデックスを使用できます。これらの提案を試してください。

0
DrDom

randomForest(x =データ、y =ラベル、重要度= TRUE、ntree = 1000)

labelは要因であるため、randomForest関数に渡す前に、droplevels(label)を使用してカウントがゼロのレベルを削除します。できます。

各レベルのカウントを確認するには、table(label)関数を使用します。

0
Shobha Mourya

ミックスに追加するもう1つの提案:read.csv()で文字列を要素として解釈したくない場合があります。これをread.csvに追加して、文字への変換を強制してみてください。

dataset <- read.csv("datasetNA.csv", 
                    sep=";", 
                    header=T,
                    colClasses="character")
0
Jmoney38