Aprendizado Sensível a Custos (Cost-Sensitive Learning)

O que é aprendizado sensível a custos?

Aprendizado sensível a custos (cost-sensitive learning) é o conjunto de métodos para treinar e implantar sistemas de aprendizado de máquina (machine learning) quando erros diferentes têm consequências diferentes. Em muitas aplicações reais, o “melhor” modelo não é o que tem a maior acurácia, mas o que minimiza o custo esperado dado:

  • as probabilidades que um modelo produz (ou escores),
  • as ações que você pode tomar (aprovar/negar, tratar/aguardar, sinalizar/ignorar),
  • e um modelo de custos descrevendo o que acontece quando você toma uma ação sob cada desfecho verdadeiro.

Exemplos típicos:

  • Detecção de fraude: Deixar passar uma fraude (falso negativo) pode custar $1000; sinalizar uma transação legítima (falso positivo) pode custar $5 em sobrecarga de suporte e perda de clientes.
  • Triagem médica: Um falso negativo pode atrasar o tratamento (alto custo); um falso positivo aciona exames de acompanhamento (custo menor, mas não trivial).
  • Moderação de conteúdo: Um falso positivo remove conteúdo benigno (custo de confiança/expressão); um falso negativo mantém conteúdo nocivo no ar (custo de segurança).

O aprendizado sensível a custos fica na interseção entre:

  • Aprendizado (como você ajusta os parâmetros do modelo), e
  • Tomada de decisão (como você transforma previsões em ações).

Ele é estreitamente relacionado, mas não é o mesmo que, lidar com dados desbalanceados (veja Desbalanceamento de Classes) e escolher métricas de avaliação (veja Métricas).

Custos, ações e o objetivo de custo esperado

Matrizes de custo (binário e multiclasse)

Para um problema de classificação binária com rótulo verdadeiro (y \in {0,1}) e rótulo previsto (\hat{y} \in {0,1}), um modelo de custos comum atribui custos aos resultados:

  • Falso positivo (FP): prever 1 quando (y=0) → custo (C_{\text{FP}})
  • Falso negativo (FN): prever 0 quando (y=1) → custo (C_{\text{FN}})
  • Previsões corretas podem ter custo 0 ou, às vezes, benefício / custo negativo.

Isso pode ser escrito como uma matriz de custo (cost matrix) (C[y,\hat{y}]). Em cenários multiclasse, (C) torna-se uma matriz (K \times K), onde (C[i,j]) é o custo de prever a classe (j) quando a verdade é (i).

Custo esperado e decisões Bayes-ótimas

Se você tiver probabilidades calibradas (p(y \mid x)), a regra de decisão que minimiza o custo esperado é:

[ \hat{a}(x) = \arg\min_{a \in \mathcal{A}} \sum_{y} C[y,a] , p(y \mid x) ]

Para a classificação multiclasse padrão em que as ações são “prever a classe (j)”, isso se torna:

[ \hat{y}(x) = \arg\min_{j} \sum_{i=1}^{K} C[i,j] , p(y=i \mid x) ]

Esta é uma visão teórico-decisória: probabilidades + custos ⇒ ação ótima.

Definição de limiar: a regra de decisão sensível a custos na classificação binária

Muitos modelos produzem um escore ou probabilidade (\hat{p} = p(y=1 \mid x)). Suponha:

  • O custo de FP é (C_{\text{FP}})
  • O custo de FN é (C_{\text{FN}})
  • O custo de previsões corretas é 0

Se você prever positivo, o custo esperado é ((1-\hat{p})C_{\text{FP}}).
Se você prever negativo, o custo esperado é (\hat{p}C_{\text{FN}}).

Escolha positivo quando: [ (1-\hat{p})C_{\text{FP}} < \hat{p}C_{\text{FN}} \Rightarrow \hat{p} > \frac{C_{\text{FP}}}{C_{\text{FP}} + C_{\text{FN}}} ]

Então o limiar ótimo é: [ t^* = \frac{C_{\text{FP}}}{C_{\text{FP}} + C_{\text{FN}}} ]

Implicação-chave: se (C_{\text{FN}}) for muito maior do que (C_{\text{FP}}), o limiar fica pequeno, e você prevê positivo com mais frequência.

Exemplo prático: limiar para detecção de fraude

  • Custo de FP = $5 (revisão manual + tempo de suporte)
  • Custo de FN = $500 (fraude não detectada)

[ t^* = \frac{5}{5+500} \approx 0.0099 ]

Até mesmo uma probabilidade de fraude de 1% pode justificar sinalizar, se esses custos estiverem corretos e o modelo estiver bem calibrado.

Isso destaca uma surpresa comum: limiares sensíveis a custos podem ficar bem longe de 0,5.

Codificando custos durante o treinamento

Há duas alavancas amplas:

  1. Mudar o objetivo de aprendizado (o treinamento passa a ser sensível a custos).
  2. Manter o treinamento “padrão” e então mudar a regra de decisão (definição de limiar ou argmin baseado em custo).

Ambas podem funcionar; qual é melhor depende de os custos serem estáveis, de você precisar de probabilidades calibradas e de a família de modelos conseguir representar a fronteira de decisão necessária.

Perdas ponderadas e pesos de classe

Uma abordagem comum é ponderar exemplos na perda:

[ \min_\theta \sum_{i=1}^{n} w_i , \ell(f_\theta(x_i), y_i) ]

Para classificação binária, os pesos frequentemente dependem da classe:

  • (w_1) para a classe positiva
  • (w_0) para a classe negativa

Isso é implementado como class_weight em muitas bibliotecas.

Intuição:

  • Aumentar (w_1) faz o otimizador prestar mais atenção a erros nos positivos (reduzindo FN, geralmente aumentando FP).
  • Aumentar (w_0) faz o oposto.

Importante: ponderação de classes não é idêntica a usar a matriz de custo teórico-decisória exata, especialmente se:

  • você se importa com a qualidade da probabilidade (calibração),
  • os custos se aplicam às decisões (pós-limiar), não à perda contínua,
  • ou os custos dependem do contexto (por exemplo, valor da transação).

Pesos de amostra (custos específicos por instância)

Às vezes, os custos variam por exemplo:

  • O valor da fraude difere por transação
  • Clientes de alto valor têm custos de churn diferentes
  • Alguns pacientes são de maior risco

Então você pode usar pesos por exemplo (w_i) proporcionais ao custo de classificar incorretamente aquela instância. Muitos estimadores aceitam sample_weight.

Perdas personalizadas sensíveis a custos

Algumas equipes implementam objetivos personalizados que refletem custos de forma mais direta, por exemplo:

  • perda logística / entropia cruzada ponderada
  • perdas de margem assimétrica
  • aproximações diferenciáveis de custo esperado

Cuidado: otimizar diretamente um substituto (surrogate) moldado pelo custo pode melhorar o ponto de operação que você quer, mas pode piorar a calibração de probabilidades.

Reamostragem vs ponderação

Reamostragem (oversampling da minoria, undersampling da maioria) às vezes é usada para imitar sensibilidade a custos, mas isso altera a priori de classe efetiva vista pelo modelo. Isso pode ser útil para aprendizado de representações, mas também pode prejudicar a calibração, a menos que seja corrigido.

Para mais sobre quando a reamostragem ajuda (e quando engana), veja Desbalanceamento de Classes.

Aprendizado sensível a custos vs dados desbalanceados (são relacionados, não idênticos)

Conjuntos desbalanceados frequentemente motivam métodos sensíveis a custos, mas os conceitos diferem:

  • Desbalanceamento é sobre com que frequência as classes ocorrem (distribuição dos dados).
  • Sensibilidade a custos é sobre quanto valem os erros (distribuição de utilidade).

Você pode ter:

  • classes balanceadas, mas custos muito assimétricos (por exemplo, alarmes críticos de segurança),
  • classes desbalanceadas, mas custos simétricos (detecção de evento raro onde falsos alarmes também são caros).

A acurácia implicitamente assume custo igual e importância igual por exemplo; ela costuma ser uma má escolha para problemas sensíveis a custos.

Escolha de métricas: medindo o que você realmente se importa

Métricas padrão embutem suposições:

  • Acurácia trata FP e FN como iguais e pondera exemplos igualmente.
  • Precisão/Revocação/F1 enfatizam positivos, mas não codificam custos explícitos.
  • AUC ROC mede a qualidade de ranqueamento ao longo de limiares, mas não escolhe um ponto de operação.
  • AUC PR é mais informativa sob desbalanceamento, mas ainda não codifica uma razão de custos específica.

Avaliação sensível a custos frequentemente foca em:

  • Custo esperado / utilidade esperada
  • Custo em um ponto de operação escolhido (limiar, restrição de capacidade)
  • Curvas de custo ou desempenho em uma faixa de razões de custo

Para conectar métricas a custos, normalmente você precisa de uma Matriz de Confusão no limiar escolhido, além de um modelo de custo.

Um fluxo de trabalho prático (recomendado em muitos cenários de produção)

Um padrão robusto é separar:

  1. Treinar um modelo para produzir bons escores/probabilidades.
  2. Calibrar probabilidades (se necessário).
  3. Escolher a regra de decisão (limiar ou argmin multiclasse) com base nos custos.
  4. Avaliar usando custo esperado e fazer teste de estresse para mudanças de custo.

Isso tende a ser mais sustentável do que “embutir” uma única razão de custos permanentemente no treinamento.

Etapa 1: Treine um modelo probabilístico (frequentemente sem custos codificados rigidamente)

Escolhas comuns:

  • Regressão logística
  • Árvores com gradient boosting
  • Redes neurais com entropia cruzada

Mesmo que você eventualmente faça definição de limiar baseada em custo, você quer bom ranqueamento e, idealmente, boas estimativas de probabilidade.

Etapa 2: Calibre (muitas vezes necessário)

Regras de decisão baseadas em custo assumem que (p(y\mid x)) é significativo. Muitos modelos modernos não são perfeitamente calibrados por padrão.

Veja Calibração para métodos como:

  • escalonamento de Platt (calibração logística)
  • regressão isotônica
  • escalonamento de temperatura (comum em redes profundas)

Etapa 3: Escolha o limiar / regra de decisão usando custos (e restrições)

Você pode calcular o limiar teoricamente ótimo a partir dos custos, mas na prática você também pode ter restrições:

  • número limitado de casos que podem ser revisados manualmente por dia,
  • restrições de SLA,
  • diretrizes legais/médicas.

Isso transforma a decisão em otimização com restrições: minimizar custo esperado sujeito à capacidade.

Etapa 4: Avalie pelo custo esperado (não apenas AUC)

Custo esperado em um conjunto de teste: [ \widehat{\mathbb{E}}[C] = \frac{1}{n}\sum_{i=1}^n C[y_i, \hat{y}_i] ]

Ou em unidades de negócio: dólares por 1000 decisões, dano por paciente, etc.

Use Validação e Validação Cruzada corretamente: escolha limiares nos folds de validação e então reporte o custo no conjunto de teste final para evitar viés otimista.

Exemplo trabalhado em Python (seleção de limiar + custo esperado)

Abaixo há um exemplo binário simplificado usando probabilidades previstas. Ele:

  • seleciona um limiar que minimiza o custo esperado em um conjunto de validação,
  • e então avalia o custo esperado em um conjunto de teste.
import numpy as np

def expected_cost(y_true, p_hat, threshold, c_fp=5.0, c_fn=500.0):
    y_pred = (p_hat >= threshold).astype(int)
    fp = np.sum((y_true == 0) & (y_pred == 1))
    fn = np.sum((y_true == 1) & (y_pred == 0))
    return (c_fp * fp + c_fn * fn) / len(y_true)

# Example arrays
p_val  = model.predict_proba(X_val)[:, 1]
p_test = model.predict_proba(X_test)[:, 1]

thresholds = np.linspace(0, 1, 1001)
costs = [expected_cost(y_val, p_val, t, c_fp=5, c_fn=500) for t in thresholds]
t_star = thresholds[int(np.argmin(costs))]

test_cost = expected_cost(y_test, p_test, t_star, c_fp=5, c_fn=500)
print("Chosen threshold:", t_star)
print("Expected cost on test:", test_cost)

Se seu modelo não estiver calibrado, o limiar escolhido pode ser instável ou sistematicamente incorreto. Nesse caso, calibre primeiro (por exemplo, com CalibratedClassifierCV no scikit-learn) e então repita.

Armadilhas práticas (e como evitá-las)

1) Falhas de calibração quebram decisões baseadas em custo

A definição de limiar sensível a custos assume que o escore é uma probabilidade (ou ao menos monotônico e bem comportado). Se as probabilidades estiverem mal calibradas:

  • Você pode definir o limiar baixo/alto demais, aumentando o custo.
  • A fórmula “teórica” do limiar torna-se pouco confiável.

Mitigações:

  • Use calibração explícita (Calibração) em um conjunto de validação representativo.
  • Verifique curvas de calibração e erro de calibração esperado (ECE).
  • Recalibre quando a distribuição de dados mudar.

2) Ponderação de classe e reamostragem podem distorcer probabilidades

Treinar com class_weight ou oversampling altera a priori de classe efetiva vista durante o treinamento, o que pode:

  • melhorar trade-offs de revocação/precisão,
  • mas deslocar probabilidades previstas para longe da taxa base real.

Mitigações:

  • Quando viável, prefira definição de limiar pós-hoc em probabilidades calibradas.
  • Se você precisar reponderar/reamostrar, calibre após o treinamento em dados que reflitam a distribuição real de implantação.

3) Custos mudam ao longo do tempo (e frequentemente são incertos)

Em sistemas reais, (C_{\text{FP}}) e (C_{\text{FN}}) raramente são constantes:

  • o custo da equipe de revisão muda,
  • padrões de fraude mudam,
  • impactos a jusante variam por segmento de usuário,
  • regulações ou políticas mudam.

Mitigações:

  • Trate as razões de custo como parâmetros e avalie em uma faixa (análise de sensibilidade).
  • Mantenha a saída do modelo como escore/probabilidade e ajuste o limiar conforme os custos mudem.
  • Reavalie periodicamente o modelo de custo com as partes interessadas.

4) Avaliar com a métrica errada leva ao modelo errado

Um modelo com ROC AUC melhor ainda pode ter custo esperado pior no seu ponto de operação. Por outro lado, otimizar apenas o custo esperado em uma razão de custo pode reduzir robustez se essa razão mudar.

Mitigações:

  • Reporte custo esperado no ponto de operação escolhido.
  • Também reporte métricas de ranqueamento independentes de limiar (ROC AUC / PR AUC) para contexto (veja ROC).
  • Use Análise de Erros (Fatiamento) para encontrar segmentos onde o custo dispara (por exemplo, um subgrupo onde FNs se concentram).

5) Contar custos duas vezes (ponderação + limiar)

Se você:

  • aumentar muito o peso dos positivos durante o treinamento, e
  • também definir um limiar muito baixo na inferência,

você pode passar do ponto e criar falsos positivos demais. Isso nem sempre está errado, mas deve ser intencional.

Mitigação:

  • Decida se a sensibilidade a custos está principalmente no treinamento ou na tomada de decisão; evite fazer ambos às cegas.
  • Ajuste pesos e limiares conjuntamente no custo de validação.

6) “Custo” pode incluir custo de oportunidade e restrições

Às vezes, o maior custo não é FP/FN em si, mas recursos restritos:

  • apenas 500 revisões manuais/dia,
  • leitos de UTI limitados,
  • capacidade finita de call center.

Isso se torna “otimizar sob uma restrição de capacidade”, frequentemente resolvido por:

  • ordenar por escore e pegar os top (k),
  • ou selecionar um limiar que resulte em uma taxa-alvo de alertas.

Isso ainda é tomada de decisão sensível a custos, mas a restrição faz parte do modelo de ação.

Avaliando modelos sob custo esperado

Da matriz de confusão ao custo

Dada uma matriz de confusão com contagens (\text{TP}, \text{FP}, \text{TN}, \text{FN}), o custo esperado por exemplo é:

[ \frac{C_{\text{FP}}\text{FP} + C_{\text{FN}}\text{FN} + C_{\text{TP}}\text{TP} + C_{\text{TN}}\text{TN}}{N} ]

Frequentemente (C_{\text{TP}} = C_{\text{TN}} = 0), mas nem sempre. Por exemplo, tomar uma ação (prever positivo) pode incorrer em um custo de processamento mesmo quando correto (por exemplo, custo de revisão manual).

Curvas de custo e seleção do ponto de operação

Curvas ROC mostram TPR vs FPR ao longo de limiares (veja ROC). Para incorporar custo, você pode:

  • converter (FPR, TPR) de cada limiar em custo esperado usando prevalência e custos,
  • escolher o limiar que minimiza custo.

Isso torna o modelo de custo explícito, em vez de depender implicitamente de AUC.

Validação cruzada com seleção sensível a custos

Ao fazer seleção de modelos:

Um erro comum é ajustar para AUC e então escolher um limiar ad hoc; pode funcionar, mas frequentemente deixa de encontrar o ponto de operação de menor custo.

Considerações avançadas

Custos dependentes do contexto e ponderação “sensível a valor”

Em muitos domínios, custo é uma função do contexto:

  • Custo de FN em fraude é proporcional ao valor da transação.
  • Custo de FP pode depender do valor do tempo de vida do cliente.
  • Dano médico pode depender do perfil de risco do paciente.

Isso leva a custos dependentes do exemplo e a:

  • ponderação por exemplo durante o treinamento e/ou
  • regras de decisão por exemplo (o limiar pode variar por segmento).

Opção de rejeição (abstenção) e humano no loop

Às vezes você tem uma terceira ação: “abster-se / encaminhar para humano”. A tomada de decisão sensível a custos se estende naturalmente:

  • Prever positivo
  • Prever negativo
  • Adiar (incorre em custo de revisão, reduz custos de erro)

Isso se conecta a decisões sensíveis à incerteza (veja Estimativa de Incerteza).

Equidade e sensibilidade a custos

Custos podem diferir entre subpopulações devido a fatores sistêmicos, e otimizar o custo esperado global pode amplificar disparidades. Se os custos refletem danos reais, você pode precisar de:

Checklist de resumo

  • Defina custos e ações explicitamente. Não presuma que custos de FP/FN são iguais ou constantes.
  • Prefira saídas de probabilidade + calibração quando decisões dependem de limiares.
  • Use regras de decisão sensíveis a custos: limiar (t^* = \frac{C_{\text{FP}}}{C_{\text{FP}}+C_{\text{FN}}}) (caso binário simples).
  • Codifique custos no treinamento com pesos de classe ou pesos de amostra quando isso ajudar representação e ranqueamento — mas monitore a calibração.
  • Avalie com custo esperado no seu ponto de operação, não apenas acurácia/AUC.
  • Planeje para mudanças de custo: trate razões de custo como parâmetros, faça análise de sensibilidade e mantenha a lógica de decisão ajustável.

O aprendizado sensível a custos, em última instância, trata de alinhar sistemas de ML com consequências do mundo real: o modelo só é “bom” se suas decisões forem boas sob os custos que você de fato paga.