diff --git a/scripts/ce089-09.R b/scripts/ce089-09.R index 535ddf227976c718e5b776e88310f5f7ffe95206..4bac78ddabf1477475acf9dff955c3d983cc14d2 100644 --- a/scripts/ce089-09.R +++ b/scripts/ce089-09.R @@ -4,6 +4,8 @@ #----------------------------------------------------------------------- # Cria a função com lista de todos os argumentos e use mapply(). +library(microbenchmark) + # Curva de poder. power_k_groups <- function(k = 3, r = 4, @@ -91,3 +93,66 @@ microbenchmark( replications = 20) #----------------------------------------------------------------------- +# Mais um exemplo. + +library(latticeExtra) + +# Situação: Para fazer um classificador por ensemble são usados +# `n_class` classificadores independentes (base/weak/lazy learners) que +# tem taxa de acerto individual de `tx_acer`. Qual é a taxa de acerto do +# ensemble de classificadores considerando como decisão a classe +# prevista por maioria simples? Fazer a curva de taxa de acerto do +# ensemble em função da taxa de acerto individual e do número de +# classificadores base do ensamble, ou seja, determinar +# `acc(n_class, tx_acer)`. + +simul <- function(n_class = 3, tx_acer = 0.55, N = 1000) { + #' @param n_class (integer[1] > 3) é o número de classificadores do + #' ensemble. + #' @param tx_acer (0 < double[1] < 1) é a taxa de acerto individual + #' de cada classificador independente do ensamble. + #' @param N (integer[1] > 1) é o número de simulações Monte Carlo. + #' @return (double[1]) a taxa de acerto do classificador ensemble. + u <- replicate(N, { + # Classe correta. + y <- rbinom(n = 1, size = 1, prob = 0.5) + # Classe predita por cada classificador. + x <- rbinom(n = n_class, + size = 1, + prob = 1 - abs(y - tx_acer)) + # Classe predita pela coleção usando maioria simples. + z <- as.integer(mean(x) > 0.5) + # Verifica se houve acerto. + z == y + }) + mean(u) +} + +# Grid de valores nos parâmetros da simulação. +grid <- expand.grid(n_class = c(3, 5, 9, 13, 19, 25), + tx_acer = seq(0.35, 0.95, by = 0.025)) +nrow(grid) + +# Obtenção da acurácia do ensemble em cada ponto de suporte. +grid$acc <- with(grid, + mapply(FUN = simul, + n_class, + tx_acer, + MoreArgs = list(N = 2000))) + +# Visualização das curvas. +xyplot(acc ~ tx_acer, + groups = n_class, + data = grid, + xlab = "Taxa de acerto do base learner", + ylab = "Taxa de acerto do ensemble", + auto.key = list(corner = c(0.95, 0.05), + title = "#Classif.", + cex.title = 1), + grid = TRUE, + type = "o") + + layer({ + panel.abline(v = 0.5, h = 0.5, lty = 2) + }) + +#-----------------------------------------------------------------------