【发布时间】:2016-05-24 19:57:20
【问题描述】:
我想通过在多个数据集上验证多个模型来生成一个包含汇总统计数据(AUC、Gini、RMSE 等)的数据框。
我有 x 包含在 ListOfModels 中的模型数量(分类器 - gbm、xgb、rf 等 - 全部内置在 caret 包中),以及 y 数据集数量(具有多个相同变量的数据框数据点)包含在 ListOfDatasets 中。
我可以通过在ldply 中运行自定义函数fun_modelStats(使用模型和数据集作为参数提取模型统计信息)来创建所需数据帧的简短版本 - 但只能通过 ListOfModels 和一个特定的数据集或 ListOfDatasets 和一个特定的模型,如下所示:
modelStats_by_model <- ldply(ListOfModels, function(model) {
modelStats <- fun_modelStats(model, B97_2012SU_2013)
})
和
modelStats_by_dataset <- ldply(ListOfDatasets, function(dataset) {
modelStats <- fun_modelStats(gbmFit1, dataset)
})
生成的带有模型统计信息的数据框有x 或y 行数,我无法理解使用x*y 行构建此数据框的方式,即来自所有已验证模型的统计信息在所有数据集上。
我对@987654332@、mapply 和for loop 进行了实验,但无济于事。
使用Map 我得到奇怪的错误输出:
modelStats_all <- Map(fun_modelStats, ListOfModels, ListOfDatasets)
for loop 确实使用下面的代码生成所需的输出,但仅在控制台中作为纯文本,而我需要它作为数据框。
for(i in names(ListOfModels)) {
for(j in names(ListOfDatasets)) {
modelStats <- fun_modelStats(ListOfModels[[i]], ListOfDatasets[[j]])
print(modelStats)
}
}
非常感谢您的帮助!
附:进一步搜索 SO(How to write a function that takes a model as an argument in R - 例如,这篇文章)显示使用aggregate.formula 或aggregate.data.frame 或rbind.data.frame 可能会有所帮助,但我不知道如何。
这是解决方案,以防万一有人遇到类似问题:
fun_multiModelStats <- function(ListOfModels, ListOfDatasets) {
multiModelStats <- data.frame()
for(i in names(ListOfModels)) {
for(j in names(ListOfDatasets)) {
model <- ListOfModels[[i]]
dataset <- ListOfDatasets[[j]]
modelStats <- fun_modelStats(model, dataset)
modelName <- names(ListOfModels[i])
datasetName <- names(ListOfDatasets[j])
modelStats <- cbind(modelName, datasetName, modelStats)
multiModelStats <- rbind(multiModelStats, modelStats)
}
}
return(multiModelStats)
}
然而,我想找到一个没有双 for 循环的解决方案,而是使用 apply 系列函数中的一些东西。
【问题讨论】:
标签: r functional-programming aggregate plyr mapply