Machine learning do zero · Aula 0.1 · 1 de 33 aulas prontas · 15 min
Todo o processo em 15 minutos, do começo ao fim
Em resumo
O caminho completo de um projeto de machine learning em um só conjunto de dados, da pergunta à avaliação. Sem uma linha de base, um resultado não diz nada.
Antes de aprender as partes, veja o jogo inteiro. É assim que se aprende futebol: primeiro uma partida, depois os treinos de passe. Nesta aula você percorre um projeto inteiro de machine learning em um quarto de hora, com um só conjunto de dados: pinguins de três espécies, medidos por pesquisadores em ilhas perto da costa da Antártida. Cada módulo seguinte do curso abre um dos seis passos que você vê aqui de uma vez.
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: Quase todos, mais de 9 em cada 10
Duas perguntas acertam 98 de 103 (95,1%), uma pergunta 81 (78,6%). Simplesmente chutar “sempre Adelie”, sem modelo nenhum, acerta 45 vezes (43,7%), e é isso que diz se 95,1% é muito. Uma terceira pergunta não ajuda: 96 de 103 (93,2%).
Experimente
- Escolha 0 perguntas. Isso é chutar sem modelo: em quantos pinguins “sempre Adelie” acerta?
- Passe para 1 e depois para 2 perguntas. Leia as perguntas da árvore abaixo do gráfico: sobre quais medidas ela pergunta?
- Com 2 perguntas, mova o controle da divisão. Existe alguma divisão em que a vantagem sobre o chute desaparece?
- Volte à divisão 1 e escolha 3 perguntas. Uma pergunta a mais sempre ajuda?
Depois de conferir no lab, vamos dar nome aos passos que você acabou de percorrer.
A ideia em poucas palavras
Todo projeto de machine learning, dos pinguins à detecção de fraude em um banco, passa pelos mesmos seis passos:
- Pergunta. O que exatamente você prevê, e a partir de quê? Aqui: a espécie de um pinguim a partir de quatro medidas do corpo. Uma boa pergunta pode ser conferida, porque conhecemos a espécie real.
- Dados. O arquivo tem 344 pinguins, mas 2 não têm nenhuma medida, então sobram 342. O sexo falta em 11 linhas. Se tirássemos toda linha com alguma lacuna, sobrariam 333, mas aqui não usamos o sexo, então perdemos só esses 2.
- Divisão. 103 pinguins, ou seja 30%, ficam escondidos do modelo. O modelo aprende com os outros 239, e só o testamos com os escondidos. A parte para aprender é o conjunto de treino; a parte escondida, o conjunto de teste.
- Linha de base. Antes de construir um modelo, conte quanto uma resposta sem pensar consegue. Entre os pinguins de aprendizado, Adelie é o mais comum, então “sempre Adelie” acerta 45 dos 103 de teste: 43,7%.
- Modelo. Uma árvore de decisão é uma sequência de perguntas de sim ou não. Com duas perguntas, ela pergunta primeiro pela nadadeira (até 207 mm ou mais longa) e depois pelo comprimento ou pela altura do bico.
- Avaliação. A árvore acerta 98 de 103, ou seja 95,1%: 51,5 pontos a mais que o chute.
Os módulos seguintes do curso abrem esses passos um a um: como um modelo aprende com exemplos e com o que compará-lo (módulo 1), como medir um resultado (módulo 2), se o resultado resiste a dados novos (módulo 3), o que estraga os dados (módulo 4), quais modelos escolher (módulo 5) e o que acontece com um modelo no mundo real (módulo 6).
Jak to policzono
- Dados: Palmer Penguins (Gorman, Williams e Fraser, 2014; pacote palmerpenguins: Horst, Hill e Gorman, 2020), licença CC0. 344 pinguins no arquivo, 342 com as quatro medidas.
- Divisão: 70/30 com a mesma mistura de espécies nas duas partes; a divisão 1 é a mesma de
train_test_split(test_size=0.3, stratify=y, random_state=1)no scikit-learn. - Modelo: árvore de decisão (CART, índice de Gini), no máximo 1, 2 ou 3 perguntas em cada caminho.
- Linha de base: a espécie mais comum entre os pinguins de aprendizado.
Por que funciona
O resultado com os pinguins escondidos significa algo porque o modelo não os viu. Testado com os pinguins de aprendizado, ele poderia simplesmente lembrar as respostas. Por isso a árvore com três perguntas tem 97,5% nos pinguins de aprendizado, mas só 93,2% nos escondidos, menos que a árvore com duas perguntas. A terceira pergunta começou a aprender pinguins individuais em vez de uma regra. Isso é sobreajuste, o tema do módulo 3.
A árvore vai tão bem porque as espécies têm de fato corpos diferentes. Os Gentoo têm nadadeiras longas, então a primeira pergunta quase os separa: entre os pinguins de aprendizado com nadadeira maior que 207 mm, 85 de 91 são Gentoo. Entre as nadadeiras mais curtas, um bico longo entrega um Chinstrap e um curto um Adelie: no grupo com nadadeira até 207 mm e bico até 43,4 mm, 101 de 103 pinguins de aprendizado são Adelie.
A linha de base é necessária porque a acurácia depende da tarefa. Com três espécies, jogar um dado acertaria uma vez em cada três, e “sempre a espécie mais comum” acerta 43,7% das vezes. Um modelo só faz sentido quando supera com folga essa resposta simples.
Uma divisão é um sorteio. Em 20 divisões no lab, duas perguntas acertam entre 94 e 100 dos 103 pinguins (de 91,3% a 97,1%), e o chute fica em 43,7% todas as vezes. A vantagem permanece, embora o número exato mude.
Erro comum
Verdadeiro ou falso: “95% de acurácia é um ótimo resultado”. Falso, ou melhor: o número sozinho não diz. A acurácia depende das proporções das classes e de quão fácil é a tarefa. Aqui o chute dá 43,7%, então 95,1% é uma melhora enorme. Mas quando 95 de cada 100 e-mails são mensagens comuns, um filtro que não faz nada e deixa passar todos os e-mails também tem 95% de acurácia e não pega nenhum spam. Primeiro a linha de base, depois o entusiasmo.
Onde a analogia falha: uma partida de futebol tem fim, e um projeto raramente segue em linha reta. Depois da avaliação você muitas vezes volta à pergunta ou aos dados, porque o resultado mostrou o que falta.
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
- Todo projeto de machine learning passa pelos mesmos passos: pergunta, dados, divisão, linha de base, modelo e avaliação.
- Um modelo é julgado com dados que ele não viu; o resultado nos dados de aprendizado é inflado.
- Um número sem linha de base não diz nada: 95,1% é muito porque um simples chute dá 43,7%.
- Uma divisão é um sorteio, então confira o resultado em várias.
Mais a fundo: fórmula, código, prática
A matemática
A acurácia é a proporção de respostas corretas: acurácia = corretas / todas. Chutar “sempre Adelie” dá 45 / 103 ≈ 0,437, e a árvore com duas perguntas 98 / 103 ≈ 0,951. A diferença é 98 / 103 − 45 / 103 = 53 / 103 ≈ 0,515, ou seja, 51,5 pontos.
A resposta “sempre a classe mais comum” tem acurácia igual à proporção dessa classe no conjunto de teste. Os Adelie são 151 de 342 pinguins (44,2%); a divisão mantém a mistura de espécies, então o teste tem 45 deles em 103. Escolher ao acaso uma das três espécies acertaria em média 1 / 3 ≈ 33,3% das vezes.
Uma árvore de profundidade d divide os dados em no máximo 2^d grupos: com 2 perguntas são 4 grupos, e cada um prevê a espécie que predomina nele entre os pinguins de aprendizado.
No código (Python)
O mesmo experimento no scikit-learn: a divisão 1 do lab, a linha de base, árvores de profundidade 1–3 e a árvore de duas perguntas em 100 divisões diferentes. O notebook indicado abaixo da saída baixa os dados sozinho.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv("data/raw/penguins.csv")
cols = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
d = df.dropna(subset=cols) # só pinguins com todas as medidas
print(f"penguins {len(df)}, with measurements {len(d)}, without any gap {len(df.dropna())}")
X, y = d[cols], d["species"]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
guess = ytr.value_counts().idxmax() # linha de base: a espécie mais comum no aprendizado
print(f"train {len(Xtr)}, test {len(Xte)}; always {guess}: {(yte == guess).sum()} of {len(yte)} = {(yte == guess).mean():.3f}")
for depth in (1, 2, 3):
tree = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(Xtr, ytr)
print(f"depth {depth}: {(tree.predict(Xte) == yte).sum()} of {len(yte)} = {tree.score(Xte, yte):.3f} (train {tree.score(Xtr, ytr):.3f})")
scores = []
for seed in range(100): # 100 divisões aleatórias diferentes
a, b, c, e = train_test_split(X, y, test_size=0.3, stratify=y, random_state=seed)
scores.append(DecisionTreeClassifier(max_depth=2, random_state=0).fit(a, c).score(b, e))
print(f"depth 2 on 100 splits: mean {sum(scores) / 100:.3f}, min {min(scores):.3f}, max {max(scores):.3f}")
Saída
penguins 344, with measurements 342, without any gap 333
train 239, test 103; always Adelie: 45 of 103 = 0.437
depth 1: 81 of 103 = 0.786 (train 0.791)
depth 2: 98 of 103 = 0.951 (train 0.967)
depth 3: 96 of 103 = 0.932 (train 0.975)
depth 2 on 100 splits: mean 0.949, min 0.883, max 0.990
Na divisão 1 os resultados são os mesmos do lab. Em 100 outras divisões, a árvore de duas perguntas acerta em média 94,9%, no pior caso 88,3% e no melhor 99,0%, e o chute fica em 43,7% todas as vezes.
Baixar o notebook (.ipynb). Abra no Jupyter ou envie para o Google Colab; ele baixa sozinho os dados que faltarem.
Para quem pratica
- Comece sempre por uma linha de base. No scikit-learn,
DummyClassifier(strategy="most_frequent")faz isso; em regressão, a média. - Esconda o conjunto de teste logo no início e não olhe para ele enquanto escolhe o modelo. Para escolher existe a validação (módulo 3).
- Quando as classes têm tamanhos diferentes, divida com estratificação (
stratify=y), para que as duas partes mantenham as proporções. - Informe o resultado de várias divisões ou de validação cruzada, não um número de um único sorteio.
- Anote a semente aleatória (
random_state) para que outros possam reproduzir o resultado, e confira a licença dos dados antes de usá-los.
Isto foi útil?
Obrigado! Isso nos ajuda a melhorar.
Vá mais fundo no Atlas
Verbetes da enciclopédia sobre as ideias desta aula: