12/08/2024
Salutare, pasionați de fitness mental și antrenament algoritmic! La fel cum un program de antrenament fizic bine structurat este cheia succesului în sala de forță, o împărțire corectă a datelor este fundamentală pentru a construi modele de inteligență artificială robuste și eficiente, mai ales atunci când lucrăm cu Keras. Mulți dintre voi se confruntă cu o anumită confuzie legată de termenii 'validare', 'testare' și 'antrenare', precum și de modul în care funcțiile precum train_test_split și parametrul validation_split interacționează. Nu vă faceți griji, sunteți în locul potrivit! Vom clarifica toate aceste aspecte și vă vom arăta pașii corecți pentru a antrena și evalua modelele Keras.

- De Ce Este Esențială Împărțirea Datelor?
- train_test_split vs. validation_split - Clarificări
- Pașii Corecți pentru Antrenarea și Evaluarea unui Model Keras
- Overfitting și Underfitting: Cum le Identificăm?
- model.evaluate() - Ce Ne Spune cu Adevărat?
- Tabel Comparativ: Instrumente de Împărțire și Evaluare
- Întrebări Frecvente (FAQ)
- Concluzie
De Ce Este Esențială Împărțirea Datelor?
Imaginați-vă că sunteți un antrenor personal și ați conceput un program revoluționar de fitness. Nu ați vrea să evaluați eficacitatea acestui program doar pe baza performanțelor membrilor echipei care v-au ajutat să-l creați, nu-i așa? Ați vrea să-l testați pe persoane noi, care nu au fost implicate în procesul de creație, pentru a vedea cum funcționează în "lumea reală".
În mod similar, în lumea învățării automate, un model trebuie să demonstreze că poate face predicții precise nu doar pe datele pe care le-a "văzut" în timpul antrenamentului, ci și pe date complet noi, necunoscute. Acesta este conceptul de generalizare. Dacă un model performează excelent doar pe datele de antrenament, dar eșuează lamentabil pe date noi, înseamnă că a memorat pur și simplu datele de antrenament, fără a învăța tiparele subiacente. Acest fenomen se numește supraînvățare (overfitting).
Pentru a preveni supraînvățarea și pentru a obține o evaluare imparțială a performanței modelului, împărțim setul nostru de date în trei subseturi distincte:
- Setul de Antrenament (Training Set): Aceasta este cea mai mare parte a datelor și este utilizată pentru a "învăța" modelul, adică pentru a-i ajusta greutățile și bias-urile.
- Setul de Validare (Validation Set): Acest set este utilizat în timpul antrenamentului pentru a monitoriza performanța modelului pe date nevăzute până la momentul respectiv și pentru a ajusta hiperparametrii (cum ar fi rata de învățare, numărul de epoci etc.). Ajută la detectarea timpurie a supraînvățării.
- Setul de Testare (Test Set): Acesta este un set de date complet separat și "sacru", pe care modelul nu l-a văzut niciodată, sub nicio formă, pe parcursul antrenamentului sau validării. Este utilizat o singură dată, la final, pentru a oferi o evaluare finală, realistă și imparțială a capacității de generalizare a modelului.
train_test_split vs. validation_split - Clarificări
Aici intervine adesea confuzia principală. Să le descompunem:
train_test_split (din Scikit-learn)
Această funcție, parte a bibliotecii scikit-learn (și nu direct din Keras), este primul pas esențial. Ea ia întregul set de date și îl împarte în două părți principale: un set de antrenament și un set de testare. Exemplul dumneavoastră este corect:
x_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
Aici, X_test și y_test reprezintă setul de testare, acele date "sacri" pe care modelul nu le va vedea niciodată în timpul antrenamentului. Rolul lor este de a oferi o evaluare finală, nealterată, a performanței modelului. Odată ce ați separat aceste date de testare, ele nu ar trebui să fie utilizate sub nicio formă în procesul de antrenament sau de ajustare a modelului.
validation_split (parametru în model.fit())
Parametrul validation_split este o facilitate oferită de Keras în cadrul funcției model.fit(). Acesta ia o parte din setul de antrenament (care a rămas după ce ați separat setul de testare cu train_test_split) și o utilizează ca set de validare internă. Exemplul dumneavoastră:
history = model.fit(features, results, validation_split = 0.2, epochs = 10, batch_size=50)
Atenție! În exemplul de mai sus, ați utilizat features și results (setul complet de date) pentru model.fit(). Dacă faceți acest lucru, validation_split va lua 20% din întregul set de date pentru validare, iar restul de 80% pentru antrenament. Problema este că, în acest caz, nu mai aveți un set de testare cu adevărat independent, deoarece Keras a "văzut" toate datele într-o formă sau alta. Setul pe care l-ați separat inițial cu train_test_split (X_test, y_test) ar conține acum date pe care Keras le-a folosit fie pentru antrenament, fie pentru validare, invalidând astfel scopul unui test set cu adevărat unseen.
Cum gestionează Keras validation_split? Când specificați validation_split = 0.2, Keras împarte intern datele de antrenament furnizate (înainte de fiecare epocă, sau o singură dată la început, în funcție de implementare, dar rezultatul este același) într-o porțiune de 80% pentru antrenament efectiv și 20% pentru validare. Această împărțire este, prin implicit, aleatorie. Keras nu ia pur și simplu "primele 80%" sau "ultimele 20%"; datele sunt amestecate pentru a asigura o reprezentare echilibrată în ambele subseturi.
Alternativa la validation_split: Puteți, de asemenea, să furnizați un set de validare explicit, folosind parametrul validation_data în model.fit(). Acest lucru este util dacă doriți să aveți un control mai fin asupra datelor de validare (de exemplu, dacă doriți să le preprocesați diferit sau să folosiți o strategie de splitare specifică). Pentru a face acest lucru, ar trebui să împărțiți x_train și y_train (care au rămas după train_test_split) într-un sub-set de antrenament și un sub-set de validare:
x_train_final, x_val, y_train_final, y_val = train_test_split(x_train, y_train, test_size=0.20)
Apoi, antrenați modelul astfel:
history = model.fit(x_train_final, y_train_final, validation_data=(x_val, y_val), epochs=10, batch_size=50)
Pașii Corecți pentru Antrenarea și Evaluarea unui Model Keras
Iată ordinea logică și corectă a pașilor pentru a construi și evalua un model de învățare automată cu Keras, asigurând o evaluare finală fiabilă:
Pasul 1: Împărțirea Inițială a Datelor (Antrenament + Testare)
Acesta este primul și cel mai important pas. Utilizați train_test_split pentru a crea un set de testare complet separat, care nu va fi atins până la finalul procesului. De obicei, 20-30% din date sunt alocate pentru testare.
from sklearn.model_selection import train_test_split
features = df.iloc[:,:-1]results = df.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33, random_state=42)
(random_state asigură reproductibilitatea împărțirii.)
Pasul 2: Definirea și Compilarea Modelului Keras
Construiți arhitectura rețelei neuronale și specificați funcția de pierdere (loss function), optimizatorul și metricile.
from tensorflow import kerasfrom tensorflow.keras import layers
model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=[X_train.shape[1]]), layers.Dense(64, activation='relu'), layers.Dense(1) # Sau numărul de clase pentru clasificare])
model.compile(optimizer='adam', loss='mse', metrics=['mae']) # Ex: pentru regresie
Pasul 3: Antrenarea Modelului (cu Validare)
Acum utilizați numai setul de antrenament (X_train, y_train) pentru a antrena modelul. Puteți folosi validation_split pentru a rezerva o parte din X_train pentru validare, sau puteți furniza un set de validare predefinit prin validation_data (așa cum am explicat mai sus).
history = model.fit(X_train, y_train, validation_split=0.2, epochs=100, batch_size=32, verbose=1)
În timpul antrenamentului, Keras va raporta pierderea (loss) și metricile (e.g., acuratețea) atât pentru setul de antrenament, cât și pentru setul de validare la fiecare epocă. Aceste valori din setul de validare sunt cruciale pentru a monitoriza progresul și a detecta supraînvățarea.
Pasul 4: Evaluarea Finală a Modelului
După ce modelul este antrenat (și eventual optimizat pe baza metricilor de validare), este timpul să-i evaluăm performanța reală pe date complet necunoscute. Aici intervine setul de testare (X_test, y_test) pe care l-ați izolat la Pasul 1.
score = model.evaluate(X_test, y_test, batch_size=32, verbose=1)
print(f'Test Loss: {score[0]}')print(f'Test MAE: {score[1]}') # Sau Test Accuracy, în funcție de metrici
Acest score reprezintă performanța imparțială a modelului pe date nevăzute. Aceasta este metrica pe care ar trebui să o raportați ca performanță finală a modelului dumneavoastră. Este răspunsul la întrebarea: "Cât de bine se va comporta modelul meu în lumea reală, pe date noi?"
Overfitting și Underfitting: Cum le Identificăm?
Cazul dumneavoastră, cu o acuratețe de antrenament de 90% și o acuratețe de validare de 55%, este un exemplu clasic și clar de supraînvățare (overfitting).

Supraînvățare (Overfitting): Apare atunci când modelul învață prea bine datele de antrenament, inclusiv zgomotul și particularitățile irelevante ale acestora, pierzându-și capacitatea de a generaliza la date noi. Este ca un elev care a memorat răspunsurile pentru un singur test, dar nu înțelege cu adevărat materia și eșuează la un test ușor diferit.
Simptome: Acuratețea (sau performanța) pe setul de antrenament continuă să crească, în timp ce acuratețea (sau performanța) pe setul de validare stagnează sau începe să scadă după un anumit punct.
Ce să faci:
- Adaugă mai multe date de antrenament: Cu cât modelul "vede" mai multe exemple variate, cu atât îi este mai greu să memoreze și mai ușor să învețe tipare generale.
- Regularizare: Tehnici precum Dropout (în Keras:
layers.Dropout(0.2)) sau regularizarea L1/L2 adaugă o "penalizare" complexității modelului, forțându-l să învețe tipare mai simple și mai robuste. - Modele mai simple: Reduceți numărul de neuroni sau de straturi în rețeaua neuronală. Un model mai puțin complex este mai puțin predispus la supraînvățare.
- Oprire timpurie (Early Stopping): Monitorizați performanța pe setul de validare și opriți antrenamentul atunci când performanța pe setul de validare începe să scadă (sau să stagneze), chiar dacă performanța pe setul de antrenament încă se îmbunătățește. Keras are un callback dedicat pentru asta.
Sub-învățare (Underfitting): Apare atunci când modelul nu a învățat suficient de bine nici măcar datele de antrenament. Este ca un elev care nu a studiat deloc și eșuează la ambele teste.
Simptome: Acuratețea (sau performanța) este scăzută atât pe setul de antrenament, cât și pe cel de validare.
Ce să faci:
- Modele mai complexe: Adăugați mai multe neuroni, mai multe straturi sau utilizați o arhitectură de model mai sofisticată.
- Antrenează mai mult: Creșteți numărul de epoci.
- Rată de învățare mai mare: Modelul poate învăța prea lent.
- Mai multe caracteristici (features): Dacă datele nu conțin suficiente informații relevante, modelul nu va putea învăța.
model.evaluate() - Ce Ne Spune cu Adevărat?
Ați observat corect că model.fit() returnează un obiect history care conține pierderea și metricile pentru fiecare epocă, atât pentru antrenament, cât și pentru validare (dacă a fost specificat validation_split sau validation_data). Acestea sunt utile pentru a vizualiza curbele de învățare și pentru a detecta supraînvățarea în timpul antrenamentului.
Însă, model.evaluate(X_test, y_test, ...) servește un scop diferit și crucial. Acesta calculează pierderea și metricile modelului pe setul de testare, care, așa cum am menționat, este un set de date complet nevăzut. Rezultatul de la model.evaluate() este considerat "adevărata" performanță a modelului, deoarece reflectă cât de bine se va descurca modelul atunci când va întâlni date noi, în scenarii din lumea reală. Este măsura finală a capacității de generalizare.
Dacă acuratețea returnată de model.evaluate() este de 90%, înseamnă că modelul dumneavoastră performează foarte bine pe date complet noi și, prin urmare, se generalizează bine. Aceasta este valoarea pe care o doriți, indiferent de fluctuațiile acurateții pe setul de validare din timpul antrenamentului. Performanța pe setul de testare este verdictul final și cel mai important.
Tabel Comparativ: Instrumente de Împărțire și Evaluare
| Caracteristică | train_test_split (Scikit-learn) | validation_split (Keras model.fit) | model.evaluate() (Keras) |
|---|---|---|---|
| Scop Principal | Crearea unui set de testare independent, complet necunoscut modelului. | Monitorizarea performanței în timpul antrenamentului și ajustarea hiperparametrilor. | Evaluarea finală, imparțială a performanței modelului pe date nevăzute. |
| Date Utilizate | Setul complet de date inițial. | O parte din setul de antrenament (X_train, y_train). | Setul de testare separat (X_test, y_test). |
| Când se utilizează | La începutul proiectului, o singură dată. | În timpul antrenamentului (la fiecare epocă). | După ce antrenamentul și ajustarea modelului sunt complete. |
| Returnează | Seturi de date separate (X_train, X_test, y_train, y_test). | Istoricul antrenamentului (history object), cu pierderea și metricile pentru antrenament și validare. | O listă (sau un singur scalar) cu pierderea finală și metricile de performanță pe setul de testare. |
| Impact asupra modelului | Nu antrenează modelul; doar pregătește datele. | Nu antrenează modelul pe setul de validare, dar valorile sale influențează deciziile de antrenament (ex: oprire timpurie). | Nu antrenează modelul; doar evaluează performanța finală. |
Întrebări Frecvente (FAQ)
1. Pot folosi doar validation_split și să sar peste train_test_split?
Nu este recomandat pentru o evaluare finală fiabilă. Dacă folosiți doar validation_split pe întregul set de date, nu veți avea un set de testare cu adevărat independent. Modelul ar fi "văzut" toate datele într-o formă sau alta, iar evaluarea finală ar fi părtinitoare și nu ar reflecta cu adevărat capacitatea de generalizare a modelului în lumea reală.
2. Este împărțirea realizată de validation_split aleatorie?
Da, prin implicit, Keras amestecă datele înainte de a le împărți pentru validare atunci când folosiți validation_split. Acest lucru asigură că setul de validare este o reprezentare aleatorie a datelor de antrenament, prevenind bias-urile.
3. Cât de mare ar trebui să fie setul de testare?
Nu există o regulă strictă, dar procentele comune variază între 10% și 30% din setul total de date. O împărțire de 80% antrenament, 10% validare, 10% testare este adesea o alegere bună, sau 70% antrenament, 15% validare, 15% testare. Dimensiunea depinde și de mărimea totală a setului de date: dacă aveți un set de date foarte mare, un procentaj mai mic pentru testare poate fi suficient.
4. De ce am nevoie de un set de validare dacă am deja unul de testare?
Setul de validare este folosit pentru a monitoriza progresul antrenamentului și pentru a lua decizii legate de model (cum ar fi ajustarea hiperparametrilor sau oprirea timpurie) fără a "contamina" setul de testare. Dacă ați folosi setul de testare pentru aceste decizii, ați ajusta modelul în funcție de performanța pe test set, iar acesta nu ar mai fi un indicator imparțial al generalizării. Setul de testare este ca o ultimă șansă, un examen final pe care modelul îl dă o singură dată.
Concluzie
Înțelegerea și aplicarea corectă a strategiilor de împărțire a datelor în Keras sunt piloni esențiali pentru construirea unor modele de învățare automată performante și de încredere. Fiecare set – antrenament, validare și testare – are un rol distinct și vital. Prin utilizarea judicioasă a train_test_split pentru a crea un set de testare cu adevărat independent și a parametrului validation_split (sau validation_data) pentru monitorizarea în timpul antrenamentului, veți putea identifica și combate probleme precum supraînvățarea și veți obține o evaluare imparțială a capacității de generalizare a modelului dumneavoastră. Nu uitați, model.evaluate() pe setul de testare este verdictul final. Antrenați-vă modelele cu înțelepciune și veți vedea rezultate remarcabile!
Dacă vrei să descoperi și alte articole similare cu Validarea Modelelor Keras: Ghid Complet, poți vizita categoria Fitness.
