Machine learning do zero · Aula 1.3 · 4 de 33 aulas prontas · 12 min
A linha de base: com o que comparar seu modelo?
Em resumo
Antes de elogiar um modelo, calcule o resultado sem aprender: a classe mais comum ou a média. Com poucos doentes, “sempre saudável” acerta e não acha ninguém.
Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Na aula 0.1 a árvore acertava 95,1% dos pinguins, e o chute, 43,7%. Esse segundo número é a linha de base (em inglês, baseline): o resultado de uma resposta que não aprende nada. Sem ela você não sabe se um modelo aprendeu alguma coisa. Hoje você vai ver como calculá-la em duas tarefas e quando a acurácia sozinha engana. Os dados: 569 biópsias de tumores de mama e 442 pacientes com diabetes.
Escolha uma resposta e o seu grau de certeza.
Responda para liberar o experimento.
Experimento interativo
Este experimento interativo funciona em um navegador com JavaScript ativado. O texto ao redor descreve o que ele mostra.
Ver a resposta
Resposta certa: Cerca de 99%, mais que a regra aprendida, e não encontra nenhuma
107 de 108 biópsias são 99,1% de acurácia, e a maligna passa despercebida. A regra aprendida com um limiar tem 90,7% neste teste, menos, mas encontra essa biópsia maligna. No teste completo, com 64 malignas, “sempre benigno” tem só 62,6%.
Experimente
- Comece pelas biópsias com todas as 64 malignas. Por quanto a regra aprendida supera “sempre benigno”?
- Mova o controle para a direita até sobrarem 5 malignas, depois 1. O que acontece com a acurácia de “sempre benigno” e com o número de malignas encontradas?
- Mude para o diabetes. Compare o erro da reta com o IMC e do modelo com 10 medidas com o erro da média sozinha.
Depois de conferir no lab, vamos dar nome ao que você vê.
A ideia em poucas palavras
A linha de base é a resposta mais simples que se pode dar sem aprender. Na classificação é a classe mais comum: das 398 biópsias de aprendizado, 250 são benignas, então a resposta é sempre “benigno”. Na regressão é a média: cada paciente recebe a mesma progressão prevista, a média dos pacientes de aprendizado.
Um modelo só faz sentido se supera claramente a linha de base nos mesmos dados de teste. Nas biópsias, a regra com uma medida e um limiar tem 91,2% contra 62,6%. No diabetes, o modelo com 10 medidas tem erro de 2827 contra 5076 da média, ou seja, 44,3% menor. Uma reta só com o IMC reduz o erro em apenas 19,3%.
Existe também uma linha de base mais fraca: chutar na proporção, isto é, “benigno” com probabilidade igual à fração de benignas entre as de aprendizado. Em média ela acerta 53,2%, menos que “sempre benigno”. Por isso a linha de base usada é a classe mais comum: o acaso é mais fácil de superar do que a compreensão de verdade.
Jak to policzono
- Biópsias: Breast Cancer Wisconsin (Diagnostic), UCI, licença CC BY 4.0. 569 biópsias (357 benignas, 212 malignas), 10 medidas dos núcleos celulares.
- Diabetes: o conjunto Diabetes (Efron et al., 2004) que vem com o scikit-learn; os autores não indicaram licença. 442 pacientes, 10 medidas, progressão da doença um ano depois.
- Divisão 70/30, a mesma de
train_test_split(test_size=0.3, random_state=1)no scikit-learn; biópsias estratificadas. No teste há 171 biópsias e 133 pacientes. - Regra: uma árvore de decisão com uma pergunta (CART). Modelo de regressão: mínimos quadrados.
Por que funciona
A acurácia de “sempre a classe mais comum” é simplesmente a fração dessa classe no teste. No teste completo, 107 de 171 biópsias são benignas: daí os 62,6%. Deixe 1 maligna e as benignas são 107 de 108: daí os 99,1%. A acurácia da linha de base não diz nada sobre as biópsias. Diz só o quão rara é a outra classe.
Por isso, com uma classe rara, a acurácia deixa de separar um bom modelo de um inútil. Com 5 malignas no teste, “sempre benigno” tem 95,5% e a regra 91,1%, embora só a regra encontre as 5. Não é uma divisão de sorte: em 100 divisões diferentes, “sempre benigno” vence a regra em acurácia em 82. O que ajuda é um segundo número ao lado da acurácia: quantos casos da classe rara o modelo realmente encontrou.
Na regressão, a média é a melhor resposta constante: nenhum outro número único dá erro quadrático médio menor nos dados de aprendizado. Qualquer modelo que tenha medidas deveria superá-la, e aqui sempre supera. Em 100 divisões, a reta com o IMC e o modelo com 10 medidas têm erro menor que a média todas as vezes, em média 33,7% e 48,5% menor.
Erro comum
Verdadeiro ou falso: “90% de acurácia é muito”. Falso, ou melhor: o número sozinho não diz. Quando 1 pessoa em cada 100 está doente, o teste “sempre saudável” tem 99% de acurácia e não encontra ninguém. Um modelo com 90% seria então pior que nada em acurácia, e ainda assim poderia ser muito valioso se encontra os doentes. Informe sempre a linha de base ao lado do resultado e confira quantos casos da classe rara o modelo encontrou.
Onde a analogia falha: a linha de base é um piso, não uma meta. Superá-la por um fio em geral não significa nada, porque outra divisão dos dados pode inverter o resultado.
Quiz
Três perguntas para você se testar. Escolha uma resposta ou abra a resposta embaixo de cada pergunta. No teclado: as setas escolhem, Enter ou Espaço confirma.
Pontos-chave
- A linha de base é o resultado sem aprendizado: a classe mais comum na classificação, a média na regressão.
- Você compara um modelo com a linha de base nos mesmos dados de teste, não com zero.
- Quando uma classe é rara, “sempre a classe comum” acerta muito e não encontra ninguém; informe também quantos casos raros o modelo encontrou.
- Confira a vantagem em muitas divisões, porque uma só pode sair bem por acaso.
Mais a fundo: fórmula, código, prática
A matemática
A acurácia da resposta “sempre a classe k” é a fração dessa classe no teste: acurácia = n_k / n. No teste completo 107 / 171 ≈ 0,626, com uma só maligna 107 / 108 ≈ 0,991.
Chutar “benigno” com probabilidade p (a fração de benignas no aprendizado, 250 / 398 ≈ 0,628) acerta em média p · q + (1 − p) · (1 − q) das vezes, em que q é a fração de benignas no teste. No teste completo isso dá cerca de 0,532.
Na regressão, uma resposta constante c tem erro MSE(c) = (1/n) · Σ (yᵢ − c)². A derivada −(2/n) · Σ (yᵢ − c) se anula em c = ȳ, então a média dá o menor erro entre todas as constantes. A melhora relativa é 1 − MSE(modelo) / MSE(média): para 10 medidas, 1 − 2827 / 5076 ≈ 0,443.
No código (Python)
O mesmo experimento no scikit-learn: a linha de base e a regra de um limiar nas biópsias com 64, 5 e 1 malignas no teste, a comparação em 100 divisões e, depois, a média, a reta com o IMC e o modelo com 10 medidas no diabetes.
import numpy as np
from sklearn.datasets import load_breast_cancer, load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LinearRegression
X, y = load_breast_cancer(return_X_y=True)
X = X[:, :10] # as 10 medidas "mean", como no lab; y: 0 = maligno, 1 = benigno
def biopsies(seed, keep_malignant):
tr, te = train_test_split(np.arange(len(y)), test_size=0.3, stratify=y, random_state=seed)
te = np.sort(te) # linhas de teste na ordem do arquivo, como no lab
major = np.bincount(y[tr]).argmax() # linha de base: a classe mais comum entre as biópsias de aprendizado
rule = DecisionTreeClassifier(max_depth=1, random_state=0).fit(X[tr], y[tr]) # uma medida, um limiar
rows = np.r_[te[y[te] == 1], te[y[te] == 0][:keep_malignant]] # todas as benignas + as primeiras m malignas
pred = rule.predict(X[rows])
return (y[rows] == major).mean(), ((major == 0) & (y[rows] == 0)).sum(), (pred == y[rows]).mean(), ((pred == 0) & (y[rows] == 0)).sum()
for m in (64, 5, 1):
base, base_found, acc, found = biopsies(1, m)
print(f"malignant {m}: always benign {base:.3f} (finds {base_found}), rule {acc:.3f} (finds {found})")
wins = sum(biopsies(s, 5)[0] > biopsies(s, 5)[2] for s in range(100))
print(f"100 splits, 5 malignant: always benign beats the rule in {wins}")
Xd, yd = load_diabetes(return_X_y=True)
def diabetes(seed):
a, b, c, e = train_test_split(Xd, yd, test_size=0.3, random_state=seed)
mse = lambda p: ((e - p) ** 2).mean()
return mse(c.mean()), mse(LinearRegression().fit(a[:, [2]], c).predict(b[:, [2]])), mse(LinearRegression().fit(a, c).predict(b))
mean, bmi, full = diabetes(1)
print(f"diabetes: mean {mean:.0f}, BMI {bmi:.0f} ({1 - bmi / mean:.1%} lower), all 10 {full:.0f} ({1 - full / mean:.1%} lower)")
r = np.array([diabetes(s) for s in range(100)])
print(f"100 splits: BMI beats the mean in {(r[:, 1] < r[:, 0]).sum()}, all 10 in {(r[:, 2] < r[:, 0]).sum()}; error lower by {1 - r[:, 1].mean() / r[:, 0].mean():.1%} and {1 - r[:, 2].mean() / r[:, 0].mean():.1%} on average")
Saída
malignant 64: always benign 0.626 (finds 0), rule 0.912 (finds 59)
malignant 5: always benign 0.955 (finds 0), rule 0.911 (finds 5)
malignant 1: always benign 0.991 (finds 0), rule 0.907 (finds 1)
100 splits, 5 malignant: always benign beats the rule in 82
diabetes: mean 5076, BMI 4096 (19.3% lower), all 10 2827 (44.3% lower)
100 splits: BMI beats the mean in 100, all 10 in 100; error lower by 33.7% and 48.5% on average
Na divisão 1 os números são os mesmos do lab. O modelo de 10 medidas do lab trabalha com dados arredondados a duas casas decimais, então o erro dele pode diferir deste código por uma fração, mas arredondado também dá 2827.
Baixar o notebook (.ipynb). Abra no Jupyter ou envie para o Google Colab; ele baixa sozinho os dados que faltarem.
Para quem pratica
- No scikit-learn, a linha de base vem de
DummyClassifier(strategy="most_frequent")eDummyRegressor(strategy="mean"). Calcule-a na mesma divisão do modelo. - Com classes desbalanceadas, informe ao lado da acurácia a sensibilidade da classe rara ou a acurácia balanceada; “sempre a classe comum” tem acurácia balanceada de 50%.
- Uma linha de base mais forte costuma ser uma regra simples com uma medida ou o modelo que a empresa já usa. Um modelo novo precisa superar o melhor deles.
- Quando a vantagem sobre a linha de base é pequena, confira-a em muitas divisões ou com validação cruzada antes de anunciá-la.
Isto foi útil?
Obrigado! Isso nos ajuda a melhorar.
Vá mais fundo no Atlas
Verbetes da enciclopédia sobre as ideias desta aula: