使用导入的数据绘制 R 中的关键差异

Plotting critical differences in R with imported data

可以使用 mlr 包生成用于比较多个数据集 (Demšar2006) 上的分类器的临界差异 (CD) 图,如下所示:

# THIS WORKS
library(mlr)
lrns = list(makeLearner("classif.knn"), makeLearner("classif.svm"))
tasks = list(iris.task, sonar.task)
rdesc = makeResampleDesc("CV", iters = 2L)
meas = list(acc)
bmr = benchmark(lrns, tasks, rdesc, measures = meas)
cd = generateCritDifferencesData(bmr)
plotCritDifferences(cd)

这需要评估结果驻留在一个相当复杂的BenchmarkResult对象中,尽管数据基本上是一个矩阵(其中M[i, j]保存分类器i对数据集的分数j)。 我之前在 Python 工作流程中生成了此类数据,并在 R 中导入到 data.frame 中(因为此类图似乎没有 Python 包)。

如何从这些数据生成 CD 图?

我想从 data.frame 创建一个 BenchmarkResult,但不知道从哪里开始:

# THIS DOES NOT WORK
library(mlr)
# Here I would import results from my experiments instead of using random data
# e.g. scores for 5 classifiers and 30 data sets, each
results = data.frame(replicate(5, runif(30, 0, 1)))
# This is the functionality I'm looking for
bmr = benchmarkResultFromDataFrame(results)
cd = generateCritDifferencesData(bmr)
plotCritDifferences(cd)

我终于成功地创建了情节。只需设置少数 BenchmarkResult's 属性:

  • leaners 每个分类器 idshort.name
  • measures
  • results 每个 dataset/classifier 组合 aggr

代码可能如下所示(5 个数据集的较小示例):

library(mlr)
# Here I would import results from my experiments instead of using random data
# e.g. scores for 5 classifiers and 30 data sets, each
results <- data.frame(replicate(5, runif(30, 0, 1)))
clf <- c('clf1', 'clf2', 'clf3', 'clf4', 'clf5')
clf.short.name <- c('c1', 'c2', 'c3', 'c4', 'c5')
dataset <- c('dataset1', 'dataset2', 'dataset3', 'dataset4', 'dataset5')
score <- list(acc)

# Setting up the learners: id, short.name
bmr <- list()
for (i in 1:5){
    bmr$learners[[clf[i]]]$id <- clf[i]
    bmr$learners[[clf[i]]]$short.name <- clf.short.name[i]
}

# Setting up the measures
bmr$measures <- list(acc)

# Setting up the results
for (i in 1:5){
  bmr$results$`dataset1`[[clf[i]]]$aggr <- list('acc.test.mean' = results[1, i])
}
for (i in 1:5){
  bmr$results$`dataset2`[[clf[i]]]$aggr <- list('acc.test.mean' = results[2, i])
}
for (i in 1:5){
  bmr$results$`dataset3`[[clf[i]]]$aggr <- list('acc.test.mean' = results[3, i])
}
for (i in 1:5){
  bmr$results$`dataset4`[[clf[i]]]$aggr <- list('acc.test.mean' = results[4, i])
}
for (i in 1:5){
  bmr$results$`dataset5`[[clf[i]]]$aggr <- list('acc.test.mean' = results[5, i])
}

# Set BenchmarkResult class
class(bmr) <- "BenchmarkResult"

# Statistics and plot
cd = generateCritDifferencesData(bmr)
plotCritDifferences(cd)

任何可以更好地教我 R 来避免这些 for 循环和代码重复的人仍然非常受欢迎!