Menu
CoddyTech

Curvas de aprendizaje

Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 33 de 58.

¿Mejoraría tu modelo con más datos? Una curva de aprendizaje lo muestra: la precisión de prueba a medida que crece el conjunto de entrenamiento. Aquí, un árbol profundo con datos de dos lunas:

Precisión frente a filas de entrenamiento, de 25 a 800. La línea de entrenamiento se mantiene en 1.0 todo el tiempo; la línea de prueba sube de 0.80 a 0.94

El árbol memoriza cada conjunto de entrenamiento, pero cada fila adicional le enseña algo real. Los modelos flexibles son los que más se benefician de los datos.

Ajusta el modelo con las primeras n filas de entrenamiento y, después, evalúa siempre con las mismas filas de prueba:

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")

¿Sigues subiendo en el borde derecho? Más datos ayudarán.

challenge icon

Desafío

Intermedio

¿Ayudarían más grabaciones a distinguir dos especies de búhos? El código inicial divide 600 llamadas y prepara ambos modelos y el gráfico.

  1. Para cada n en sizes, ajusta ambos modelos con las primeras n filas de entrenamiento; guarda sus exactitudes de prueba.
  2. Imprime la ganancia de cada modelo: la última puntuación menos la primera, con 3 decimales.
  3. Representa ambos frente a sizes, con marker="o", etiquetados como logistic y tree, y con una leyenda.

Los búhos de otro bosque imprimen:

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

y dibujan este gráfico. Después, Coddy describe el tuyo.

Llamadas de búhos: curvas de aprendizaje. La línea logística sube de 0.64 a aproximadamente 0.69 y se mantiene plana; la línea del árbol asciende de forma constante de 0.67 a 0.83

Pruébalo tú mismo

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

# No cambies las líneas siguientes: 600 llamadas de búho, tono (Hz) y duración (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)
# La especie 1, el cárabo común, emite llamadas más largas para su tono; algunas notas de campo son incorrectas
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")

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje supervisado

Practica por tu cuenta: Compilador de Python online