-3

だから私は何が起こっているのかについてかなり良い考えを持っていますが、エラーをどのように処理するのか疑問に思っています. それらはすべてGLMに関連しているようで、エラーは私が考えていない同じことが原因ではありません。

これが私のコードです:

myTuneGrid <- expand.grid(n.trees=c(100,200), interaction.depth=c(9,10,11,12), shrinkage=0.1, n.minobsinnode=10)

fitControl <- trainControl(method = "cv", number =5,verboseIter = FALSE,returnResamp = "all")

myModel <- train(as.factor(target) ~ .,data = trainingDataC.GB, method = "gbm",trControl = fitControl,tuneGrid = myTuneGrid)

myPrediction <- predict(myModel,newdata=testDataC)

これが私のエラーです:

model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) のエラー: 因子 47V には新しいレベル E、H、J があります

したがって、因子変数にはトレーニング セットに多数のレベルがありますが、エラーから、すべてのレベルがトレーニング セットに含まれているとは限りません。テスト セットに移動すると、トレーニング セットにない新しいレベルがあるため、このエラーが発生しますか?

これは教師あり学習の問題です。テスト セットを変更してデータをトレーニング セットに移動することはできません。したがって、サンプリングの問題ではありません。

とにかく、これが私のプログラムをクラッシュさせないように、誰かが設定や簡単な修正を知っていますか?

4

1 に答える 1

0

これは、kaggle コンペティションでかなり頻繁に発生します。変数を組み合わせてレベル引数を作成し、因子にトレーニングとテストの両方のすべてのレベルが含まれるようにすることができます。これはすべて、kaggle スクリプトで非常に多く見られます。

mtcars に基づくこの非常に単純な例を参照してください。変数名を引用符で囲んで入力するだけで (例: "cyl")、変数はトレーニング セットとテスト セットの両方で因子に設定され、両方のセットで使用可能なすべてのレベルが設定されます。これにより、モデルでエラーが発生するのを防ぐことができます。これは、トレーニング セットで利用できない因子レベルから何かを学習するという意味ではありません。

train <- subset(mtcars, cyl < 8)
test <- subset(mtcars, cyl >= 8)


fact_train_test <- function(x) {
  levels <- unique(c(train[[x]], test[[x]]))
  train[[x]] <<- factor(train[[x]], levels=levels)
  test[[x]]  <<- factor(test[[x]],  levels=levels)
}

fact_train_test("cyl")

これを行うにはおそらく他の方法がありますが、うまくいきます。

于 2016-03-05T09:26:49.193 に答える