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 Forest | Gradient Boosting | |
|---|---|---|
| Precizie tipică pe tabele | foarte bună | de obicei cea mai bună |
| Sensibilitate la hiperparametri | mică — merge „din cutie" | mare — cere tuning (lecția 4.3) |
| Risc de overfitting | mic | mediu (learning_rate prea mare / prea mulți arbori) |
| Antrenare | paralelizabilă | secvențială |
| Interpretabilitate | mai slabă decât un arbore — folosește feature_importances_ | |
Problemă rezolvată: evaluarea împrumuturilor
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
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.
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?
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?
Clasificare multi-clasă pe date tabelare — exersează întreaga rețetă.