2016-12-07 6 views
2

существенной разницы (CD) участок для сравнения классификаторов на несколько наборов данных (Demšar2006) может быть получен с помощью пакета MLR, например так:Plotting критических различий в R с импортируемыми данными

# 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 не существует).

Как я могу создать участок компакт-диска из этих данных?

Я думал о создании BenchmarkResult из data.frame, но не знаете с чего начать:

# 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) 
+0

Не знаете, что вы просите - ваш код уже создает участок компакт-диска? Структура объекта BenchmarkResult хорошо документирована, и вы должны иметь возможность извлекать информацию только с небольшими дополнительными усилиями. –

+0

Мне пришлось загрузить пакет «PMCMR» для предпоследней строки для запуска. Тогда сюжет выглядел хорошо. – lawyeR

+0

@LarsKotthoff Я добавил дополнительный код, чтобы выделить мою проблему. Кроме того, я смотрю на BenchmarkResult, но я все еще пытаюсь понять объектную ориентацию R, так как я не очень разбираюсь в R. – rvf

ответ

0

я, наконец, удалось создать сюжет. Необходимо установить только горстку BenchmarkResult's атрибутов:

  • leaners с id и short.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, 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 петель и дублирования кода все равно будет очень приветствуется!