2014-04-16 54 views
2

我想通過使用「caret」包的列車功能進行交叉驗證來建立CART模型。使用列車命令通過CrossValidation建立CART模型時預測功能的問題

我的數據是4500 x 110數據框,其中所有的預測變量(除了前兩個UserId和YOB(Year of Birth),我沒有用於模型構建)除了因變量這是整數類型(雖然只有兩個值1和0)。性別是自變量之一。

當我運行rpart命令獲取CART模型(使用軟件包「rpart」)時,我對預測函數沒有任何問題。不過,我想提高通過交叉驗證的模型,所以用下面的命令用於從包「插入符號」火車功能:

tr = train(y ~ ., data = subImpTrain, method = "rpart", trControl = tr.control, tuneGrid = cp.grid) 

此建立模型以下警告

Warning message: 
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, : 
    There were missing values in resampled performance measures. 

但它確實給了我一個最終模型(best.tree)。然而,當我試圖運行使用以下命令預測功能:

best.tree.pred = predict(best.tree, newdata = subImpTest) 

測試數據,這是給我下面的錯誤:

Error in eval(expr, envir, enclos) : object 'GenderMale' not found 

性別變量有兩個值:雌,雄

任何人可以幫助我理解錯誤

+0

看起來它正在尋找GenderMale列。你能比較你的訓練和測試集中的變量嗎? '相同(名稱(subImpTrain),名稱(subImpTest)'的輸出是什麼' – infominer

+0

它們是相似的,而且更令人困惑。 – user62198

回答

0

我曾在過去類似的問題,但關於另一種算法。 基本上,一些算法將因子變量轉換爲虛擬變量並相應地重命名它們。 我的解決方案是創建自己的假人,並以數字格式留下它們。 我讀過,即使如此,決策樹也能正常工作。

1

如@lorelai建議,caret如果您提供公式,則虛擬編碼您的變量。另一種方法是提供其變量本身,就像這樣:

tr = train(y = subImpTrain$y, x = subImpTrain[, -subImpTrain$y], 
      method = "rpart", trControl = tr.control, tuneGrid = cp.grid) 

更重要的是,你不應該使用predict.rpart,而使用predict.train,就像這樣:

predict(tr, subImpTest) 

在這種情況下,使用公式界面可以很好地工作。