Cum să separi datele în train/test/validation
In this tutorial, you'll learn how to split your dataset into training, validation, and test sets using train_test_split from sklearn, ensuring your model is evaluated fairly and generalizes to new data.
Problema
Dacă separi datele incorect sau folosești același set atât pentru antrenare, cât și pentru evaluare, modelul tău va părea mai performant decât este în realitate. O separare corectă în train, validation și test este fundamentul oricărui proiect ML serios.
Soluția Greșită
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv("date.csv")
X = df.drop("target", axis=1)
y = df["target"]
# Fara separare — antrenam si testam pe aceleasi date
model = RandomForestClassifier()
model.fit(X, y)
print(model.score(X, y)) # 1.0 — dar in realitate poate fi mult mai slab
Problema: Scorul de 1.0 este artificial. Modelul doar a memorat datele, nu a învățat să generalizeze.
Soluția Corectă
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
df = pd.read_csv("date.csv")
X = df.drop("target", axis=1)
y = df["target"]
# 1. Separă train (60%) si temp (40%)
X_train, X_temp, y_train, y_temp = train_test_split(
X, y, test_size=0.4, random_state=42
)
# 2. Separă temp in validation (20%) si test (20%)
X_val, X_test, y_val, y_test = train_test_split(
X_temp, y_temp, test_size=0.5, random_state=42
)
print(f"Train: {len(X_train)}, Validare: {len(X_val)}, Test: {len(X_test)}")
Output:
Train: 600, Validare: 200, Test: 200
Implementare Pas cu Pas
1. Split în două etape pentru train/val/test
from sklearn.model_selection import train_test_split
# Prima separare: train 70%, temp 30%
X_train, X_temp, y_train, y_temp = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# A doua separare: validation 15%, test 15%
X_val, X_test, y_val, y_test = train_test_split(
X_temp, y_temp, test_size=0.5, random_state=42, stratify=y_temp
)
2. Verifică distribuția claselor
print(y_train.value_counts(normalize=True))
print(y_val.value_counts(normalize=True))
3. Antrenează pe train, validează pe validation, testează pe test
model = RandomForestClassifier()
model.fit(X_train, y_train)
# Ajustezi hiperparametrii pe baza scorului de validare
print(f"Scor validare: {model.score(X_val, y_val)}")
# Testezi o singură dată la final
print(f"Scor test: {model.score(X_test, y_test)}")
Sfaturi pentru Prevenire
- Folosește
stratify=ypentru clasificare — păstrează proporția claselor - Setează
random_statefix pentru reproductibilitate - Nu te uita deloc la setul de test până la evaluarea finală
- Pentru seturi mici, folosește
cross_val_scoreîn loc de split fix - Păstrează raportul 60/20/20 sau 70/15/15
Greșeli Comune
- Nu folosești stratify — clasele minoritare pot dispărea din train
- Testezi pe validation de mai multe ori — devine implicit parte din antrenare
- Separi datele după preprocesare — cauți data leakage
- Folosești același random_state mereu — poate ascunde probleme
- Setul de test e prea mic — evaluarea nu e semnificativă statistic
Întrebări Frecvente
Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro. DodaTech tools integrate seamlessly with sklearn for enhanced productivity and security.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro