14

初めてランダム フォレストを扱っているのですが、理解できない問題がいくつかあります。すべてのデータセット (約 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)代わりに、このように randomForest を記述した場合:(y ~ a+b+c)

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

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

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

4

8 に答える 8

22

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

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

サブセット化するときに不足しているレベルを削除する場合は、サブセット操作を次のようにラップしますdroplevels()

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

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

于 2012-11-21T16:02:53.860 に答える
4

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

dataset2$response <- factor(dataset2$response)

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

于 2016-03-10T13:54:00.587 に答える
0

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)

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

于 2012-11-21T14:49:27.143 に答える
-1

今日も同じ問題があり、解決しました。ランダム フォレストを実行する場合、R の既定値は分類ですが、私の応答は数値です。サブセットをトレーニング データセットとして使用する場合、トレーニングのレベルはテストと比較して制限されます。

于 2013-09-01T17:21:53.913 に答える