2017-08-04 4 views
0

ランダムフォレストアルゴリズムを使用してモデルを訓練しました。今私は、このモデルを使って1つのレコードだけを含むデータセットに対して結果を予測したいと思います。列車データフレームごとにテストデータフレームのレベルを変更

predictコマンドを実行しようとすると、次のエラーが発生します。

predict.randomForest(model、test1、type = "response")のエラー: 新しいデータの予測子の種類がトレーニングデータの予測子の種類と一致しません。

トレーニングとテストのデータフレームで要因変数のレベルが異なることに注目してください。

だから私は、リンクの問合せ下記をご参照くださいスクリプト

common <- intersect(names(train), names(test1)) 
for (p in common) { if (class(train[[p]]) == "factor") { levels(test1[[p]]) <- levels(train[[p]]) } } 

を使用してレベルを変更するためにstakoverflowで1つの解決策を見つけました。

r random forest error - type of predictors in new data do not match

しかし、残念ながら、それは変数のほとんどのデータの値を変更します。値を持つ1変数名「カテゴリー」があるtest1のデータフレームで

「> = 100」それは我々が唯一のfactorのために変更する必要があり、「11-50」

答えて

0

に変更します。たとえば

それはrandomForestに基づいている場合

nm1 <- names(which(sapply(train, is.factor))) 
for (p in nm1) { 
    levels(test1[[p]]) <- levels(train[[p]]) 
} 

クラス

は、私たちも trainデータを探す必要はありません。 modelオブジェクトから xlevelsを取得し、あなたの応答のためにその

lvlslst <- model[["forest"]][["xlevels"]] 
lvlsCols <- names(lvlslst)[sapply(lvlslst, is.character)] 
for(j in lvlsCols) { 
    levels(test1[[j]]) <- lvlslst[[j]] 

} 
+0

感謝をもとに「test1の」列のlevelsを割り当てます。私はあなたが提供した両方のソリューションを試しましたが、それはテストデータフレームでも値を変更します。 – user3734568

+0

@ user3734568私は 'levels'をあなたのコードのように割り当てているだけで、何も変更していません。あなたはあなたのデータセットをチェックしなければなりません – akrun

+0

あなたの応答に感謝します。私のtest1のデータは1行しかなく、カテゴリ1のレベルは "> = 100"だと思いますが、私の列車データは400レコードあり、カテゴリは "11-50"、 "51-100"、 "> 100" 。テストレベル1(test1 [p])<レベル(train [p])を使用すると、テスト1では列車サンプルの第1レベルを考慮し、列車データフレームでは値をレベル1に置き換えます。 – user3734568

関連する問題