Kako izbrati število ocenjevalcev za Gradient Boosting

V Data Science je dandanes na voljo veliko algoritmov za uporabo. Ena uporabna tehnika je torej njihova kombinacija v enem samem modelu, da bi dobili najboljše iz vsakega, kar ima za posledico natančnejši model.

Z uporabo Scikit-Learna boste našli algoritem Random Forest, to je vrsta modela ansambla za zbiranje vreč. Po drugi strani pa boste našli tudi modele Boosting, ki usposabljajo ocenjevalce v zaporedju, kjer se rezultat enega modela posreduje naslednjemu, ki bo poskušal izboljšati napovedi, dokler ne dosežejo optimalnega rezultata.

Ta hiperparameter boste našli pri ustvarjanju ocenjevalca Gradient Boosting n_estimator=100 s privzeto vrednostjo 100 dreves, ki jih je treba ustvariti, da pridemo do rezultata. Velikokrat to samo nastavimo na privzeto ali morda povečamo po potrebi, tudi s tehnikami iskanja po mreži.

V tej objavi bomo našli preprost način, kako priti do ene same številke, ki jo bomo uporabili za usposabljanje našega modela.

Gradient Boosting je mogoče naložiti iz Scikit-Learn s tem razredom from sklearn.ensemble import GradientBoostingRegressor. Algoritem Gradient Boosting se lahko uporablja bodisi za klasifikacijo bodisi za regresijske modele. Je drevesni ocenjevalec, kar pomeni, da je sestavljen iz številnih odločitvenih dreves.

Rezultat Drevo 1 bo ustvaril napake. Te napake bodo uporabljene in vnos za Drevo 2. Ponovno bodo uporabljene napake zadnjega modela in vnos naslednjega, dokler ne doseže n_estimators vrednost.

Vsak model bo ustrezal napakam prejšnjega. Slika avtorja.

Ker bo vsak ocenjevalec ustrezal napaki prejšnjega, je pričakovati, da bo kombinacija napovedi boljša od katere koli posamezne ocenjevalca. Po vsaki ponovitvi naredimo model bolj zapleten, zmanjšamo pristranskost, a povečamo varianco na drugi strani. Zato moramo vedeti, kdaj se ustaviti.

Poglejmo, kako to storiti.

Koda za to vajo je preprosta. Vse, kar moramo narediti, je zanka po vsaki ponovitvi in ​​preveriti, pri kateri smo imeli najmanjšo napako.

Začnimo z izbiro nabora podatkov. Uporabili bomo car_crashes nabor podatkov, izvorno iz morske knjižnice (torej odprti podatki pod licenco BDS).

# Nabor podatkov
df = sns.load_dataset('car_crashes')

Tukaj je kratek pregled podatkov. Poskušali bomo oceniti total količino z uporabo drugih funkcij kot napovednikov. Ker gre za realno število, govorimo o regresijskem modelu.

Nabor podatkov o avtomobilskih nesrečah, iz morja. Slika avtorja.

Na hitro pogledam korelacije.

# Korelacije
df.corr().style.background_gradient(cmap='coolwarm')
Korelacije v naboru podatkov. Slika avtorja.

Ok, ni večje multikolinearnosti. To lahko vidimo ins_premium in ins_losses ne ujemajo dobro z total , zato jih v modelu ne bomo upoštevali.

Če preverimo manjkajoče podatke, jih ni

# Manjka
df.isnull().sum()
0

Lepo, zdaj pa razdelimo podatke.

# X in y
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], axis=1)
y = df['total']
# Test vlaka
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

Ustvarimo lahko cevovod za skaliranje podatkov in njihovo modeliranje (teh podatkov res ni zelo potrebno skalirati, saj so že v istem merilu, na podlagi desetic). Nato prilagodimo podatke modelu in napovemo rezultate.

Uporabljam 500 ocenjevalcev z a learning_rate 0.3.

Stopnja učenja je velikost koraka, ki ga naredimo, da dosežemo najmanjšo napako. Če uporabimo previsoko vrednost, lahko presežemo minimum. Če uporabimo premajhno številko, se ji morda ne bomo niti približali. Torej, pravilo, ki ga lahko upoštevate, je: če imate veliko ocenjevalcev, lahko uporabite nižje vrednosti stopnje učenja. Če imate le nekaj ocenjevalcev, raje uporabite višje vrednosti stopnje učenja.

koraki = [('scale', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03))]
# Cevovod primerka in prileganje
cev = Cevovod(koraki).fit(X_vlak, y_vlak)
# Predvidi
preds = pipe.predict(X_test)

Zdaj pa ocenjevanje.

# RMSE napovedi
print(f'RMSE: {round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[OUT]: RMSE: 1.1# Srednja prava vrednosti Y
print(f'Podatki y mean: {round( y.mean(),1 )}')
[OUT]: Srednja vrednost podatkov y: 15.8

Dobro. Naš RMSE je približno 6.9 % povprečja. Torej v povprečju zaostajamo za toliko.

Zdaj pa preverimo način za nastavitev našega modela z izbiro optimalnega števila ocenjevalcev za usposabljanje, ki nam bo dalo najnižjo stopnjo napake.

Kot sem rekel, teh podatkov nam res ni treba skalirati, ker so že v istem razmerju. Torej prilagodimo model.

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

Zdaj je to dobra stvar. Obstaja metoda v Gradient Boostingu, ki nam omogoča, da ponovimo napovedi vsakega usposobljenega ocenjevalca, od 1 do 500. Ustvarili bomo torej zanko, ki gre skozi 500 ocenjevalcev v gbr model, napoveduje rezultate z uporabo metode staged_predict(), izračuna srednjo kvadratno napako in shrani rezultat na seznam errors.

# Zanka za najboljšo številko
napake = [ mean_squared_error(y_test, preds) za preds v gbr.staged_predict(X_test)]
# Optimalno število ocenjevalcev
optimalno_število_ocenjevalcev = np.argmin(napake) + 1

Nato lahko narišemo rezultat.

#Zaplet
g=sns.lineplot(x=razpon(500), y=napake)
g.set_title(f'Najboljše število ocenjevalcev pri {best_n_estimators}', size=15);
Najboljše število ocenjevalcev. Slika avtorja.

Vidimo, da je najnižja stopnja napak pri 34 ocenjevalcih. Torej, ponovno usposobimo naš model s 34 ocenjevalci in primerjajmo z rezultatom modela, urjenega s cevovodom.

# Preusposabljanje
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
#Napovedi
preds2 = gbr.predict(X_test)

Ocenjevanje ...

# RMSE napovedi
print(f'RMSE: {round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[OUT]: RMSE: 1.0
# Podatki Y pomenijo
print(f'Podatki y mean: {round( y.mean(),1 )}')
[OUT]: Srednja vrednost podatkov y: 15.8

Sedaj smo znižali s 6.9 % na 6.3 %. Pribl. 9% bolje. Poglejmo nekaj napovedi.

Napovedi iz obeh modelov. Slika avtorja.

Zanimivi rezultati. Nekatere napovedi drugega modela so boljše od prvega.

Naučili smo se, kako določiti najboljše število ocenjevalcev za prilagajanje a GradientBoostingRegressor iz Scikit-Learn. To je hiperparameter, ki lahko vpliva na to vrsto modela ansambla, ki usposablja ocenjevalce v zaporedju.

Včasih se lahko po nekaj iteracijah model začne pretirano prilagajati, zato bo začel preveč povečevati varianco, kar bo vplivalo na napovedi.

Videli smo, da nam lahko preprosta zanka pomaga najti optimalno rešitev v tem primeru. Seveda pa je izračun za velike nabore podatkov lahko drag, zato bi bilo bolje poskusiti z nižjim n_estimators najprej in preverite, ali lahko dovolj hitro dosežete minimalno napako.

Tukaj je celotno kodo v GitHubu.

Če vam je bila ta vsebina všeč, spremljajte moj blog.

Poiščite me LinkedIn.

Ta vaja je temeljila na odličnem učbeniku Auréliena Gérona, v sklicu.

Kako izbrati število ocenjevalcev za Gradient Boosting Ponovno objavljeno iz vira https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 prek https://towardsdatascience.com/feed

<!–

->

Časovni žig:

Več od Svetovalci v verigi blokov