我有一个k最近邻实现,让我可以在单次通过中计算多个k值和多个训练和测试数据子集(例如K-fold交叉验证中的所有折叠,AKA重采样度量)。我的实现也可以利用多个核心。
我想将我的方法接口与插入符号包一起使用。我可以轻松地为列车功能构建自定义方法。但这会导致多次调用模型拟合(每个参数和折叠组合一个)。
据我所知,使用trainControl时无法指出调整策略。火车的代码来源提到了关于“seq”模型拟合的东西:
## There are two types of methods to build the models: "basic" means that each tuning parameter
## combination requires it's own model fit and "seq" where a single model fit can be used to
## get predictions for multiple tuning parameters.
但我看不出有任何方法可以在自定义模型中实际使用它。
有关如何处理此问题的任何线索?
更一般地说,假设您有一个模型类,您可以使用单个模型拟合来估算多个参数的预测误差(例如ala Linear Regression LOOCV Trick,但也可以使用多个参数值),如何在插入符号中将其连接起来?
以下是在插入符号中设置(空)自定义模型的示例代码:
# Custom caret
library(caret)
learning_data = data.frame(y=sample(c("one","two","three"),200,replace=T))
learning_data = cbind(learning_data,matrix(runif(3*200),ncol=3))
testRatio=0.75
inTrain <- createDataPartition(learning_data$y, p = testRatio, list = FALSE)
trainExpr <- learning_data[inTrain,]
testExpr <- learning_data[-inTrain,]
trainClass <- trainExpr$y
testClass <- testExpr$y
trainExpr$y<-NULL
testExpr$y<-NULL
cv_opts = trainControl(method="cv", number=4,verboseIter=T)
my_knn <- function(data,weight,parameter,levels,last,...){
print("training")
# print(dim(data))
# str(parameter)
# list(fit=rdist(data$,data))
list(fit=NA)
}
my_knn_pred <- function(object,newdata){
print("testing")
# str(object)
# print(dim(newdata))
return("one")
}
sortFunc <- function(x) x[order(x$k),]
# Values of K to test
knn_opts = data.frame(.k=c(seq(7,11, 2))) #odd to avoid ties
custom_tr = trainControl(method="cv", number=4,verboseIter=T, custom=list(parameters=knn_opts,model=my_knn,prediction=my_knn_pred,probability=NULL,sort=sortFunc))
# This will result in 12 calls, 6 to my_knn, 6 to my_knn_pred, one per combination of fold and parameter value
custom_knn_performances <- train(x = trainExpr, y = trainClass,method = "custom",trControl=custom_tr,tuneGrid=knn_opts)
我想控制训练程序,以便在一次调用中生成所有折叠和参数值的预测。
答案 0 :(得分:3)
train
的当前自定义模型拟合部分不允许顺序参数。
下一个版本会。所有特定的型号代码将不再是硬编码的,并且将被模块化(包括顺序参数)。
这项工作大约完成了80%,我希望在今年年底之前完成。我想在这个版本上做很多测试。
如果您想在发布之前给我发电子邮件,请给我发电子邮件(但不保修)。
最高