Menu
CoddyTech

Curvas de aprendizado

Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 33 de 58.

Mais dados melhorariam seu modelo? Uma curva de aprendizado mostra isso: a acurácia de teste à medida que o conjunto de treinamento cresce. Aqui, uma árvore profunda em dados de duas luas:

Acurácia em relação ao número de linhas de treinamento, de 25 a 800. A linha de treinamento permanece em 1.0 durante todo o período; a linha de teste sobe de 0.80 para 0.94

A árvore memoriza cada conjunto de treinamento, mas cada linha extra ensina algo real. Modelos flexíveis são os que mais se beneficiam dos dados.

Ajuste usando as primeiras n linhas de treinamento e, em seguida, avalie nas mesmas linhas de teste a cada vez:

sizes = [25, 50, 100, 200, 400, 800]
test_scores = []
for n in sizes:
    tree = DecisionTreeClassifier(random_state=0)
    tree.fit(X_train[:n], y_train[:n])
    test_scores.append(tree.score(X_test, y_test))
ax.plot(sizes, test_scores, marker="o")

Ainda está subindo na borda direita? Mais dados ajudarão.

challenge icon

Desafio

Médio

Mais gravações ajudariam a distinguir duas espécies de coruja? O código inicial divide 600 chamados e prepara os dois modelos e o gráfico.

  1. Para cada n em sizes, ajuste os dois modelos às primeiras n linhas de treinamento; guarde suas acurácias de teste.
  2. Imprima o ganho de cada modelo, a última pontuação menos a primeira, com 3 casas decimais.
  3. Trace ambos em função de sizes, com marker="o", identificados como logistic e tree, com uma legenda.

Corujas de outro bosque imprimem:

Logistic gains 0.053 from more data
Tree gains 0.160 from more data

e desenham este gráfico. Em seguida, Coddy descreve o seu.

Owl Calls: Learning Curves. A linha logística sobe de 0.64 para cerca de 0.69 e permanece estável; a linha da árvore sobe continuamente de 0.67 para 0.83

Experimente você mesmo

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

# Não altere as linhas abaixo: 600 vocalizações de corujas, frequência (Hz) e duração (s)
rng = np.random.default_rng(23)
pitch = np.round(rng.uniform(300, 900, 600))
length = np.round(rng.uniform(0.2, 2.0, 600), 2)
# Espécie 1, a coruja-do-mato, emite vocalizações mais longas para sua frequência; algumas anotações de campo estão erradas
longer = length > 0.5 + 6.4 * ((pitch - 600) / 600) ** 2
wrong_note = rng.random(600) < 0.05
species = np.where(longer != wrong_note, 1, 0)
X = np.column_stack([pitch, length])
X_train, X_test, y_train, y_test = train_test_split(X, species, test_size=0.25, random_state=0)

sizes = [25, 50, 100, 200, 400]
logistic = LogisticRegression(max_iter=1000)
tree = DecisionTreeClassifier(random_state=0)

fig, ax = plt.subplots()
ax.set_title("Owl Calls: Learning Curves")
ax.set_xlabel("Training rows")
ax.set_ylabel("Test accuracy")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado supervisionado

Pratique por conta própria: Compilador de Python online