# ============================================================
# 18. Validacao cruzada k-fold (k=5, estratificada)
# ============================================================
set.seed(123)
k_folds <- 5L
folds <- createFolds(dados$classe, k = k_folds, list = TRUE, returnTrain = FALSE)
grade_cost_kfold <- c(1, 10, 100)
grade_gamma_kfold <- c(0.001, 0.01, 0.05, 0.1)
metricas_folds <- vector("list", k_folds)
for (fold_i in seq_len(k_folds)) {
idx_teste <- folds[[fold_i]]
idx_treino <- setdiff(seq_len(nrow(dados)), idx_teste)
fold_treino <- dados[idx_treino, ]
fold_teste <- dados[idx_teste, ]
x_fold_tr <- fold_treino %>% select(-all_of(colunas_nao_preditoras))
x_fold_te <- fold_teste %>% select(-all_of(colunas_nao_preditoras))
y_fold_tr <- droplevels(fold_treino$classe)
y_fold_te <- factor(fold_teste$classe, levels = levels(y_fold_tr))
nzv_fold <- nearZeroVar(x_fold_tr)
if (length(nzv_fold) > 0) {
x_fold_tr <- x_fold_tr[, -nzv_fold, drop = FALSE]
x_fold_te <- x_fold_te[, colnames(x_fold_tr), drop = FALSE]
}
pp_fold <- preProcess(x_fold_tr, method = c("center", "scale"))
x_fold_tr_n <- predict(pp_fold, x_fold_tr)
x_fold_te_n <- predict(pp_fold, x_fold_te)
m1 <- svm(x = x_fold_tr_n, y = y_fold_tr,
kernel = "linear", cost = 1, scale = FALSE)
m2 <- svm(x = x_fold_tr_n, y = y_fold_tr,
kernel = "radial", cost = 10, gamma = 0.01, scale = FALSE)
k_cv_fold <- min(5L, min(table(y_fold_tr)))
ajuste_fold <- tune.svm(
x = x_fold_tr_n,
y = y_fold_tr,
kernel = "radial",
cost = grade_cost_kfold,
gamma = grade_gamma_kfold,
tunecontrol = tune.control(cross = k_cv_fold)
)
m3 <- ajuste_fold$best.model
pca_fold <- prcomp(x_fold_tr_n, center = FALSE, scale. = FALSE)
var_acum_f <- cumsum(pca_fold$sdev^2 / sum(pca_fold$sdev^2))
n_comp_f <- min(which(var_acum_f >= 0.95)[1], 30L, ncol(x_fold_tr_n))
x_pca_tr <- as.data.frame(pca_fold$x[, 1:n_comp_f, drop = FALSE])
x_pca_te <- as.data.frame(predict(pca_fold, x_fold_te_n)[, 1:n_comp_f, drop = FALSE])
m4 <- svm(x = x_pca_tr, y = y_fold_tr,
kernel = "radial", cost = 10, gamma = 0.01, scale = FALSE)
m5 <- randomForest(x = x_fold_tr_n, y = y_fold_tr, ntree = 200L)
metricas_folds[[fold_i]] <- bind_rows(
avaliar_modelo("SVM linear", confusionMatrix(predict(m1, x_fold_te_n), y_fold_te)),
avaliar_modelo("SVM radial", confusionMatrix(predict(m2, x_fold_te_n), y_fold_te)),
avaliar_modelo("SVM radial ajustado", confusionMatrix(predict(m3, x_fold_te_n), y_fold_te)),
avaliar_modelo("PCA + SVM radial", confusionMatrix(predict(m4, x_pca_te), y_fold_te)),
avaliar_modelo("Random Forest", confusionMatrix(predict(m5, x_fold_te_n), y_fold_te))
) %>% mutate(fold = fold_i)
cat(sprintf(
"Fold %d/%d concluido. SVM ajustado: cost = %s | gamma = %s\n",
fold_i, k_folds,
ajuste_fold$best.parameters$cost,
ajuste_fold$best.parameters$gamma
))
}