我对如何在插入符号模型调整后预测新数据感到困惑。首先听起来很容易;只是调整一个模型并使用模型$ finalModel,但是有一些问题。
5.5.1预处理选项
这些处理步骤将在任何预测期间应用 使用predict.train,extractPrediction或extractProbs生成(参见 本文后面的详细信息)。预处理不会 应用于直接使用对象$ finalModel对象的预测。 link
你可以在这里阅读(它是包的创建者)
换句话说,在运行randomForest之前,您要求的任何预处理都是在训练集中完成的。它还对您预测的任何数据应用了相同的预处理(使用预测(RFFit,testSet))。 如果您使用finalModel 对象,则在预测之前使用predict.randomForest而不是predict.train和没有预处理。 link
接下来
首先,几乎从不使用$ finalModel对象进行预测。使用predict.train。这是原因的一个很好的例子。
某些函数(包括randomForest和train)如何处理虚拟变量之间存在一些不一致。 R中使用公式方法的大多数函数会将因子预测变量转换为虚拟变量,因为它们的模型需要数据的数字表示。对此的例外是基于树和规则的模型(可以分类为分类预测变量),朴素贝叶斯和其他一些模型。 link
在以下example see "2. Create A Standalone Model"(无预处理)中,您可以看到我们如何解决这个问题,他构建了一个全新的“独立模型”,并用于预测。在这里再次添加预处理很容易。
....
# create standalone model using all training data
set.seed(7)
finalModel <- randomForest(Class~., training, mtry=2, ntree=2000)
# make a predictions on "new data" using the final model
final_predictions <- predict(finalModel, validation[,1:60])
confusionMatrix(final_predictions, validation$Class)
但我不想每次都更改我的代码或手动从对象$ finalModel中提取和插入参数,这就是我使用插入符号的原因吗?
我想使用对象$ finalModel或至少提取其参数网格,BUT用于多个模型(即gbm,knn,...)
::: linux-gnu R version 3.4.1(2017-06-30)::: Single Candle :::
r_get_best <- function(.mth="gbm") {
library(caret)
library(mlbench)
library(randomForest)
data(Sonar)
idx <- createDataPartition(Sonar$Class,p=0.80,list=F)
trn <- Sonar[idx,]
tst <- Sonar[-idx,]
# settings
prp <- c("center","scale")
tcl <- trainControl(method="repeatedcv",number=3,repeats=3,preProcOptions=prp,verboseIter=F)
# train model(.mth)
set.seed(7)
fit <- train(Class~.,data=trn,method=.mth,metric="Accuracy",preProcess=prp,trControl=tcl)
print(fit)
print("")
print("----- final model -----")
print(fit$finalModel)
# i can get the result, but this way i have to construct a new grid + re-train a new final model
frs <- fit$results[which.max(fit$results[,fit$metric]),]
print("")
print("----- final model extracted -----")
print(frs)
# use fit$finalModel OR fit$bestTune ???
fml <- NULL # ??????????
# make test prediction on UNSEEN tst data using the final model
# prd <- predict(fml,tst[,-ncol(tst)])
# check the quality
# cfm <- confusionMatrix(prd,tst$Class)
# print("")
# print(cfm)
return(fml)
}
> r_get_best("gbm")
我不能使用predict(model $ finalModel)。我也不能使用predict.train(),因为我正在使用公式接口+预处理。
所以问题是,我怎样才能使用对象$ finalModel或者为多个方法提取其参数设置=“gbm,knn,rf,...”来预测新的(看不见的)数据,即使我正在使用公式界面+预处理+可能之前的交叉验证?
或者它是使用非公式界面的最佳方式吗?
对我感到羞耻,问题的一部分已经解决: 用于模型的最终值是n.trees = 150, interaction.depth = 2,shrinkage = 0.1和n.minobsinnode = 10.
> Tuned Parameters can be accessed through model$bestTune
n.trees interaction.depth shrinkage n.minobsinnode
150 2 0.1 10
但这是要走的路,创建一个新模型并再次对所有数据进行训练吗?