16/09/2021
În lumea complexă a învățării automate (Machine Learning), pregătirea datelor este la fel de crucială ca și algoritmul în sine. Unul dintre cei mai importanți pași în preprocesare este normalizarea (sau standardizarea) datelor. Această tehnică ajustează scara caracteristicilor (feature-urilor), aducându-le într-un interval similar. Însă, o întrebare fundamentală și adesea sursă de confuzie pentru începători este: ar trebui să normalizezi datele înainte sau după împărțirea setului de date în seturi de antrenament (training) și testare (testing)? Răspunsul corect la această dilemă poate face diferența între un model performant și unul mediocru.

Importanța normalizării datelor nu poate fi subestimată. Mulți algoritmi de învățare automată, în special cei bazați pe distanțe (cum ar fi K-Nearest Neighbors - KNN, Support Vector Machines - SVM) sau pe algoritmi de optimizare (rețele neuronale, regresie liniară), sunt extrem de sensibili la scara caracteristicilor de intrare. Dacă o caracteristică are valori mult mai mari decât alta (de exemplu, vârsta de la 0 la 100 și venitul de la 1000 la 1.000.000), caracteristica cu valori mai mari va domina calculul distanțelor sau al gradientului, indiferent de relevanța sa reală. Acest lucru poate duce la o convergență lentă, o performanță slabă sau chiar la rezultate eronate ale modelului. Normalizarea asigură că fiecare caracteristică contribuie proporțional la performanța modelului, eliminând bias-ul introdus de diferențele de scală și asigurând o convergență mai rapidă și mai stabilă a algoritmilor.
De ce este crucială ordinea normalizării: Evitarea Scurgerilor de Date (Data Leakage)
Acum, să abordăm direct întrebarea centrală: normalizăm înainte sau după împărțirea datelor? Răspunsul categoric este: după împărțirea datelor. Motivul principal este prevenirea așa-numitei „scurgeri de date” sau „data leakage”.
Ce înseamnă data leakage? Imaginează-ți că setul tău de date complet conține informații despre viitor sau, în acest context, informații despre setul de testare, care nu ar trebui să fie disponibile în timpul fazei de antrenament. Când normalizezi datele, calculezi anumiți parametri statistici, cum ar fi media și deviația standard (pentru standardizare) sau valorile minime și maxime (pentru normalizare Min-Max). Dacă acești parametri sunt calculați pe întregul set de date (adică înainte de a separa seturile de antrenament și testare), atunci informații din setul de testare (care ar trebui să fie complet necunoscut) sunt „încărcate” în procesul de calcul al acestor parametri. Ulterior, când aplici acești parametri pentru a transforma setul de antrenament, modelul tău „vede” indirect caracteristicile statistice ale setului de testare.
Acest lucru creează o iluzie de performanță bună în timpul antrenamentului și validării, deoarece modelul este, într-un fel, „pregătit” pentru datele de testare. Când modelul este implementat în lumea reală și primește date complet noi, pe care nu le-a „văzut” niciodată, performanța sa va fi semnificativ mai slabă decât cea anticipată. Este ca și cum un student ar ști dinainte întrebările de la examen – ar obține o notă mare, dar asta nu ar reflecta neapărat înțelegerea reală a materiei.
Pașii corecți pentru normalizare:
- Împarte datele: Primul pas este să împarți setul tău de date complet în seturi de antrenament și testare. De obicei, un raport de 70/30, 80/20 sau 75/25 este utilizat, de exemplu, folosind funcții precum
train_test_splitdin scikit-learn. - Calculează parametrii de normalizare pe setul de antrenament: Inițializează scaler-ul (e.g.,
StandardScaler,MinMaxScaler) și aplică metodafit()doar pe setul de antrenament. Această metodă va calcula media și deviația standard (sau min/max) ale caracteristicilor din setul de antrenament. Este esențial ca setul de testare să rămână complet neatins în acest pas. - Transformă setul de antrenament: Aplică metoda
transform()pe setul de antrenament, folosind parametrii învățați în pasul anterior. - Transformă setul de testare: Aplică aceeași metodă
transform()(cu aceiași parametri învățați din setul de antrenament!) pe setul de testare. Nu vei folosi niciodatăfit()pe setul de testare. Setul de testare trebuie să fie tratat ca date „noi” și „necunoscute” pentru model, chiar și în faza de preprocesare.
Un exemplu practic, folosind biblioteca Scikit-learn în Python, ar arăta astfel:
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# Presupunem ca 'X' sunt caracteristicile si 'y' este variabila tinta
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Creeaza un obiect StandardScaler
scaler = StandardScaler()
# Calculeaza media si deviatia standard DOAR pe setul de antrenament si apoi il transforma
X_train_scaled = scaler.fit_transform(X_train)
# Aplica ACEIASI transformare (folosind media si deviatia standard invatate) pe setul de testare
X_test_scaled = scaler.transform(X_test)Această abordare asigură că modelul tău va fi robust și va generaliza bine pe date noi, nevăzute.
Tipuri comune de Normalizare/Standardizare
Există mai multe metode de scalare, fiecare cu avantajele și dezavantajele sale. Alegerea depinde adesea de distribuția datelor și de algoritmul utilizat:
| Tip de Scalare | Descriere | Formula | Când se utilizează |
|---|---|---|---|
| Standardizarea (Z-score) | Transformă datele astfel încât să aibă o medie de 0 și o deviație standard de 1. | (x - medie) / deviație standard | Când datele urmează o distribuție normală sau când algoritmul presupune o astfel de distribuție (e.g., regresie liniară, SVM, rețele neuronale). Robust la valorile aberante (outliers). |
| Normalizarea Min-Max | Scalează datele într-un interval fix, de obicei între 0 și 1. | (x - min) / (max - min) | Când se dorește o scalare într-un interval specific. Sensibil la valorile aberante. |
| Robust Scaler | Utilizează mediana și intervalul intercuartilic (IQR) pentru a scala datele. | (x - mediană) / IQR | Când setul de date conține multe valori aberante, deoarece mediana și IQR sunt mai puțin sensibile la acestea decât media și deviația standard. |
| Normalizer | Scalează fiecare eșantion (rând) individual la o lungime unitară (norma L1 sau L2). | x / ||x|| | Când se lucrează cu date sparse sau text (e.g., TF-IDF), unde direcția vectorului este mai importantă decât magnitudinea. |
În exemplul menționat în cerință, TF-IDF (Term Frequency-Inverse Document Frequency) este, de asemenea, o formă de normalizare. Aceasta scalează importanța cuvintelor în documente, iar parametrii săi sunt învățați din întregul corpus de documente. Chiar și în acest caz, dacă aplicați TF-IDF, ar trebui să calculați parametrii (frecvențele cuvintelor) pe setul de antrenament și apoi să aplicați aceiași parametri pentru a transforma setul de testare.

Algoritmi care nu necesită neapărat normalizare
Deși normalizarea este benefică pentru majoritatea algoritmilor, există excepții notabile. Algoritmii bazați pe arbori de decizie, cum ar fi:
- Arborii de Decizie (Decision Trees)
- Pădurile Aleatoare (Random Forests)
- Gradient Boosting Machines (GBM)
- XGBoost, LightGBM, CatBoost
Acești algoritmi nu sunt sensibili la scara caracteristicilor, deoarece ei iau decizii bazate pe praguri și diviziuni succesive ale datelor. Ei nu utilizează distanțe euclidiene sau gradient descent, care sunt afectate de scara datelor. Pentru acești algoritmi, normalizarea nu este neapărat necesară și, în unele cazuri, ar putea chiar adăuga o complexitate inutilă.
Beneficiile normalizării corecte
Aplicarea corectă a normalizării aduce multiple beneficii modelului tău de Machine Learning:
- Performanță îmbunătățită: Mulți algoritmi funcționează mult mai bine când caracteristicile sunt pe o scală similară.
- Convergență mai rapidă: Algoritmii iterativi (precum rețelele neuronale) converg mai rapid și mai stabil când datele sunt normalizate.
- Reducerea riscului de instabilitate numerică: Evită problemele numerice cauzate de valori foarte mari sau foarte mici.
- Interpretare mai ușoară: În unele cazuri, poate face coeficienții modelului mai ușor de interpretat.
- Modele mai robuste: Prin prevenirea scurgerilor de date, modelul tău va fi mai eficient în generalizarea pe date noi, nevăzute.
Întrebări Frecvente (FAQ)
Q: Ce este data leakage și de ce este atât de periculos?
A: Data leakage (scurgerea de date) este o situație în care informații din setul de testare sunt „văzute” sau utilizate în timpul antrenamentului modelului. Este periculos pentru că duce la o estimare supraoptimistă a performanței modelului. Modelul pare să funcționeze excelent pe datele de testare, dar în realitate, nu va generaliza bine pe date noi, din lumea reală, deoarece a „trișat” în timpul antrenamentului, având acces la informații pe care nu ar fi trebuit să le aibă.
Q: Pot normaliza doar o parte din coloane?
A: Da, absolut! Normalizarea se aplică de obicei doar coloanelor numerice care beneficiază de pe urma acestei transformări. Coloanele categorice (care reprezintă categorii, nu cantități) sunt de obicei tratate diferit (ex: one-hot encoding). De asemenea, coloanele care sunt deja pe o scală similară sau care nu influențează direct calculul distanțelor (cum ar fi ID-uri) pot fi lăsate netransformate.
Q: Ce se întâmplă dacă nu normalizez datele?
A: Consecințele variază în funcție de algoritm. Pentru algoritmi sensibili la scală (KNN, SVM, rețele neuronale, regresie liniară), performanța modelului va fi slabă. Algoritmii ar putea converge lent sau deloc, iar rezultatele ar putea fi dominate de caracteristici cu valori mari, ignorând contribuția celorlalte. Pentru algoritmii bazați pe arbori (Random Forest, XGBoost), impactul este minim sau inexistent.
Q: Care este diferența dintre normalizare și standardizare?
A: Deși termenii sunt adesea folosiți interschimbabil, există o diferență tehnică:
Standardizarea (Z-score normalization) transformă datele astfel încât să aibă o medie de 0 și o deviație standard de 1. Nu limitează datele la un interval specific, dar reduce impactul valorilor aberante.
Normalizarea (Min-Max scaling) scalează datele la un interval fix, de obicei între 0 și 1. Este sensibilă la valorile aberante, care pot comprima majoritatea datelor într-un interval foarte mic.
Concluzie
În concluzie, ordinea în care aplici normalizarea datelor este un aspect critic în procesul de dezvoltare a modelelor de Machine Learning. Împărțirea setului de date în antrenament și testare ar trebui să fie întotdeauna primul pas. Apoi, normalizarea sau standardizarea trebuie aplicată separat: parametrii de scalare (medie, deviație standard, min, max) trebuie calculați exclusiv pe setul de antrenament și apoi aplicați atât setului de antrenament, cât și setului de testare. Această abordare riguroasă previne scurgerile de date, asigură că modelul tău este antrenat pe o reprezentare corectă a datelor și, cel mai important, garantează că va generaliza eficient pe date noi, nevăzute, oferind performanțe fiabile și consistente în lumea reală. O înțelegere solidă a acestui concept este fundamentală pentru orice practician de Machine Learning care aspiră la construirea de modele robuste și precise.
Dacă vrei să descoperi și alte articole similare cu Normalizarea Datelor: Înainte sau După Split?, poți vizita categoria Fitness.
