2015-12-17 48 views
1

我有一些數據可以通過非隨機過程生成NA。通常這涉及用戶不用手動輸入數據或用各種自動作業進行系統性問題。由於這種GBM模型對我的吸引力,因爲它們明確處理NA值,而不是插補。但是,我遇到的問題是,GBM在我的測試集中輸出包含NA的行的預測結果。下面是與虹膜工作的例子:使用含GBM的NA預測新數據R

library(missForest) 
library(caret) 

set.seed(1) 
iris.na <- prodNA(iris, noNA = 0.1) 
iris.na$Species <- ifelse(iris.na$Species == "setosa", "setosa", "other") 
iris.na$Species <- as.factor(iris.na$Species) 

set.seed(1) 
train.idx <- createDataPartition(y = iris.na$Species, p = .90, list = FALSE) 
train <- iris.na[ train.idx,] 
test <- iris.na[ -train.idx,] 
rm(train.idx) 

fitControl <- trainControl(method = "cv", number = 5) 
#fitControl <- trainControl(method = "oob") 
fit <- train(Species ~ ., data = train, method = "gbm", 
     trControl = fitControl, 
     verbose = FALSE) 

現在,在樣本外預測工作,我會期望GBM和我收到的每一行一個預測。

train.pred <- predict(fit, type="prob") 
nrow(train) 
#[1] 136 
nrow(train.pred) 
#[1] 136 

但是,移出樣本測試數據不會爲每行返回一個預測。正如您在下面看到的,每個包含NA的行都不會返回預測結果。

test.pred <- predict(fit, newdata = test, type="prob") 
nrow(test) 
#[1] 14 
nrow(test.pred) 
#[1] 10 

因此,它似乎會降低NAs對新數據的預測。理想情況下,我希望在測試和訓練數據集中的每一行都能看到1-1的預測關係,但是我爲什麼僅僅爲了訓練而返回這個測試集而不是測試集。謝謝你的幫助。

回答

3

默認情況下,predict.train將刪除NAs:na.action = na.omit。您可以通過查看該功能(控制檯中鍵入predict.train)來查看此信息。另請注意,na.action僅適用於不在列車數據中的新數據(線路16上的!is.null(newdata))。

因此,解決方案是將,na.action =NULL添加到預測。

test.pred <- predict(fit, newdata = test, type="prob",na.action =NULL) 
nrow(test) 
#[1] 14 
nrow(test.pred) 
#[1] 14 
+0

完美修復。謝謝你的幫助! – Stencil