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 doml/splitvem 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/splitno início; a saída teste só vai aomodels/predict. Hiperparâmetros se escolhem noml/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 odata/selectantes doml/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"noml/splite noml/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_naou odata/replace_nae codifique fatores com odata/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).
costegamma(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.prede.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 = TRUEna classificação, e.pred= classe de maior probabilidade (a mesma que osvm_predict_probabilitydo 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...
Outras funções de pacotes que o bloco usa (11)
stats::reformulate(d$internos, response = ".y")stats::lm(f, treino)stats::glm(f, treino, family = stats::binomial())stats::binomial()rpart::rpart(f, treino, method = if (d$tarefa == "regressao") "anova" else "class", control = rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, m...rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, minsplit = minsplit, cp = cp, xval = if (poda == "nenhuma") 0L else min(10L, nrow(treino)))rpart::prune(arvore, cp = extras$poda$cp)figsr::figs(f, treino, max_splits = max_splits, min_n = min_n, mode = if (d$tarefa == "regressao") "regression" else "classification")ranger::ranger(f, treino, num.trees = trees, mtry = mm, min.node.size = min_n, max.depth = max_depth, probability = d$tarefa == "classificacao", seed = seed,...xgboost::xgb.train(params = params, data = xgboost::xgb.DMatrix(X, label = label), nrounds = nrounds, verbose = 0)xgboost::xgb.DMatrix(X, label = label)
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