Kuidas valida gradiendi võimendamise hinnangute arvu

Andmeteaduses on tänapäeval kasutamiseks saadaval palju algoritme. Seetõttu on üheks kasulikuks meetodiks nende kombineerimine üheks mudeliks, et saada igaühest parim, mille tulemuseks on täpsem mudel.

Scikit-Learni abil leiate Random Foresti algoritmi, mis on komplekti tüüpi ansamblimudel. Teisest küljest leiate ka Boosting-mudeleid, mis treenivad hindajaid järjestikku, kus ühe mudeli tulemus edastatakse järgmisele, mis proovivad ennustusi parandada, kuni jõuavad optimaalse tulemuseni.

Gradiendi võimendamise hinnangut luues leiate selle hüperparameetri n_estimator=100 vaikeväärtusega 100 puud, mis luuakse tulemuseni jõudmiseks. Mitu korda määrame selle lihtsalt vaikeseadeks või suurendame vastavalt vajadusele, isegi kasutades ruudustikuotsingu tehnikaid.

Sellest postitusest leiame lihtsa viisi, kuidas jõuda ühe numbrini, mida kasutada oma modelli koolitamiseks.

Gradient Boostingi saab laadida Scikit-Learnist selle klassi abil from sklearn.ensemble import GradientBoostingRegressor. Gradient Boosting algoritmi saab kasutada kas klassifitseerimiseks või regressioonimudelite jaoks. See on puupõhine hindaja – see tähendab, et see koosneb paljudest otsustuspuudest.

Tulemused Puu 1 tekitab vigu. Neid vigu kasutatakse ja sisendit Puu 2. Taas kasutatakse viimase mudeli vigu ja järgmise sisendit, kuni see jõuab n_estimators väärtus.

Iga mudel sobib eelmise vigadega. Pilt autorilt.

Kuna iga hindaja sobib eelmise veaga, siis eeldatakse, et ennustuste kombinatsioon on parem kui ükski hindaja üksi. Pärast iga iteratsiooni muudame mudeli keerukamaks, vähendades kõrvalekaldeid, kuid suurendades kõrvalekaldeid. Seega peame teadma, millal peatuda.

Vaatame nüüd, kuidas seda teha.

Selle harjutuse kood on lihtne. Peame tegema ainult tsükli pärast iga iteratsiooni ja kontrollima, millisel viga oli kõige väiksem.

Alustame andmekogumi valimisega. Me kasutame auto_avariid andmestik, pärit merel sündinud raamatukogust (seega BDS-litsentsi alusel avatud andmed).

# Andmekogum
df = sns.load_dataset('car_crashes')

Siin on andmete kiire ülevaade. Püüame hinnata total kasutades teisi funktsioone ennustajatena. Kuna see on reaalarvu väljund, räägime regressioonimudelist.

Autoavariide andmestik, merelt sündinud. Pilt autorilt.

Kiirelt korrelatsioone vaadates.

# Korrelatsioonid
df.corr().style.background_gradient(cmap='coolwarm')
Korrelatsioonid andmestikus. Pilt autorilt.

Ok, suurt multikollineaarsust pole. Me näeme seda ins_premium ja ins_losses ei korreleeru väga hästi total , seega me neid mudelis ei arvesta.

Kui kontrollime puuduvaid andmeid, siis neid pole

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

Tore, nii et jagame andmed nüüd pooleks.

# X ja y
X = df.drop(['ins_premium', 'ins_losses', 'lühend', "kokku"], axis=1)
y = df['kokku']
# Rongikatse
X_train, X_test, y_train, y_test = rongi_testi_jaotus(X, y, testi_suurus=0.3, juhuslik_olek=22)

Saame luua konveieri andmete skaleerimiseks ja modelleerimiseks (neid andmeid pole tõesti vaja skaleerida, kuna need on juba samas skaalas, kümnete baasil). Järgmiseks sobitame andmed mudeliga ja ennustame tulemusi.

Ma kasutan 500 hindajat koos a learning_rate kohta 0.3.

Õppimismäär on selle sammu suurus, mille me teeme minimaalse veani jõudmiseks. Kui kasutame liiga kõrget väärtust, võime ületada miinimumi. Kui kasutame liiga väikest numbrit, ei pruugi me sellele ligilähedalegi jõuda. Niisiis, rusikareegel, mida võite kaaluda, on järgmine: kui teil on palju hinnanguid, võite kasutada õppimiskiiruse madalamaid väärtusi. Kui teil on vaid paar hindajat, eelistage kasutada õppimiskiiruse kõrgemaid väärtusi.

sammud = [('skaala', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# Instance Pipeline and fit
toru = torujuhe(sammud).sobib(X_rong, y_rong)
# Ennusta
preds = pipe.predict(X_test)

Nüüd hindab.

# RMSE ennustustest
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[VÄLJAS]: RMSE: 1.1# Tegelike Y väärtuste keskmine
print(f'Andmed y mean: {round( y.mean(),1 )}')
[OUT]: andmed y keskmised: 15.8

Hea. Meie RMSE on umbes 6.9% keskmisest. Nii et me oleme keskmiselt nii palju maha jäänud.

Nüüd kontrollime viisi, kuidas oma mudelit häälestada, valides treenitavate hinnangute optimaalse arvu, mis annab meile madalaima veamäära.

Nagu ma ütlesin, ei pea me tegelikult neid andmeid skaleerima, sest need on juba samas proportsioonis. Nii et sobitame mudelit.

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

Nüüd on see hea kraam. Gradient Boostingis on meetod, mis võimaldab meil korrata iga koolitatud hindaja ennustusi vahemikus 1 kuni 500. Seega loome tsükli, mis läbib 500 hindajat. gbr mudel, ennustab meetodi abil tulemusi staged_predict(), arvutab keskmise ruudu vea ja salvestab tulemuse loendisse errors.

# Looge parim number
errors = [ mean_squared_error(y_test, preds) preds jaoks gbr.staged_predict(X_test)]
# Optimaalne hinnangute arv
optimaalne_hinnangute_arv = np.argmin(errors) + 1

Järgmisena saame tulemuse joonistada.

#Süžee
g=sns.lineplot(x=vahemik(500), y=vead)
g.set_title(f'Parim hinnangute arv juures {parim_n_estimators}', size=15);
Parim hinnangute arv. Pilt autorilt.

Näeme, et madalaim veamäär on 34 hinnanguga. Niisiis, õpetame oma mudelit ümber 34 hinnanguga ja võrdleme torujuhtmega treenitud mudeli tulemusega.

# Õppige ümber
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# Ennustused
preds2 = gbr.predict(X_test)

Hinnatakse…

# RMSE ennustustest
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[VÄLJAS]: RMSE: 1.0
# Andmed Y tähendab
print(f'Andmed y mean: {round( y.mean(),1 )}')
[OUT]: andmed y keskmised: 15.8

Nüüd langesime 6.9%-lt 6.3%-le. u. 9% parem. Vaatame mõnda ennustust.

Mõlema mudeli ennustused. Pilt autorilt.

Huvitavad tulemused. Mõned teise mudeli ennustused on paremad kui esimesed.

Õppisime, kuidas määrata a näpistamiseks parimat hinnangute arvu GradientBoostingRegressor Scikit-Learnist. See on hüperparameeter, mis võib seda tüüpi ansamblimudelis muuta, mis koolitab hinnanguid järjest.

Mõnikord võib mudel pärast paari iteratsiooni hakata üle sobituma, mistõttu hakkab see dispersioon liiga palju suurendama, mõjutades ennustusi.

Nägime, et lihtne silmus aitab meil sel juhul optimaalse lahenduse leida. Kuid kindlasti võib suurte andmekogumite arvutamine olla kulukas, seega oleks mõte proovida madalamat n_estimators alguses ja vaadake, kas jõuate piisavalt kiiresti minimaalse veani.

Siin on täielik kood GitHubis.

Kui teile see sisu meeldis, jälgige minu blogi.

Leidke mind LinkedIn.

See harjutus põhines viites oleval suurepärasel Aurélien Géroni õpikul.

Allikast https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— uuesti avaldatud gradiendi võimendamise hinnangute arvu valimine. 4 https://towardsdatascience.com/feed kaudu

<!–

->

Ajatempel:

Veel alates Blockchaini konsultandid