Coleção aprendizado

SVM · vetores de suporte

Ajusta uma máquina de vetores de suporte para regressão ou classificação, com kernel configurável.

O que o bloco faz

Ajusta uma máquina de vetores de suporte para regressão ou classificação, com kernel configurável.

Antes de continuar

Termos que esta página usa, em poucas palavras. As definições completas estão no glossário.

Fator
Uma variável explicativa categórica cujo efeito se quer estudar, como adubo, cultivar ou dose. Num experimento fatorial, dois ou mais fatores são combinados.
Treino e teste
Dividir os dados em uma parte para ajustar o modelo (treino) e outra, guardada, para medir o desempenho (teste). O teste só é honesto se o modelo nunca o viu durante o ajuste.
Validação cruzada
Repetir a divisão treino/teste várias vezes, cada vez deixando uma parte diferente dos dados de fora, e fazer a média do desempenho. Dá uma estimativa mais estável do erro em dados novos do que uma única divisão.
Hiperparâmetro
Uma configuração do método escolhida antes do ajuste, como a profundidade de uma árvore ou o número de árvores de uma floresta. Costuma ser escolhida por validação cruzada, nunca olhando o conjunto de teste.
Matriz de confusão
A tabela que cruza a classe verdadeira com a classe prevista. Dela saem acurácia, sensibilidade, especificidade e precisão, que podem contar histórias diferentes quando as classes têm tamanhos muito diferentes.

Quando usar

Use para ajustar uma fronteira linear ou não linear. A escala é estimada no treino e reaplicada nas previsões. Requer e1071.

Pressupostos

  • O bloco recebe só o treino: o teste foi separado antes (no ml/split) e não entra em nenhuma escolha — nem de preditores, nem de hiperparâmetros, nem de tratamento de faltantes. A saída teste do ml/split vem marcada e é recusada aqui (tr_ml_error_test_leak); a marca sobrevive ao cache e a filtros, mas não a uma divisão feita por fora nem a juntar treino e teste — nesses casos o bloco não tem como saber o que recebeu.

    Se falhar: Refaça o fluxo com o ml/split no início; a saída teste só vai ao models/predict. Hiperparâmetros se escolhem no ml/tune, com validação cruzada dentro do treino.

  • Nenhum preditor revela a resposta (identificador, código que a embute, medida tomada depois do desfecho).

    Verificar:Resumo

    Se falhar: Tire essas colunas de preditores (ou com o data/select antes do ml/split).

  • As linhas são independentes e vêm da mesma população em que o modelo vai ser usado: sem ordem no tempo, sem várias linhas do mesmo indivíduo, lote ou área repartidas entre treino e teste.

    Se falhar: Com tempo, use estrategia = "temporal" no ml/split e no ml/tune (teste sempre posterior ao treino); com indivíduos, lotes ou áreas repetidos, estrategia = "grupo" (nenhum grupo dos dois lados).

  • Os preditores são numéricos, finitos e sem faltantes — o bloco recusa o resto. Fatores entram só depois de codificados em números.

    Verificar:Resumo

    Se falhar: Trate faltantes com o data/drop_na ou o data/replace_na e codifique fatores com o data/mutate. Uma imputação que usa estatísticas (média, mediana) deve sair só do treino.

  • Os preditores estão em escalas comparáveis: o bloco padroniza cada um com média e desvio do treino e reaplica essa padronização na previsão, então isso já está garantido.

    Se falhar: Nada a fazer; não padronize antes com estatísticas do conjunto inteiro (vazaria o teste).

  • cost e gamma (e o kernel) são hiperparâmetros: os valores padrão raramente são os bons, e o resultado é sensível a eles.

    Verificar:Ajustar hiperparâmetrosAvaliar previsões

    Se falhar: Escolha-os no ml/tune, na escala logarítmica, nunca olhando o teste.

  • As probabilidades .prob_* saem de uma calibração à parte (Platt, ajustada por validação cruzada interna do LIBSVM) e a classe em .pred é a de maior probabilidade — não o lado da margem. Perto da fronteira as duas regras podem divergir; o bloco segue a das probabilidades para que .pred e .prob_* sempre concordem.

    Verificar:Matriz de confusão

    Se falhar: Se a regra da margem importar, compare as .prob_* com a matriz de confusão; com poucos dados a calibração de Platt é instável.

  • O resultado depende da semente: outra semente muda a divisão, os folds ou o próprio ajuste, e com poucos dados a diferença pode ser grande.

    Se falhar: Repita com outras sementes e leia a variação; não escolha a semente pelo resultado.

Configuração

kernel escolhe linear, radial, polynomial ou sigmoid; cost controla penalidade dos erros; gamma controla escala do kernel e não se aplica ao kernel linear. Recebe também resposta, preditores, tarefa e seed.

Exemplo

d <- trama.ml::tr_ml_example("iris_binaria")
m <- trama.ml::tr_ml_svm(d, resposta = "Species", preditores = "Petal.Length, Petal.Width", kernel = "radial")
trama.models::tr_models_predict(m, d[1:3, ])

Como interpretar

models/predict acrescenta a classe previsto e probabilidades prob_<classe> quando disponíveis. Kernel não linear descreve fronteira menos diretamente que limiares de árvore.

Teste recusado

A saída teste do ml/split é recusada aqui (tr_ml_error_test_leak): ajustar nela treinaria no teste. Ligue a saída treino; o teste vai só ao models/predict.

Implementação

  • e1071::svm() versão 1.7.17type = "eps-regression" ou "C-classification", kernel, cost, gamma; scale = TRUE (padrão: centra e escala pelo treino); probability = TRUE na classificação, e .pred = classe de maior probabilidade (a mesma que o svm_predict_probability do LIBSVM devolve).

No código O bloco chama trama.ml::tr_ml_svm(), em trama.ml/R/nodes.R:39.

A conta é feita nesta chamada:

  • e1071::svm(x = d$x, y = d$y, type = if (d$tarefa == "regressao") "eps-regression" else "C-classification", kernel = kernel, cost = cost, gamma = gamma, proba...

    em tr_ml_fit() · trama.ml/R/model.R:115

Outras funções de pacotes que o bloco usa (11)
  • stats::reformulate(d$internos, response = ".y")

    em tr_ml_fit() · trama.ml/R/model.R:71

  • stats::lm(f, treino)

    em tr_ml_fit() · trama.ml/R/model.R:76

  • stats::glm(f, treino, family = stats::binomial())

    em tr_ml_fit() · trama.ml/R/model.R:76

  • stats::binomial()

    em tr_ml_fit() · trama.ml/R/model.R:76

  • rpart::rpart(f, treino, method = if (d$tarefa == "regressao") "anova" else "class", control = rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, m...

    em tr_ml_fit() · trama.ml/R/model.R:84

  • rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, minsplit = minsplit, cp = cp, xval = if (poda == "nenhuma") 0L else min(10L, nrow(treino)))

    em tr_ml_fit() · trama.ml/R/model.R:84

  • rpart::prune(arvore, cp = extras$poda$cp)

    em tr_ml_fit() · trama.ml/R/model.R:91

  • figsr::figs(f, treino, max_splits = max_splits, min_n = min_n, mode = if (d$tarefa == "regressao") "regression" else "classification")

    em tr_ml_fit() · trama.ml/R/model.R:96

  • ranger::ranger(f, treino, num.trees = trees, mtry = mm, min.node.size = min_n, max.depth = max_depth, probability = d$tarefa == "classificacao", seed = seed,...

    em tr_ml_fit() · trama.ml/R/model.R:104

  • xgboost::xgb.train(params = params, data = xgboost::xgb.DMatrix(X, label = label), nrounds = nrounds, verbose = 0)

    em tr_ml_fit() · trama.ml/R/model.R:130

  • xgboost::xgb.DMatrix(X, label = label)

    em tr_ml_fit() · trama.ml/R/model.R:130

Referências

Teoria

  • Cortes, C.; Vapnik, V. (1995). Support-vector networks. Machine Learning, 20(3), 273-297. doi:10.1007/BF00994018

Livro-texto

  • James, G.; Witten, D.; Hastie, T.; Tibshirani, R. (2021). An Introduction to Statistical Learning: with Applications in R. 2. ed. New York: Springer. doi:10.1007/978-1-0716-1418-1
  • Hastie, T.; Tibshirani, R.; Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction. 2. ed. New York: Springer. doi:10.1007/978-0-387-84858-7

Complementar

  • Chang, C.-C.; Lin, C.-J. (2011). LIBSVM: A library for support vector machines. ACM Transactions on Intelligent Systems and Technology, 2(3), 1-27. doi:10.1145/1961189.1961199

Ver a bibliografia completa do trama