Cum să alegeți numărul de estimatori pentru creșterea gradului

În Data Science, există mulți algoritmi disponibili pentru utilizare în zilele noastre. Prin urmare, o tehnică utilă este să le combinați într-un singur model pentru a obține cele mai bune rezultate din fiecare, rezultând un model mai precis.

Folosind Scikit-Learn, veți găsi algoritmul Random Forest, care este tipul de model de ansamblu. Pe de altă parte, veți găsi și modele Boosting, care antrenează estimatorii în succesiune, unde rezultatul unui model este trecut celui următor, care vor încerca să îmbunătățească predicțiile, până când ajung la un rezultat optim.

Când creați un estimator de creștere a gradului, veți găsi acest hiperparametru n_estimator=100 cu o valoare implicită de 100 de arbori de creat pentru a ajunge la un rezultat. De multe ori, pur și simplu setăm acest lucru la valoarea implicită sau poate creștem după cum este necesar, chiar și folosind tehnici de căutare în grilă.

În această postare, vom găsi o modalitate simplă de a ajunge la un singur număr de utilizat pentru a ne antrena modelul.

Gradient Boosting poate fi încărcat din Scikit-Learn folosind această clasă from sklearn.ensemble import GradientBoostingRegressor. Algoritmul de creștere a gradului poate fi utilizat fie pentru clasificare, fie pentru modele de regresie. Este un estimator bazat pe arbore, ceea ce înseamnă că este compus din mulți arbori de decizie.

Rezultatul Arborele 1 va genera erori. Aceste erori vor fi folosite și intrarea pentru Arborele 2. Încă o dată se vor folosi erorile ultimului model și introducerea următorului, până ajunge la n_estimators valoare.

Fiecare model se va potrivi cu erorile celui precedent. Imaginea autorului.

Deoarece fiecare estimator se va potrivi cu eroarea celui precedent, se așteaptă ca combinația de predicții să fie mai bună decât oricare dintre estimatorii singuri. După fiecare iterație, facem modelul mai complex, reducând părtinirea, dar crescând varianța, pe de altă parte. Așa că trebuie să știm când să ne oprim.

Să vedem cum să facem asta acum.

Codul pentru acest exercițiu este simplu. Tot ce trebuie să facem este o buclă după fiecare iterație și să verificăm la care dintre ele am avut cea mai mică eroare.

Să începem prin a alege un set de date. Vom folosi accidente de mașină set de date, nativ din biblioteca seaborn (deci date deschise sub licență BDS).

# Setul de date
df = sns.load_dataset('car_crashes')

Iată o privire rapidă asupra datelor. Vom încerca să estimăm total suma folosind celelalte caracteristici ca predictori. Deoarece este un număr real de ieșire, vorbim despre un model de regresie.

Set de date privind accidentele de mașină, din seaborn. Imaginea autorului.

Privind rapid corelațiile.

# Corelații
df.corr().style.background_gradient(cmap='coolwarm')
Corelații în setul de date. Imaginea autorului.

Ok, nu există multicoliniaritate majoră. Putem vedea asta ins_premium și ins_losses nu se corelează foarte bine cu total , deci nu le vom lua în considerare în model.

Dacă verificăm datele lipsă, nu există

# Dispărut
df.isnull().sum()
0

Frumos, așa că hai să împărțim datele acum.

# X și y
X = df.drop(['ins_premium', 'ins_loss', 'abrev', 'total'], axa=1)
y = df['total']
# Testul trenului
X_train, X_test, y_train, y_test = tren_test_split(X, y, test_size=0.3, random_state=22)

Putem crea o conductă pentru a scala datele și a le modela (într-adevăr nu este foarte necesar să scalați aceste date, deoarece sunt deja la aceeași scară, pe baza zecilor). Apoi, potrivim datele modelului și prezicem rezultatele.

Folosesc 500 de estimatori cu a learning_rate din 0.3.

Rata de învățare este dimensiunea pasului pe care îl facem pentru a ajunge la eroarea minimă. Dacă folosim o valoare prea mare, putem trece de minimul. Dacă folosim un număr prea mic, este posibil să nu ne apropiem de el. Deci, o regulă generală pe care o puteți lua în considerare este: dacă aveți un număr mare de estimatori, puteți utiliza valori mai mici ale ratei de învățare. Dacă aveți doar câțiva estimatori, preferați să utilizați valori mai mari ale ratei de învățare.

pași = [('scale', StandardScaler()),
(„GBR”, GradientBoostingRegressor(n_estimators=500, learning_rate=0.03))]
# Instanță Conductă și potrivire
pipe = Pipeline(steps).fit(X_train, y_train)
# Prezice
preds = pipe.predict(X_test)

Acum, evaluând.

# RMSE al predicțiilor
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[OUT]: RMSE: 1.1# Media valorilor Y adevărate
print(f'Date y mean: {round(y.mean(),1 )}')
[OUT]: Media și date: 15.8

Bun. RMSE nostru este de aproximativ 6.9% din medie. Așa că ne-am deplasat atât de mult, în medie.

Acum să verificăm o modalitate de ajustare a modelului nostru, alegând numărul optim de estimatori de antrenat care ne va oferi cea mai mică rată de eroare.

După cum am spus, nu trebuie să scalam aceste date, deoarece sunt deja în aceeași proporție. Deci haideți să potrivim modelul.

#Model
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

Acum sunt lucrurile bune. Există o metodă în Gradient Boosting care ne permite să iterăm peste predicțiile fiecărui estimator antrenat, de la 1 la 500. Deci, vom crea o buclă care trece prin cei 500 de estimatori din gbr model, prezice rezultatele folosind metoda staged_predict(), calculează eroarea pătratică medie și stochează rezultatul în listă errors.

# Buclă pentru cel mai bun număr
erori = [mean_squared_error(y_test, preds) for preds in gbr.staged_predict(X_test)]
# Numărul optim de estimatori
optim_num_estimators = np.argmin(errors) + 1

Apoi, putem reprezenta un grafic rezultatul.

#Plot
g=sns.lineplot(x=interval(500), y=erori)
g.set_title(f'Cel mai bun număr de estimatori la {best_n_estimators}', size=15);
Cel mai bun număr de estimatori. Imaginea autorului.

Vedem că cea mai mică rată de eroare este cu 34 de estimatori. Deci, haideți să reantrenăm modelul nostru cu 34 de estimatori și să comparăm cu rezultatul modelului antrenat cu pipeline.

# Reantrenează-te
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# Previziuni
preds2 = gbr.predict(X_test)

Se evaluează…

# RMSE al predicțiilor
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[OUT]: RMSE: 1.0
# Date Y înseamnă
print(f'Date y mean: {round(y.mean(),1 )}')
[OUT]: Media și date: 15.8

Am scăzut acum de la 6.9% la 6.3% reducere. Aproximativ. 9% mai bine. Să ne uităm la câteva previziuni.

Predicții de la ambele modele. Imaginea autorului.

Rezultate interesante. Unele dintre predicțiile celui de-al doilea model sunt mai bune decât primul.

Am învățat cum să determinăm cel mai bun număr de estimatori pentru a ajusta a GradientBoostingRegressor de la Scikit-Learn. Acesta este un hiperparametru care poate face diferența în acest tip de model de ansamblu, care antrenează estimatorii în secvență.

Uneori, după câteva iterații, modelul poate începe să se supraadapte, astfel va începe să crească prea mult varianța, impactând predicțiile.

Am văzut că o simplă buclă ne poate ajuta să găsim soluția optimă în acest caz. Dar, cu siguranță, pentru seturi mari de date poate fi costisitor de calculat, așa că o idee ar fi să încercați un n_estimators la început și vedeți dacă puteți ajunge la eroarea minimă destul de curând.

Iată-l cod complet în GitHub.

Dacă ți-a plăcut acest conținut, urmărește blogul meu.

Găsește-mă pe LinkedIn.

Acest exercițiu s-a bazat pe excelentul manual al lui Aurélien Géron, în referință.

Cum să alegeți numărul de estimatori pentru creșterea gradului republicat din sursa https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 prin https://towardsdatascience.com/feed

<!–

->

Timestamp-ul:

Mai mult de la Consultanți Blockchain