Skip to content

Cum să separi datele în train/test/validation

DodaTech Updated 2025-01-15 2 min read

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=y pentru clasificare — păstrează proporția claselor
  • Setează random_state fix 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

  1. Nu folosești stratify — clasele minoritare pot dispărea din train
  2. Testezi pe validation de mai multe ori — devine implicit parte din antrenare
  3. Separi datele după preprocesare — cauți data leakage
  4. Folosești același random_state mereu — poate ascunde probleme
  5. Setul de test e prea mic — evaluarea nu e semnificativă statistic

Întrebări Frecvente

### De ce am nevoie de trei seturi (train/val/test)?

Train antrenează modelul, validation ajută la ajustarea hiperparametrilor, iar test oferă o evaluare finală impartială a performanței pe date noi.

Cât de mare trebuie să fie setul de test?

Depinde de dimensiunea datelor. Pentru 10.000+ exemple, 20% e suficient. Pentru seturi sub 1.000, folosește cross-validation.

Ce este stratify și de ce e important?

Stratify păstrează aceeași proporție a claselor în toate seturile, esențial pentru date dezechilibrate.

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