Menu
CoddyTech

Conjuntos de validación

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

En Cómo elegir k y la profundidad del árbol, conservaste el valor de k o la profundidad con la mejor puntuación de prueba. Esa puntuación favorece: la conservaste porque resultó alta.

Así que reserva un tercer conjunto para elegir, el conjunto de validación:

Una barra dividida en tres partes: filas de entrenamiento 60%, usadas para ajustar cada candidato; validación 20%, usada para elegir; prueba 20%, usada para informar una vez

Dos divisiones lo consiguen. 0.25 del 80% restante es 20%:

X_rest, X_test, y_rest, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X_rest, y_rest, test_size=0.25, random_state=0)
print(len(X_train), len(X_val), len(X_test))

Para 500 filas, imprime:

300 100 100

Elige según el conjunto de validación. Usa el conjunto de prueba una sola vez, al final.

challenge icon

Desafío

Intermedio

Un viñedo predice el rendimiento de uva por hilera con Ridge. El código inicial elige alpha según la puntuación de prueba e informa esa misma puntuación. Corrígelo.

  1. Divide X_rest y y_rest en filas de entrenamiento y de validación (test_size=0.25, random_state=0).
  2. Elige alpha según el R cuadrado de validación e imprímelo junto con esa puntuación.
  3. Entrena con el alpha elegido usando las filas de entrenamiento e imprime su R cuadrado de prueba.

Para otro viñedo:

Chosen alpha: 1 (validation R squared 0.787)
Test R squared: 0.726

La puntuación honesta suele ser inferior a la del código inicial. Es la verdadera.

Pruébalo tú mismo

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge


# Ajusta un Ridge(alpha) con datos escalados en el primer conjunto de filas y devuelve su R cuadrado en el segundo
def ridge_r2(alpha, X_fit, y_fit, X_check, y_check):
    scaler = StandardScaler()
    model = Ridge(alpha=alpha)
    model.fit(scaler.fit_transform(X_fit), y_fit)
    return model.score(scaler.transform(X_check), y_check)


# 90 filas de viñedos: 10 mediciones por fila y el rendimiento de uva en kg
rows = pd.read_csv("vineyard.csv")
features = ["sun_hours", "rain_mm", "soil_ph", "slope_deg", "vine_age",
            "row_length_m", "buds_per_vine", "frost_days", "wind_kmh", "clay_pct"]
X = rows[features]
y = rows["yield_kg"]
alphas = [0.1, 1, 10, 100]
X_rest, X_test, y_rest, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Esto elige alpha según la puntuación de prueba y luego informa de esa misma puntuación: corrígelo
best_alpha = 0
best_r2 = -1
for alpha in alphas:
    r2 = ridge_r2(alpha, X_rest, y_rest, X_test, y_test)
    if r2 > best_r2:
        best_alpha = alpha
        best_r2 = r2
print(f"Chosen alpha: {best_alpha}")
print(f"Test R squared: {best_r2:.3f}")
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