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

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

# THIS WORKSlibrary(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 WORKlibrary(mlr)# Here I would import results from my experiments instead of using random data# e.g. scores for 5 classifiers and 30 data sets, eachresults = data.frame(replicate(5, runif(30, 0, 1)))# This is the functionality I'm looking forbmr = benchmarkResultFromDataFrame(results)cd = generateCritDifferencesData(bmr)plotCritDifferences(cd)

回答:

我最终成功创建了图表。只需设置BenchmarkResult的少数几个属性即可:

  • leaners,每个分类器的idshort.name
  • measures
  • results,每个数据集/分类器组合的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, eachresults <- 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.namebmr <- 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 measuresbmr$measures <- list(acc)# Setting up the resultsfor (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 classclass(bmr) <- "BenchmarkResult"# Statistics and plotcd = generateCritDifferencesData(bmr)plotCritDifferences(cd)

如果有人能教我更好的R代码来避免这些for循环和代码重复,我将非常欢迎!

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注