Învățare supervizată

2.6 Modele ansamblu

Un singur arbore greșește ușor; o sută de arbori care votează greșesc mult mai rar. Ansamblurile sunt modelele care câștigă problemele tabelare la ONIA.

Teorie

Combinarea modelelor

Ideea: antrenezi mai multe modele „slabe" și le combini predicțiile (vot la clasificare, medie la regresie). Erorile individuale se compensează dacă modelele greșesc diferit. Cele două strategii mari: bagging (modele antrenate independent, în paralel) și boosting (modele antrenate secvențial, fiecare corectând erorile precedentului).

Bagging și Random Forest

Bagging (bootstrap aggregating): fiecare model primește un eșantion aleator cu revenire din train. Random Forest = bagging cu arbori + un truc în plus: la fiecare nod se consideră doar un subset aleator de feature-uri, ca arborii să fie cât mai diferiți între ei.

from sklearn.ensemble import RandomForestClassifier, BaggingClassifier

rf = RandomForestClassifier(
    n_estimators=300,     # numărul de arbori
    max_depth=None,
    n_jobs=-1,            # toate nucleele CPU
    random_state=42,
)
rf.fit(X_train, y_train)
print(rf.feature_importances_)   # importanța feature-urilor, gratis

Gradient Boosting

Arborii se construiesc pe rând: fiecare arbore nou învață să prezică erorile (reziduurile) ansamblului de până atunci. Predicția finală = suma contribuțiilor, ponderată cu o rată de învățare mică. De regulă mai precis decât Random Forest, dar mai sensibil la hiperparametri.

from sklearn.ensemble import GradientBoostingClassifier, HistGradientBoostingClassifier

gb = HistGradientBoostingClassifier(   # varianta rapidă, recomandat
    max_iter=300,          # numărul de arbori
    learning_rate=0.1,     # cât contribuie fiecare arbore
    max_depth=None,
    random_state=42,
)
gb.fit(X_train, y_train)

Avantaje și limitări

Random ForestGradient Boosting
Precizie tipică pe tabelefoarte bunăde obicei cea mai bună
Sensibilitate la hiperparametrimică — merge „din cutie"mare — cere tuning (lecția 4.3)
Risc de overfittingmicmediu (learning_rate prea mare / prea mulți arbori)
Antrenareparalelizabilăsecvențială
Interpretabilitatemai slabă decât un arbore — folosește feature_importances_
Strategie de concurs: baseline cu regresie logistică / arbore → Random Forest → HistGradientBoosting cu tuning. Scorurile cresc de obicei în această ordine.

Problemă rezolvată: evaluarea împrumuturilor

Sistem automatizat de evaluare a împrumuturilor Mediu Rezolvată — 100p

Pe baza datelor despre client (venit, istoric, datorii), decidem dacă împrumutul se aprobă. Date tabelare cu coloane mixte — teren ideal pentru ansambluri.

Soluția pas cu pas

1. One-hot pe coloanele categorice. 2. Comparăm trei modele prin cross-validation. 3. Câștigătorul antrenat pe tot train-ul → submisie.

import pandas as pd
from sklearn.ensemble import RandomForestClassifier, HistGradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

y = train["aprobat"]
X = pd.get_dummies(train.drop(columns=["SampleID", "aprobat"]))
X_test = pd.get_dummies(test.drop(columns=["SampleID"]))
X, X_test = X.align(X_test, join="left", axis=1, fill_value=0)  # aceleași coloane

modele = {
    "logistic": LogisticRegression(max_iter=1000),
    "random forest": RandomForestClassifier(n_estimators=300, random_state=42),
    "gradient boosting": HistGradientBoostingClassifier(random_state=42),
}
for nume, m in modele.items():
    print(nume, cross_val_score(m, X.fillna(0), y, cv=5, scoring="f1").mean().round(3))

best = HistGradientBoostingClassifier(random_state=42).fit(X.fillna(0), y)
pd.DataFrame({
    "SampleID": test["SampleID"],
    "aprobat": best.predict(X_test.fillna(0))
}).to_csv("submission.csv", index=False)

Atenție la align: după one-hot, train și test trebuie să aibă exact aceleași coloane, în aceeași ordine.

Probleme propuse

1. Puterea votului Exercițiu

Dacă 5 clasificatori independenți au fiecare 70% acuratețe, ce acuratețe are votul majoritar? Simulează cu NumPy (10 000 de runde) și compară cu calculul teoretic binomial.

2. Câți arbori sunt de ajuns? Exercițiu

Desenează scorul de validare al unui Random Forest pentru n_estimators ∈ {1, 5, 10, 50, 100, 300, 1000}. De la ce punct nu mai crește?

3. Learning rate în boosting Exercițiu

Pentru HistGradientBoosting, compară perechile (learning_rate=0.01, max_iter=1000) și (learning_rate=0.3, max_iter=50). Ce observi pe train vs validare?

4. Predicția stării academice a studenților Platformă

Clasificare multi-clasă pe date tabelare — exersează întreaga rețetă.