Ir para o conteúdo

8.2. Regression

Regressão prevê um número, então o erro também é um número — e é aí que está toda a dificuldade. Em classificação o erro é um fato: certo ou errado. Aqui toda previsão está um pouco errada, e uma métrica é uma decisão sobre como somar toda essa falta de acerto. Formas diferentes de somar premiam modelos completamente diferentes, então a métrica não é um relatório no fim; é uma especificação no começo.

Tudo abaixo é construído sobre o resíduo:

\[ e_i = y_i - \hat{y}_i \]

e difere apenas no que faz com o sinal, a magnitude e os outliers.

A escolha que decide tudo: absoluto ou quadrático

\[ \text{MAE} = \frac{1}{N}\sum_{i=1}^{N} |e_i| \qquad\qquad \text{MSE} = \frac{1}{N}\sum_{i=1}^{N} e_i^2 \]

Parecem dois sabores da mesma ideia. Não são, e a diferença tem enunciado preciso: elas são minimizadas por previsões diferentes.

  • Minimizar o MSE entrega a média da distribuição do alvo1.
  • Minimizar o MAE entrega a mediana.

Por isso a escolha não é questão de gosto. Se você treina um modelo de tempo de entrega com MSE, ele prevê o tempo médio, e médias são puxadas para cima pelo desastre raro. Treine com MAE e ele prevê o tempo que metade das entregas bate — em geral o que o cliente estava perguntando. Mesmos dados, mesma arquitetura, pergunta respondida diferente.

Abaixo: um conjunto de tempos de entrega com cauda longa à direita. As curvas são o MSE e o MAE como funções de uma única previsão constante \(c\); arraste o \(c\) e veja onde cada uma atinge o fundo.

Por que elevar ao quadrado produz a média, em uma linha

Minimize \(\sum (y_i - c)^2\) zerando a derivada: \(-2\sum(y_i - c) = 0 \Rightarrow c = \frac{1}{N}\sum y_i\). A média, exatamente.

Faça o mesmo com \(\sum |y_i - c|\): a derivada de \(|y_i - c|\) vale \(-1\) para os pontos acima de \(c\) e \(+1\) para os abaixo, então o total zera quando há tantos pontos acima quanto abaixo — a mediana, e não importa o quão acima eles estão. Essa indiferença à distância é a robustez, enunciada com precisão.

RMSE: as unidades voltam

O MSE está em unidades ao quadrado — minutos ao quadrado, reais ao quadrado — que ninguém consegue interpretar. Tirar a raiz resolve:

\[ \text{RMSE} = \sqrt{\frac{1}{N}\sum_{i=1}^{N} e_i^2} \]

O RMSE mantém a preferência do MSE pela média e a sensibilidade a erros grandes, mas se lê na mesma unidade do alvo. Isso o torna o padrão para relatório, e ele vem com um diagnóstico de brinde:

\[ \text{RMSE} \;\ge\; \text{MAE} \qquad\text{sempre} \]

com igualdade apenas quando todos os erros têm exatamente a mesma magnitude. Então a razão RMSE/MAE mede o quanto os seus erros são desiguais. Ruído gaussiano puro dá \(\sqrt{\pi/2} \approx 1{,}25\); bem acima disso significa que algumas previsões são muito piores que as demais, e o certo é ir olhar esses casos um a um em vez de ajustar qualquer coisa.

O que um único outlier faz

Arraste o ponto vermelho. Nada mais muda: mesmos dados, mesma família de modelos, mesmo código.

ou arraste direto no gráfico

Duas coisas acontecem ao mesmo tempo quando você arrasta, e só uma delas é culpa da métrica.

As métricas se movem: o RMSE cresce mais rápido que o MAE, e o MedAE — a mediana dos erros absolutos — quase não percebe, porque mediana não liga para o quão longe está o ponto distante. Isso é robustez medida, não afirmada.

O modelo também se move. A reta laranja é ajustada por mínimos quadrados, então ela persegue o outlier: a inclinação cai de 0,961 para 0,423 conforme você puxa o ponto para baixo. A reta verde, ajustada para minimizar o erro absoluto, fica em 0,989 o tempo todo. A métrica que você otimiza é o modelo que você obtém — a mesma lição da média e da mediana, agora visível no próprio ajuste.

O que fazer a respeito

  • Olhe os resíduos antes de escolher. Um histograma de resíduos vale mais que qualquer regra.
  • Se a cauda é real (tempos de entrega, rendas, sinistros de seguro), ela é o dado, não um erro — reporte MedAE ou um quantil, e considere treinar com MAE ou Huber.
  • Se a cauda é dado ruim (um sensor travado em zero, um erro de digitação em um preço), conserte o dado. Nenhuma métrica compensa rótulo corrompido.
  • A perda de Huber é o meio-termo, quadrática perto de zero e linear além de \(\delta\):
\[ L_\delta(e) = \begin{cases} \tfrac{1}{2}e^2 & |e| \le \delta \\ \delta\left(|e| - \tfrac{1}{2}\delta\right) & |e| > \delta \end{cases} \]

Ela é diferenciável em todo ponto (ao contrário do MAE em zero) e de influência limitada (ao contrário do MSE), e é por isso que a torch.nn.SmoothL1Loss é o padrão em detectores de objetos2.

R²: uma comparação, não uma porcentagem

\[ R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} \]

Olhe o que está no denominador: o erro de prever a média de \(y\) para todo mundo. Ou seja, o \(R^2\) não mede qualidade em abstrato — mede o quanto você é melhor que a linha de base mais boba possível. Esse enquadramento resolve quase toda a confusão em torno dele:

  • \(R^2 = 1\) — previsões perfeitas.
  • \(R^2 = 0\) — você foi exatamente tão bem quanto chutar sempre a média. O modelo não acrescentou nada.
  • \(R^2 < 0\)possível, e comum em dados de teste. Você foi pior que a média constante. Se você nunca viu um \(R^2\) negativo, provavelmente só o calculou no conjunto de treino.

Três coisas que o \(R^2\) não é

Não é "a porcentagem da variância explicada" em geral. Essa leitura só vale para modelos lineares ajustados por mínimos quadrados nos mesmos dados. Para uma rede neural em dados separados, é apenas a comparação acima.

Não é comparável entre conjuntos de dados. O \(R^2\) depende da variância de \(y\) na sua amostra. Um modelo de preços de imóveis pode marcar 0,9 em uma cidade e 0,3 em outra mais homogênea — errando os mesmos reais. Compare RMSE entre conjuntos, não \(R^2\).

Ele nunca diminui quando você acrescenta variáveis, por mais inúteis que sejam, e é para isso que existe o \(R^2\) ajustado:

\[ R^2_{\text{adj}} = 1 - (1 - R^2)\frac{N - 1}{N - k - 1} \]

com \(k\) preditores. Use-o para comparar modelos de tamanhos diferentes nos mesmos dados.

Erros percentuais, e onde eles mordem

\[ \text{MAPE} = \frac{100}{N}\sum_{i=1}^{N}\left|\frac{y_i - \hat{y}_i}{y_i}\right| \]

O MAPE é popular porque "estamos errando 8%" viaja bem em reunião. Ele também tem três arestas afiadas, e a primeira sozinha já o desqualifica para muitos problemas:

  1. É indefinido em \(y_i = 0\) e enorme perto disso. Previsão de demanda tem zeros. Qualquer alvo de contagem tem zeros.
  2. É assimétrico. Prever 50 quando a verdade é 100 dá 50%. Prever 150 quando a verdade é 100 também dá 50%, mas prever 200 dá 100% — enquanto o maior erro possível por subestimação é limitado a 100%. Otimizar MAPE, portanto, enviesa o modelo a prever baixo.
  3. Ele pesa enormemente os alvos pequenos. Errar por 1 unidade em um valor verdadeiro de 2 custa 50%; o mesmo erro absoluto sobre 1000 custa 0,1%.
Em vez disso Definição Por que é melhor
sMAPE \(\dfrac{100}{N}\sum \dfrac{\lvert e_i\rvert}{(\lvert y_i\rvert + \lvert\hat{y}_i\rvert)/2}\) Quase simétrico e limitado, embora ainda desconfortável perto de zero
MASE3 \(\dfrac{\text{MAE do seu modelo}}{\text{MAE da previsão ingênua}}\) Livre de escala, definido em zero, e se lê direto: abaixo de 1 você bate a linha de base ingênua
WAPE \(\dfrac{\sum \lvert e_i\rvert}{\sum \lvert y_i \rvert}\) Erro percentual agregado; robusto a alvos pequenos individuais

Calcule sempre a linha de base

Todo relatório de regressão deveria trazer, ao lado do modelo, a nota do modelo trivial: prever a média, a mediana ou — para qualquer coisa com tempo envolvido — o último valor observado. Bater o último valor é genuinamente difícil em previsão de séries, e um modelo que não bate não é um modelo. Esta é a versão em regressão da checagem de prever-sempre-a-majoritária da página de classificação.

Prever uma faixa em vez de um número

Às vezes um número só é a saída errada. A perda quantílica (ou pinball) treina o modelo para prever o quantil \(\tau\) em vez da média:

\[ L_\tau(e) = \begin{cases} \tau \, e & e \ge 0 \\ (\tau - 1)\, e & e < 0 \end{cases} \]

Leia como um MAE assimétrico: com \(\tau = 0{,}9\), subestimar é punido nove vezes mais que superestimar, então o modelo aprende um valor que ele só vai ultrapassar em 10% das vezes. Treine três modelos em \(\tau = 0{,}1;\ 0{,}5;\ 0{,}9\) e você tem um intervalo de previsão em vez de um ponto — muitas vezes bem mais útil para quem precisa agir sobre ele. Note que \(\tau = 0{,}5\) é o MAE, a menos de um fator dois4.

Qual métrica, e por quê

A sua situação Use Porque
Erros mais ou menos simétricos, sem outliers absurdos RMSE Mesma unidade, padrão, pune erros grandes
A cauda é real e você não pode persegui-la MAE ou MedAE Os dois miram o meio da distribuição, não a média
Os outliers são dados corrompidos Conserte o dado, depois RMSE Nenhuma métrica repara rótulo ruim
Comparar com uma linha de base "não fazer nada" , MASE Ambos são razões contra um preditor trivial
Comparar conjuntos com escalas diferentes MASE, WAPE, ou R² com cuidado RMSE não é comparável entre variâncias de \(y\) diferentes
A chefia pensa em porcentagem WAPE ou MAPE se não houver zeros Porcentagem viaja bem, mas cheque zeros e o viés para baixo
Você precisa de uma faixa, não de um ponto Perda quantílica Entrega o intervalo diretamente
Treinar uma rede com alvos de cauda pesada Huber / SmoothL1 Diferenciável e de influência limitada

No código

import numpy as np
from sklearn.metrics import (mean_absolute_error, root_mean_squared_error,
                             median_absolute_error, r2_score)

mae  = mean_absolute_error(y_test, pred)
rmse = root_mean_squared_error(y_test, pred)          # sklearn >= 1.4
medae = median_absolute_error(y_test, pred)
r2   = r2_score(y_test, pred)

# as linhas de base — reporte sempre ao lado do modelo
mean_rmse   = root_mean_squared_error(y_test, np.full_like(y_test, y_train.mean()))
median_mae  = mean_absolute_error(y_test, np.full_like(y_test, np.median(y_train)))

print(f"RMSE {rmse:.3f} vs {mean_rmse:.3f} prevendo a média")
print(f"MAE  {mae:.3f} vs {median_mae:.3f} prevendo a mediana")
print(f"RMSE/MAE {rmse/mae:.2f}  (≈1,25 para erros gaussianos; acima disso, cauda pesada)")
print(f"R² {r2:.3f}   ({'pior que a média!' if r2 < 0 else 'melhor que a média'})")

As definições exatas de cada função — incluindo as convenções de sinal dos scorers neg_*, que derrubam todo mundo na primeira vez que usam cross_val_score — estão no guia do scikit-learn5.

Pontos-chave

  1. A métrica não é um relatório, é uma especificação: minimizar MSE pede a média condicional, minimizar MAE pede a mediana. Decida qual delas o seu usuário quer.
  2. O RMSE é o padrão sensato para reportar — mesma unidade do alvo — e a razão RMSE/MAE já diz de graça o quanto os erros são desiguais.
  3. O MedAE é a leitura robusta; use quando a cauda é genuína e você se recusa a persegui-la.
  4. O compara você com prever a média. Ele pode ser negativo, e não é comparável entre conjuntos de dados.
  5. O MAPE é indefinido em zero, assimétrico, e enviesa o modelo a prever baixo. Prefira MASE ou WAPE.
  6. Reporte sempre uma linha de base — média, mediana ou última observação. Um modelo que não a bate não é um modelo.
  7. Se a decisão precisa de uma faixa, treine quantis e entregue o intervalo.

Recursos Adicionais

  1. Evaluating forecast accuracy — Hyndman, R. J., & Athanasopoulos, G., Forecasting: Principles and Practice (3ª ed.). O tratamento mais claro de erros dependentes e independentes de escala, escrito por quem propôs o MASE. Gratuito online, e os capítulos vizinhos são a referência sobre linhas de base.

  2. Regression metrics — Guia do scikit-learn. Definições exatas, incluindo as convenções de sinal dos scorers neg_*.

  3. Root mean square error (RMSE) or mean absolute error (MAE)? — Chai, T., & Draxler, R. R. (2014)6. Um argumento curto e legível dentro de uma discordância real entre pesquisadores — vale ler contra o caso oposto de Willmott & Matsuura1 para ver que a escolha é mesmo uma decisão de modelagem, e não um fato resolvido.

Referências bibliográficas

As obras citadas ao longo do texto, na ordem em que aparecem:


  1. Willmott, C. J., & Matsuura, K. (2005). Advantages of the mean absolute error (MAE) over the root mean square error (RMSE) in assessing average model performanceClimate Research 30, 79–82. A defesa do MAE, e o artigo que começou a discussão continuada abaixo. 

  2. Huber, P. J. (1964). Robust Estimation of a Location ParameterAnnals of Mathematical Statistics 35(1), 73–101. De onde vem a perda quadrática-depois-linear, e a origem da estatística robusta moderna. 

  3. Hyndman, R. J., & Koehler, A. B. (2006). Another look at measures of forecast accuracyInternational Journal of Forecasting 22(4), 679–688. Cataloga como os erros percentuais falham, e propõe o MASE. 

  4. Koenker, R., & Bassett, G. (1978). Regression QuantilesEconometrica 46(1), 33–50. Regressão quantílica, e a perda assimétrica que a produz. 

  5. Regression metrics — Guia do scikit-learn. 

  6. Chai, T., & Draxler, R. R. (2014). Root mean square error (RMSE) or mean absolute error (MAE)? – Arguments against avoiding RMSE in the literatureGeoscientific Model Development 7, 1247–1250. A réplica a Willmott & Matsuura, defendendo que o RMSE é o resumo certo quando os erros são gaussianos.