Menu
CoddyTech

Set di validazione

Fa parte della sezione Apprendimento supervisionato del percorso Machine Learning di Coddy. Lezione 35 di 58.

Nella scelta di k e della profondità dell’albero, hai mantenuto il valore di k o la profondità con il punteggio di test migliore. Quel punteggio è fuorviante: l’hai mantenuto perché risultava alto.

Quindi tieni da parte un terzo insieme per la scelta, l’insieme di convalida:

Una barra divisa in tre parti: righe di addestramento 60%, usate per adattare ogni candidato; convalida 20%, usata per scegliere; test 20%, usato per riportare i risultati una volta

Due suddivisioni lo rendono possibile. 0.25 del restante 80% è il 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))

Per 500 righe stampa:

300 100 100

Scegli in base alla convalida. Usa il set di test una sola volta, alla fine.

challenge icon

Sfida

Medio

Un vigneto prevede la resa dell'uva per filare con Ridge. Il codice iniziale sceglie alpha in base al punteggio del test e riporta quello stesso punteggio. Correggilo.

  1. Dividi X_rest e y_rest in righe di addestramento e di convalida (test_size=0.25, random_state=0).
  2. Scegli alpha in base al coefficiente R quadrato di convalida e stampalo insieme a quel punteggio.
  3. Adatta il valore di alpha scelto alle righe di addestramento e stampa il suo coefficiente R quadrato di test.

Per un altro vigneto:

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

Il punteggio attendibile è spesso inferiore a quello del codice iniziale. È quello vero.

Provalo tu

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


# Adatta un modello Ridge(alpha) con dati standardizzati al primo gruppo di righe e restituisce il suo R quadrato sul secondo
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 righe relative al vigneto: 10 misurazioni ciascuna e la resa dell'uva in 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)

# Questo sceglie alpha in base al punteggio sul set di test, poi riporta lo stesso punteggio: correggilo
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento supervisionato

Esercitati da solo: Compilatore Python online