Gradient Boostingin arvioijien lukumäärän valitseminen

Data Sciencessä on nykyään tarjolla monia algoritmeja. Tästä syystä yksi hyödyllinen tekniikka on yhdistää ne yhdeksi malliksi parhaan hyödyn saamiseksi jokaisesta, jolloin saadaan tarkempi malli.

Scikit-Learnin avulla löydät Random Forest -algoritmin, joka on säkitystyyppinen kokonaisuusmalli. Toisaalta löydät myös Boosting-malleja, jotka kouluttavat estimaattoreita peräkkäin, jossa yhden mallin tulos välitetään seuraavaan, jotka yrittävät parantaa ennusteita, kunnes saavuttavat optimaalisen tuloksen.

Kun luot Gradient Boosting -estimaattorin, löydät tämän hyperparametrin n_estimator=100 oletusarvolla 100 puuta luodaan tulokseen pääsemiseksi. Monta kertaa asetamme tämän vain oletusasetukseksi tai ehkä lisäämme sitä tarpeen mukaan, jopa käyttämällä ruudukkohakutekniikoita.

Tässä viestissä löydämme yksinkertaisen tavan päästä yhteen numeroon, jota käytetään mallimme kouluttamiseen.

Gradient Boosting voidaan ladata Scikit-Learnistä käyttämällä tätä luokkaa from sklearn.ensemble import GradientBoostingRegressor. Gradient Boosting -algoritmia voidaan käyttää joko luokitteluun tai regressiomalleihin. Se on puupohjainen estimaattori, mikä tarkoittaa, että se koostuu useista päätöspuista.

Tulos Puu 1 tuottaa virheitä. Näitä virheitä käytetään ja syöte Puu 2. Jälleen kerran käytetään edellisen mallin virheitä ja seuraavan syöttöä, kunnes se saavuttaa n_estimators arvoa.

Jokainen malli sopii edellisen virheet. Kuva tekijältä.

Koska jokainen estimaattori sopii edellisen virheeseen, on odotettavissa, että ennusteiden yhdistelmä on parempi kuin minkään estimaattorin yksinään. Jokaisen iteraation jälkeen teemme mallista monimutkaisemman, vähentäen harhaa mutta lisäämällä varianssia kääntöpuolella. Joten meidän on tiedettävä, milloin lopettaa.

Katsotaan nyt, miten se tehdään.

Tämän harjoituksen koodi on yksinkertainen. Meidän tarvitsee vain tehdä silmukka jokaisen iteraation jälkeen ja tarkistaa, missä virhe oli pienin.

Aloitetaan valitsemalla tietojoukko. Tulemme käyttämään auton_kolarit tietojoukko, kotoisin seaborn-kirjastosta (eli avoin data BDS-lisenssillä).

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

Tässä on nopea katsaus dataan. Yritämme arvioida total määrä käyttämällä muita ominaisuuksia ennustajina. Koska se on reaalilukutulostus, puhumme regressiomallista.

Kolareiden tietojoukko, merestä syntyneestä. Kuva tekijältä.

Nopeasti katsomaan korrelaatioita.

# Korrelaatiot
df.corr().style.background_gradient(cmap='coolwarm')
Korrelaatiot aineistossa. Kuva tekijältä.

Ok, ei suurta multikollineaarisuutta. Voimme nähdä sen ins_premium ja ins_losses eivät korreloi kovin hyvin total , joten emme ota niitä huomioon mallissa.

Jos tarkistamme puuttuvat tiedot, niitä ei ole

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

Hienoa, jaetaan nyt tiedot.

# X ja y
X = df.drop(['ins_premium', 'ins_losses', 'lyhenne', 'yhteensä'], axis=1)
y = df['yhteensä']
# Junatesti
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

Voimme luoda putkilinjan datan skaalaamiseksi ja mallintamiseksi (ei todellakaan ole kovin tarpeellista skaalata näitä tietoja, koska ne ovat jo samassa mittakaavassa, kymmenien perusteella). Seuraavaksi sovitamme tiedot malliin ja ennustamme tulokset.

Käytän 500 estimaattoria a learning_rate ja 0.3.

Oppimisnopeus on sen askeleen koko, jonka otamme saavuttaaksemme minimivirheen. Jos käytämme liian korkeaa arvoa, saatamme ylittää minimin. Jos käytämme liian pientä lukua, emme ehkä pääse edes lähelle sitä. Joten, nyrkkisääntö, jota voit harkita, on: jos sinulla on suuri määrä arvioijia, voit käyttää alhaisempia oppimisnopeuden arvoja. Jos sinulla on vain muutama arvioija, käytä mieluummin korkeampia oppimisnopeuden arvoja.

Steps = [('scale', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# Instance Pipeline ja sovi
putki = Pipeline(steps).fit(X_train, y_train)
# Ennusta
preds = pipe.predict(X_test)

Nyt arvioitaessa.

# RMSE ennusteista
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[OUT]: RMSE: 1.1# Todellisten Y-arvojen keskiarvo
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]: Data y tarkoittaa: 15.8

Hyvä. Meidän RMSE on noin 6.9 % keskiarvosta. Olemme siis keskimäärin niin poissa.

Tarkastellaan nyt tapaa virittää mallimme valitsemalla optimaalinen määrä estimaattoreita, jotka koulutetaan ja jotka antavat meille alhaisimman virheprosentin.

Kuten sanoin, meidän ei todellakaan tarvitse skaalata tätä dataa, koska se on jo samassa suhteessa. Sovitetaan siis malli.

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

Nyt se on hyvää tavaraa. Gradient Boostingissa on menetelmä, jonka avulla voimme iteroida jokaisen koulutetun estimaattorin ennusteita 1:stä 500:aan. Luomme siis silmukan, joka kulkee 500 estimaattorin läpi. gbr malli, ennustaa tuloksia menetelmällä staged_predict(), laskee keskimääräisen neliövirheen ja tallentaa tuloksen luetteloon errors.

# Loop parhaan numeron saamiseksi
errors = [ mean_squared_error(y_test, preds) predsille gbr.staged_predict(X_test)]
# Optimaalinen arvioijien määrä
optimaalinen_arvioiden_määrä = np.argmin(errors) + 1

Seuraavaksi voimme piirtää tuloksen.

#juoni
g=sns.lineplot(x=alue(500), y=virheet)
g.set_title(f'Paras arvioijien määrä {best_n_estimators}', koko=15);
Paras arvioijien määrä. Kuva tekijältä.

Näemme, että pienin virheprosentti on 34 estimaattorilla. Koulutetaan siis mallimme uudelleen 34 estimaattorilla ja verrataan putkilinjalla harjoitetun mallin tulokseen.

#Opeta uudelleen
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# Ennusteet
preds2 = gbr.predict(X_test)

Arvioidaan…

# RMSE ennusteista
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[OUT]: RMSE: 1.0
# Data Y tarkoittaa
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]: Data y tarkoittaa: 15.8

Laskimme nyt 6.9 prosentista 6.3 prosenttiin. Noin 9% parempi. Katsotaanpa muutamia ennusteita.

Ennusteet molemmista malleista. Kuva tekijältä.

Mielenkiintoisia tuloksia. Jotkut toisen mallin ennusteet ovat parempia kuin ensimmäinen.

Oppimme määrittämään parhaan estimaattien määrän säätämistä varten GradientBoostingRegressor Scikit-Learnilta. Tämä on hyperparametri, joka voi vaikuttaa tällaiseen ensemble-malliin, joka kouluttaa estimaattoreita peräkkäin.

Joskus muutaman iteroinnin jälkeen malli voi alkaa ylisovittua, jolloin se alkaa kasvattaa varianssia liikaa, mikä vaikuttaa ennusteisiin.

Näimme, että yksinkertainen silmukka voi auttaa meitä löytämään optimaalisen ratkaisun tässä tapauksessa. Mutta tietysti suurille tietojoukoille sen laskeminen voi olla kallista, joten idea olisi kokeilla pienempää n_estimators ensin ja katso, voitko saavuttaa vähimmäisvirheen riittävän pian.

Tässä on täydellinen koodi GitHubissa.

Jos pidit tästä sisällöstä, seuraa blogiani.

Löydä minut LinkedIn.

Tämä harjoitus perustui viitteessä olevaan Aurélien Géronin erinomaiseen oppikirjaan.

Kuinka valita estimaattien lukumäärä Gradient Boostingille uudelleenjulkaistu lähteestä https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 osoitteessa https://towardsdatascience.com/feed

<!-

->

Aikaleima:

Lisää aiheesta Blockchain-konsultit