Why we split datasets: mastering the 3-way partition (Train/Val/Test), preventing data leakage, and implementing K-Fold cross-validation.
# Splitting Data into Train, Validation, and Test Sets in Python# ─────────────────────────────────────────────────────────────import numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_split, KFold, cross_val_scorefrom sklearn.linear_model import Ridge # 1. Synthesize sample dataset (1,000 samples, 4 features)np.random.seed(42)X = np.random.randn(1000, 4)y = 3.5 * X[:, 0] - 2.0 * X[:, 1] + 1.5 * X[:, 2] + np.random.randn(1000) * 0.5 # 2. Perform a 3-Way Split: 70% Train, 15% Validation, 15% Test# Step A: Split off Test set (15%)X_train_val, X_test, y_train_val, y_test = train_test_split( X, y, test_size=0.15, random_state=42) # Step B: Split remaining 85% into Train (70% total) and Val (15% total)# 0.15 / 0.85 ≈ 0.1765X_train, X_val, y_train, y_val = train_test_split( X_train_val, y_train_val, test_size=(0.15 / 0.85), random_state=42) print(f"Total Dataset: {len(X)} samples (100%)")print(f"Training Set: {len(X_train)} samples ({len(X_train)/len(X)*100:.0f}%) -> Used to fit parameters")print(f"Validation Set: {len(X_val)} samples ({len(X_val)/len(X)*100:.0f}%) -> Used to tune hyperparameters")print(f"Test Set (Vault): {len(X_test)} samples ({len(X_test)/len(X)*100:.0f}%) -> Used ONLY for final evaluation") # 3. 5-Fold Cross-Validation on the Training Poolkf = KFold(n_splits=5, shuffle=True, random_state=42)model = Ridge(alpha=1.0)cv_scores = cross_val_score(model, X_train_val, y_train_val, cv=kf, scoring="r2") print(f"\n5-Fold Cross-Validation R2 Scores: {cv_scores.round(3)}")print(f"Mean CV R2 Score: {cv_scores.mean():.4f} (+/- {cv_scores.std():.4f})")Interactive matrix partitioning, split ratios, pipeline simulation, and K-Fold cross-validation.
Why is it dangerous to tune hyperparameters (such as neural network learning rate or decision tree depth) directly on the TEST set?