Coleção aprendizado

Linear / logística

Ajusta mínimos quadrados para resposta numérica ou regressão logística binária para resposta categórica de duas classes.

O que o bloco faz

Ajusta mínimos quadrados para resposta numérica ou regressão logística binária para resposta categórica de duas classes.

Antes de continuar

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

Modelo linear generalizado (GLM)
Uma extensão do modelo linear para respostas que não são normais, como contagens (Poisson) e proporções ou sim/não (binomial). Uma função de ligação conecta a média da resposta à parte linear do modelo.
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 como referência de comparação quando uma relação linear ou uma fronteira logística for adequada.

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.

  • A relação entre os preditores e a resposta (ou o logito da classe, na logística) é linear e aditiva: sem curvatura nem interação que o modelo não tenha.

    Verificar:Analisar resíduos

    Se falhar: Crie termos (quadrado, produto) com o data/mutate ou compare com um modelo de árvore (ml/cart, ml/forest) no mesmo teste.

  • Na classificação, duas classes, e a classe prevista é a segunda quando sua probabilidade é ≥ corte (padrão 0,5). Com classes desequilibradas o corte 0,5 favorece a maioritária.

    Verificar:Matriz de confusão

    Se falhar: Leia a balanced_accuracy no models/evaluate e a curva no models/roc, que não dependem do corte. Se mudar o corte, escolha-o com dados de treino (validação), nunca olhando o teste.

Configuração

resposta é a coluna a prever; preditores lista preditores numéricos separados por vírgula (vazio usa todos os numéricos exceto a resposta); tarefa aceita auto, regressao ou classificacao; seed fixa o ajuste.

Exemplo

d <- trama.ml::tr_ml_example("mtcars")
m <- trama.ml::tr_ml_linear(d, resposta = "mpg", preditores = "wt, hp")
trama.models::tr_models_predict(m, d[1:3, ])

Como interpretar

O modelo produz models/fit, consumido por models/predict (e pelos avaliadores da coleção de modelos). Resposta numérica em auto indica regressão; resposta categórica indica classificação binária.

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

  • stats::lm() versão 4.6.0Regressão: mínimos quadrados sobre os preditores escolhidos, sem interações.
  • stats::glm() versão 4.6.0Classificação binária: family = binomial(); a classe prevista é a segunda quando sua probabilidade é ≥ corte.

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

A conta é feita nestas chamadas:

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

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

  • 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

  • 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

  • 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

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

Ver a bibliografia completa do trama