r - 在 `bwplot()` 中对 `caret` 模型进行排序
问题描述
我正在绘制使用caret
. 这些模型以它们所指的年份命名:2000、2001、2002、...、2010。我希望模型以基于年份的升序出现在箱形图中,即模型的名称。
基于以下代码的重采样摘要
fit.year.res <- resamples(fit.year)
summary(fit.year.res)
看起来像这样:
但是,箱形图中的不同年度模型没有排序:
scales <- list(x=list(relation="free"), y=list(relation="free"))
bwplot(fit.year.res, scales=scales)
我尝试将重采样的模型元素转换为fit.year.res$models
字符的因子,但这并没有什么不同。
解决方案
该函数bwplot.resamples
用于生成此图,如果您查看底层代码,变量会根据它们在感兴趣的指标下的平均性能进行分解。
下面我有进行分解的相关代码:
bwplot.resamples <- function (x, data = NULL, models = x$models, metric = x$metric, ...)
{
....
avPerf <- ddply(subset(plotData, Metric == metric[1]),
.(Model),
function(x) c(Median = median(x$value, na.rm = TRUE)))
avPerf <- avPerf[order(avPerf$Median),]
......
}
我想你需要做的是手动制作情节:
data(BloodBrain)
gbmFit <- train(bbbDescr[,-3], logBBB,"gbm",tuneLength=6,
trControl = trainControl(method = "cv"),verbose=FALSE)
glmnetFit <- train(bbbDescr[,-3], logBBB,"glmnet",tuneLength=6,
trControl = trainControl(method = "cv"))
rfFit <- train(bbbDescr[,-3], logBBB,"rf",tuneLength=6,
trControl = trainControl(method = "cv"))
knnFit <- train(bbbDescr[,-3], logBBB,"knn",tuneLength=6,
trControl = trainControl(method = "cv"))
resamps <- resamples(list(gbm = gbmFit,glmnet=glmnetFit,knn=knnFit,rf=rfFit))
如果您绘制,您可以看到它们是根据中位数(实心点)排序的:
bwplot(resamps,metric="MAE")
您可以访问 $values 下的值并创建一个函数来绘制它,如下所示:
plotMet = function(obj,metric,var_order){
mat = obj$values
mat = mat[,grep(metric,colnames(mat))]
colnames(mat) = gsub("[~][^ ]*","",colnames(mat))
boxplot(mat[,var_order],horizontal=TRUE,las=2,xlab=metric)
}
plotMet(resamps,"MAE",c("rf","knn","gbm","glmnet"))
用数字命名你的模型也不是一个好主意..尝试类似model_2000,model_2001等
推荐阅读
- node.js - 使用 docker compose 运行 redis
- python - 如何从列中选择它是python中DataFrame中的列表的所有元素?
- mysql - 如何将查询转换为批量操作?
- azure-logic-apps - 有什么方法可以自定义 HTTP 请求触发器的 URL?
- xslt - XSL:组合两个应用模板的输出并对它们进行排序
- vba - VBA 功能区栏集成
- javascript - 带有 Selenium 的 Powershell:错误:元素不可交互
- python - Python authlib flask - 如何明确地进行授权重定向?
- javascript - 为什么应用程序脚本中的日期不等价
- python - 将 .dat 文件加载到一个列表中并计算其中的实体