2016-05-25 5 views
1

私はPartyパッケージを使用してRでCART回帰ツリーモデルを構築していますが、テストデータセットでモデルを適用しようとするとレベルが一致しないというエラーメッセージが表示されます。デシジョンツリーパーティーパッケージ予測エラー - レベルが一致しない

私は先週、フォーラムのスレッドを読んで過ごしましたが、私の問題の正しい解決策はまだ見つかりませんでした。だから私はここで私が作った偽の例を使ってこの質問を再掲載しています..誰かがエラーメッセージを説明して解決策を教えてもらえますか?

私の訓練データセットは約1000レコードあり、テストデータセットは約150です。いずれのデータセットにも空白フィールドがありません。パーティのパッケージの下ctreeを使用して

私のCARTモデルは次のとおりです。

mytree<- ctree(Rate~Bank+Product+Salary, data=data_train)

data_train例:

Rate Bank Product Salary  
1.5 A  aaa  100000 
0.6 B  abc  60000 
3  C  bac  10000 
2.1 D  cba  50000 
1.1 E  cca  80000 

data_test例:

Rate Bank Product Salary 
2.0 A  cba  80000 
0.5 D  cca  250000 
0.8 E  cba  120000 
2.1 C  abc  65000 

levels(data_train$Bank) : A, B, C, D, E 

levels(data_test$Bank): A,D,E,C 

私は同じレベルに設定してみました次のコードを使用してください:

>is.factor(data_test$Bank) 

TRUE 
(Made sure Bank and Products are factors in both datasets) 
>levels(data_test$Bank) <-union(levels(data_test$Bank), levels(data_train$Bank)) 

> levels(data_test$product)<-union(levels(data_test$product),levels(data_train$product)) 

はしかし、私はテスト・データセットに対する予測を実行しようとすると、私は次のエラーを取得:

> fit1<- predict(mytree,newdata=data_test) 

Error in checkData(oldData, RET) : 
    Levels in factors of new data do not match original data 

を私はまた、次の方法を試してみましたが、それは私のテストデータセットのフィールドを変更します... :

levels(data_test$Bank) <-levels(data_train$Bank)

data_testテーブルが変更された:

Rate Bank(altered) Bank (original) 
2.0 A    A  
0.5 B    D  
0.8 C    E  
2.1 D    C  

答えて

1

あなたミグ既存の要因に新しいレベルを割り当てるのではなく、比較可能なレベルを使用して要因を再構築してみてください。ここに例があります:

# start the party 
library(party) 

# create training data sample 
data_train <- data.frame(Rate = c(1.5, 0.6, 3, 2.1, 1.1), 
         Bank = c("A", "B", "C", "D", "E"), 
         Product = c("aaa", "abc", "bac", "cba", "cca"), 
         Salary = c(100000, 60000, 10000, 50000, 80000)) 

# create testing data sample 
data_test <- data.frame(Rate = c(2.0, 0.5, 0.8, 2.1), 
         Bank = c("A", "D", "E", "C"), 
         Product = c("cba", "cca", "cba", "abc"), 
         Salary = c(80000, 250000, 120000, 65000)) 

# get the union of levels between train and test for Bank and Product 
bank_levels <- union(levels(data_test$Bank), levels(data_train$Bank)) 
product_levels <- union(levels(data_test$Product), levels(data_train$Product)) 

# rebuild Bank with union of levels 
data_test$Bank <- with(data_test, factor(Bank, levels = bank_levels)) 
data_train$Bank <- with(data_train, factor(Bank, levels = bank_levels)) 

# rebuild Product with union of levels 
data_test$Product <- with(data_test, factor(Product, levels = product_levels)) 
data_train$Product <- with(data_train, factor(Product, levels = product_levels)) 

# fit the model 
mytree <- ctree(Rate ~ Bank + Product + Salary, data = data_train) 

# generate predictions 
fit1 <- predict(mytree, newdata = data_test) 

> fit1 
    Rate 
[1,] 1.66 
[2,] 1.66 
[3,] 1.66 
[4,] 1.66 
+0

素晴らしい回避策。マジックのように動作します。 – yiyisue

関連する問題