Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Dokončni vodnik po algoritmu naključnega gozda s programoma Python in Scikit-Learn

Predstavitev

Algoritem Random Forest je eden najbolj prilagodljivih, zmogljivih in široko uporabljenih algoritmov za klasifikacija in regresija, zgrajena kot ansambel Drevesa odločitev.

Če s temi niste seznanjeni – brez skrbi, obravnavali bomo vse te koncepte.

V tem poglobljenem priročniku bomo zgradili intuicija o tem, kako delujejo odločitvena drevesa, kako združevanje poveča posamezne klasifikatorje in regresorje, kaj so naključni gozdovi in ​​zgradite naključni gozdni klasifikator in regresor z uporabo Pythona in Scikit-Learn, skozi mini projekt od konca do konca, in odgovorite na raziskovalno vprašanje.

Predstavljajte si, da ste trenutno del raziskovalne skupine, ki analizira podatke o ženskah. Skupina je zbrala 100 podatkovnih zapisov in želi te začetne zapise organizirati tako, da ženske razdeli v kategorije: so ali niso noseče in živijo na podeželju ali v mestih. Raziskovalci želijo razumeti, koliko žensk bi bilo v vsaki kategoriji.

Obstaja računalniška struktura, ki naredi točno to, to je Drevo struktura. Z uporabo drevesne strukture boste lahko predstavili različne razdelke za vsako kategorijo.

Drevesa odločanja

Kako poseliš vozlišča drevesa? Tukaj je drevesa odločanja priti v fokus.

Najprej lahko zapise razdelimo po nosečnosti, nato pa po življenju v mestu ali na podeželju. Upoštevajte, da bi to lahko naredili v drugačnem vrstnem redu, tako da bi najprej razdelili glede na območje, v katerem živijo ženske, nato pa glede na njihov status nosečnosti. Iz tega lahko vidimo, da ima drevo inherentno hierarhijo. Poleg organiziranja informacij drevo organizira informacije na hierarhični način – vrstni red, v katerem se informacije pojavljajo, je pomemben in posledično vodi do različnih dreves.

Spodaj je primer drevesa, ki je bilo opisano:

Na sliki drevesa je 7 kvadratov, tisti na vrhu, ki predstavlja skupno 100 žensk, ta zgornji kvadrat je povezan z dvema kvadratoma spodaj, ki delita ženske glede na njihovo število na 78 nenosečih in 22 nosečih, in iz obeh prejšnjih kvadratov so štirje kvadrati; dva povezana z vsakim zgornjim kvadratom, ki delita ženske glede na njihovo območje, za nenoseče jih 45 živi v mestnem območju, 33 na podeželju, za nosečnice pa 14 živi na podeželju in 8 v mestnem območju. Samo če pogledamo drevo, je enostavno razumeti te delitve in videti, kako vsaka "plast" izhaja iz prejšnjih, te plasti so drevo ravni, ravni opisujejo globina drevesa:

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Na zgornji sliki opazite, da je prva raven drevesa Stopnja 0 kjer je samo en kvadrat, ki mu sledi Stopnja 1 kjer sta dva kvadrata, in Stopnja 2 kjer so štirje kvadrati. To je a globina 2 drevo.

Na ravni 0 je kvadrat, ki izvira iz prvega imenovanega drevesa korensko vozlišče, ta koren ima dva podrejena vozlišča na ravni 1, to je nadrejena vozlišča štirim vozliščem na ravni 2. Oglejte si, da se »kvadrati«, ki smo jih do sedaj omenjali, dejansko imenujejo vozlišča; in da je vsako prejšnje vozlišče nadrejeno za naslednja vozlišča, ki so njegovi otroci. Pokličejo se podrejena vozlišča vsake ravni, ki imajo istega nadrejenega bratje in sestre, kot je razvidno iz naslednje slike:

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Na prejšnji sliki prikazujemo tudi raven 1 kot notranja vozlišča, ko so med korenom in zadnjimi vozlišči, ki so listna vozlišča. Listni vozli so zadnji del drevesa, če bi od prvih 100 žensk rekli, koliko jih je nosečih in živijo na podeželju, bi to lahko storili tako, da pogledamo liste. Torej bi številka na listih odgovorila na prvo raziskovalno vprašanje.

Če bi obstajali novi zapisi o ženskah in bi se drevo, ki je bilo prej uporabljeno za njihovo kategorizacijo, zdaj uporabljalo za odločanje o tem, ali bi ženska lahko ali ne mogla biti del raziskave, ali bi to še vedno delovalo? Drevo bi uporabljalo enaka merila, ženska pa bi lahko sodelovala, če je noseča in živi na podeželju.

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Če pogledamo zgornjo sliko, lahko vidimo, da so odgovori na vprašanja vsakega drevesnega vozla - "ali je udeleženka?", "ali je noseča?", "ali živi na podeželju?" - da, ja, in ja, torej se zdi, da lahko drevo vodi do odločitve, v tem primeru, da ženska lahko sodeluje v raziskavi.

To je bistvo odločitvenih dreves v, izvedeno na ročni način. Z uporabo strojnega učenja lahko sestavimo model, ki za nas samodejno sestavi to drevo, na tak način, da povečamo natančnost končnih odločitev.

Opomba: v računalništvu obstaja več vrst dreves, kot so binarna drevesa, splošna drevesa, drevesa AVL, razporejena drevesa, rdeče črna drevesa, b-drevesa itd. Tukaj se osredotočamo na dajanje splošne predstave o tem, kaj je odločitveno drevo . Če je odvisno od odgovora a ja or št vprašanje za vsako vozlišče in s tem ima vsako vozlišče največ dva otroka, ko so razvrščena tako, da so "manjša" vozlišča na levi, to razvrsti odločitvena drevesa kot binarna drevesa.

V prejšnjih primerih opazujte, kako bi lahko tudi drevo razvrsti novi podatki kot sodelujoči ali neudeleženci ali pa bi se vprašanja lahko spremenila v – »koliko je udeležencev?«, »koliko jih je nosečih?«, »koliko jih živi na podeželju?« – kar nas vodi do iskanja Količina nosečih udeleženk, ki živijo na podeželju.

Ko so podatki razvrščeni, to pomeni, da drevo izvaja a Razvrstitev opravilo, in ko je količina podatkov najdena, drevo izvaja a regresija naloga. To pomeni, da se lahko odločitveno drevo uporablja za obe nalogi – klasifikacijo in regresijo.

Zdaj, ko razumemo, kaj je odločitveno drevo, kako ga lahko uporabimo in kakšna nomenklatura se uporablja za njegov opis, se lahko vprašamo o njegovih omejitvah.

Razumevanje naključnih gozdov

Kaj se zgodi z odločitvijo, če nekateri udeleženci živijo na meji med mestom in podeželjem? Bi drevo dodalo ta zapis k ruralnemu ali urbanemu? Zdi se, da je te podatke težko umestiti v strukturo, ki jo trenutno imamo, saj so dokaj jasni.

In kaj, če bi v raziskavi sodelovala ženska, ki živi na čolnu, ali bi to veljalo za ruralno ali urbano? Enako kot v prejšnjem primeru je razvrstitev podatkovne točke zahtevna glede na razpoložljive možnosti v drevesu.

Če malo bolj razmislimo o primeru odločitvenega drevesa, lahko vidimo, da lahko pravilno razvrsti nove podatke, če upoštevamo, da že sledijo vzorcu, ki ga drevo že ima – ko pa obstajajo zapisi, ki se razlikujejo od začetnih podatkov, ki so definirali drevo, drevesna struktura je preveč toga, zaradi česar zapisov ni mogoče klasificirati.

To pomeni, da je lahko odločitveno drevo strogo in omejeno v svojih možnostih. Idealno drevo odločitev bi bilo bolj prilagodljivo in bi lahko sprejelo več niansiranih nevidnih podatkov.

rešitev: Tako kot "dva para oči vidita bolje kot eden", dva modela običajno prideta do natančnejšega odgovora kot eden. Če upoštevamo raznolikost v predstavitvah znanja (kodiranih v drevesni strukturi), togost nekoliko različnih struktur med več podobnimi drevesi ni več tako omejujoča, saj lahko pomanjkljivosti enega drevesa »nadoknadi« drugo. Z združevanjem številnih drevesa skupaj dobimo a gozd.

Glede odgovora na začetno vprašanje že vemo, da bo zakodiran v drevesnih listih – a kaj se spremeni, ko imamo več dreves namesto enega?

Če so drevesa združena za razvrstitev, bo rezultat opredeljen z večino odgovorov, to se imenuje večinsko glasovanje; in v primeru regresije bo število, ki ga poda vsako drevo v gozdu povprečje.

Ansambelsko učenje in vzorni ansambli

Ta metoda je znana kot ansambelsko učenje. Pri učenju ansambla lahko pomešate poljubne algoritme, če lahko zagotovite, da je izhod mogoče razčleniti in združiti z drugimi izhodi (bodisi ročno ali z uporabo obstoječih knjižnic). Običajno združite več modelov iste vrste skupaj, na primer več odločitvenih dreves, vendar niste omejeni na samo združevanje skupin istega tipa modela.

Sestavljanje je praktično zagotovljen način za boljšo posplošitev problema in iztiskanje rahlega povečanja zmogljivosti. V nekaterih primerih združevanje modelov daje a pomemben povečanje napovedne moči, včasih pa le rahlo. To je odvisno od nabora podatkov, na katerem se usposabljate in ocenjujete, pa tudi od samih modelov.

Združevanje odločitvenih dreves daje rezultate pomemben izboljšanje zmogljivosti v primerjavi s posameznimi drevesi. Ta pristop je bil populariziran v raziskovalnih skupnostih in skupnostih za uporabno strojno učenje in je bil tako pogost, da so skupino odločitvenih dreves pogovorno poimenovali gozd, in običajna vrsta gozda, ki je nastajal (gozd odločitvenih dreves na naključni podmnožici funkcij), je popularizirala ime naključni gozdovi.

Glede na široko uporabo so knjižnice, kot je Scikit-Learn, implementirale ovoje za RandomForestRegressore in RandomForestClassifiers, zgrajena na vrhu njihovih lastnih implementacij odločitvenega drevesa, da se raziskovalcem omogoči, da se izognejo ustvarjanju lastnih skupin.

Potopimo se v naključne gozdove!

Kako deluje algoritem naključnega gozda?

Sledijo osnovni koraki pri izvajanju algoritma naključnega gozda:

  1. Izberite število naključnih zapisov, lahko je poljubno število, na primer 4, 20, 76, 150 ali celo 2.000 iz nabora podatkov (imenovanega N zapisi). Število bo odvisno od širine nabora podatkov, širši je, večji je N je lahko. Tukaj je naključno del v imenu algoritma izvira iz!
  2. Na podlagi tega zgradite drevo odločitev N naključni zapisi;
  3. Glede na število dreves, definiranih za algoritem, ali število dreves v gozdu ponovite koraka 1 in 2. To ustvari več dreves iz nizov naključnih podatkovnih zapisov;
  4. Po koraku 3 sledi zadnji korak, ki je predvidevanje rezultatov:
    • V primeru razvrščanja: vsako drevo v gozdu bo napovedalo kategorijo, v katero spada novi rekord. Po tem se nov zapis dodeli kategoriji, ki dobi večino glasov.
    • V primeru regresije: vsako drevo v gozdu napove vrednost za nov zapis, končna napovedna vrednost pa bo izračunana tako, da se vzame povprečje vseh vrednosti, ki jih napovedujejo vsa drevesa v gozdu.

Vsako drevo, ki se prilega naključni podmnožici funkcij, nujno ne bo imelo znanja o nekaterih drugih funkcijah, kar se popravi z združevanjem, pri čemer so računski stroški nižji.

Nasveti: Ker Random Forest uporablja drevesa odločanja kot osnovo, je zelo koristno razumeti, kako drevesa odločanja delujejo, in nekaj vaditi z njimi posamezno, da zgradite intuicijo na njihovi strukturi. Pri sestavljanju naključnih gozdov boste nastavljali vrednosti, kot je največja globina drevesa, najmanjše število vzorcev, potrebnih za listno vozlišče, merila za stavljanje, ki določajo notranje razcepe, itd., da bi pomagali skupini, da se bolje prilega nabor podatkov in posplošite na nove točke. V praksi boste običajno uporabljali naključne gozdove, gradientno povečanje ali ekstremno gradientno povečanje ali druge metodologije, ki temeljijo na drevesu, zato bo dobro razumevanje hiperparametrov enega samega odločitvenega drevesa pomagalo pri izgradnji močne intuicije za uglaševanje sklopov.

Z intuicijo o tem, kako drevesa delujejo, in razumevanjem naključnih gozdov – edina stvar, ki je preostala, je, da vadite njihovo gradnjo, usposabljanje in prilagajanje podatkov!

Gradnja in usposabljanje naključnih gozdnih modelov s Scikit-Learn

Do sedaj uporabljeni primeri vključujejo nosečnost, bivalni prostor in ženske z razlogom.

Leta 2020 so raziskovalci iz Bangladeša opazili, da je umrljivost med nosečnicami še vedno zelo visoka, zlasti če upoštevamo tiste, ki živijo na podeželju. Zaradi tega so uporabili sistem za spremljanje IOT analizirati tveganje za zdravje matere. Sistem IOT je zbral podatke iz različnih bolnišnic, skupnostnih klinik in zdravstvenih storitev za matere s podeželskih območij Bangladeša.

Zbrani podatki so bili nato organizirani v datoteko z vrednostmi, ločenimi z vejicami (csv) in naloženi v Repozitorij strojnega učenja UCI.

To so podatki, s katerimi bomo vadili in poskušali razumeti, ali ima nosečnica a nizka, srednje or visoko tveganje smrtnosti.

Opombe: nabor podatkov lahko prenesete tukaj.

Uporaba naključnega gozda za klasifikacijo

Ker želimo vedeti, ali ima ženska a nizka, srednje or visoko tveganje umrljivosti, to pomeni, da bomo izvedli klasifikacijo s tremi razredi. Če ima problem več kot dva razreda, se imenuje a večrazrednih problem, v nasprotju z a binarni problem (kjer običajno izbirate med dvema razredoma 0 in 1).

V tem prvem primeru bomo implementirali večrazredni klasifikacijski model s klasifikatorjem Random Forest in Pythonovim Scikit-Learnom.

Sledili bomo običajnim korakom strojnega učenja za rešitev te težave, ki so nalaganje knjižnic, branje podatkov, pregled povzetka statistike in ustvarjanje vizualizacij podatkov za boljše razumevanje. Nato predhodna obdelava in razdelitev podatkov, ki ji sledi generiranje, usposabljanje in vrednotenje modela.

Uvoz knjižnic

Uporabili bomo Pandas za branje podatkov, Seaborn in Matplotlib za vizualizacijo ter NumPy za odlične uporabne metode:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
Uvažanje nabora podatkov

Naslednja koda uvozi nabor podatkov in ga naloži v python DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

Če si želite ogledati prvih pet vrstic podatkov, izvedemo head() ukaz:

dataset.head()

To ustvari:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

Tukaj lahko vidimo vse atribute, zbrane med raziskavo.

  • Starost: starost v letih.
  • Sistolični krvni tlak: zgornja vrednost krvnega tlaka v mmHg, pomemben atribut med nosečnostjo.
  • Diastolični krvni tlak: nižja vrednost krvnega tlaka v mmHg, še ena pomembna lastnost med nosečnostjo.
  • BS: koncentracija glukoze v krvi glede na molsko koncentracijo, mmol/L.
  • HeartRate: srčni utrip v mirovanju v utripih na minuto.
  • RiskLevel: stopnja tveganja med nosečnostjo.
  • BodyTemp: telesna temperatura.

Zdaj, ko razumemo več o tem, kaj se meri, si lahko ogledamo vrste podatkov info():

dataset.info()

Rezultat tega je:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

Od pogleda na RangeIndex vrstico, vidimo, da je 1014 zapisov, in stolpec Non-Null Count sporoča, da podatki nimajo manjkajočih vrednosti. To pomeni, da nam manjkajočih podatkov ne bo treba obdelati!

v Dtype stolpcu, lahko vidimo vrsto vsake spremenljivke. trenutno, float64 stolpci tak BS in BodyTemp imajo številske vrednosti, ki se lahko razlikujejo v poljubnem obsegu, na primer 15.0, 15.51, 15.76, 17.28, zaradi česar so numerično zvezna (številu s plavajočo vejico lahko vedno dodate 0, ad infinitem). Po drugi strani pa spremenljivke kot npr Age, SystolicBP, DiastolicBPin HeartRate so vrste int64, to pomeni, da se številke spreminjajo samo po enotah, na primer 11, 12, 13, 14 – ne bomo imeli srčnega utripa 77.78, je 77 ali 78 – to so numerično diskretna vrednote. In tudi imamo RiskLevel z object tip, to običajno pomeni, da je spremenljivka besedilo in jo bomo verjetno morali pretvoriti v število. Ker stopnja tveganja raste od nizke do visoke, obstaja impliciran vrstni red v kategorijah, kar pomeni, da je kategorično redni spremenljivka.

Opombe: pomembno je pogledati vrsto vsakega podatka in preveriti, ali je smiseln glede na kontekst. Na primer, ni smiselno imeti polovice enote srčnega utripa, kar pomeni, da je tip interger primeren za diskretno vrednost. Ko se to ne zgodi, lahko spremenite vrsto podatkov s Pandas' astype() lastnina – df['column_name'].astype('type').

Ko si ogledamo vrste podatkov, lahko uporabimo describe() vzeti vrh pri nekaterih opisnih statistikah, kot so srednje vrednosti vsakega stolpca, standardna deviacija, kvantili, najmanjše in največje vrednosti podatkov:

dataset.describe().T 

Zgornja koda prikazuje:

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

Opazite, da je za večino stolpcev pomeni vrednote daleč od tega standardni odklon (std) – to pomeni, da podatki ne sledijo nujno pravilni statistični porazdelitvi. Če bi, bi modelu pomagalo pri napovedovanju tveganja. Tukaj je mogoče predhodno obdelati podatke, da bodo bolj reprezentativni, kot da bi šlo za podatke celotne svetovne populacije ali več normalizirano. Toda prednost pri uporabi modelov Random Forest za Razvrstitev, je, da lahko inherentna drevesna struktura dobro obravnava podatke, ki niso bili normalizirani, potem ko jih deli z vrednostjo na vsaki drevesni ravni za vsako spremenljivko.

Poleg tega, ker uporabljamo drevesa in bo dobljeni razred pridobljen z glasovanjem, po naravi ne primerjamo med različnimi vrednostmi, ampak samo med istimi vrstami vrednosti, zato prilagoditev funkcij na isto lestvico v tem primeru ni potrebna . To pomeni, da je klasifikacijski model Random Forest invariant merilain vam ni treba izvajati skaliranja funkcij.

V tem primeru je korak v predhodni obdelavi podatkov, ki ga lahko naredimo, transformacija kategoričnega RiskLevel stolpec v številski.

Vizualizacija podatkov

Pred preobrazbo RiskLevel, na hitro vizualizirajmo podatke tako, da si ogledamo kombinacije točk za vsak par funkcij z raztresenim grafikonom in kako so točke porazdeljene z vizualizacijo histogramske krivulje. Za to bomo uporabili Seabornov pairplot() ki združuje obe ploskvi. Ustvari oba grafa za vsako kombinacijo funkcij in prikaže točke, barvno kodirane glede na njihovo stopnjo tveganja z hue lastnost:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

Zgornja koda ustvari:

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Ko gledate risbo, bi bila idealna situacija jasna ločitev med krivuljami in pikami. Kot lahko vidimo, so trije tipi razredov tveganja večinoma pomešani, ker drevesa interno rišejo črte, ko razmejujejo prostore med točkami, lahko domnevamo, da bi lahko več dreves v gozdu omejilo več prostorov in bolje razvrstilo točke.

Z opravljeno osnovno raziskovalno analizo podatkov lahko predhodno obdelamo RiskLevel stolpec.

Predhodna obdelava podatkov za klasifikacijo

Zagotovo obstajajo samo trije razredi RiskLevel v naših podatkih in da nobena druga vrednost ni bila pomotoma dodana, lahko uporabimo unique() za prikaz edinstvenih vrednosti stolpca:

dataset['RiskLevel'].unique()

To ustvari:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

Razredi so preverjeni, naslednji korak je pretvorba vsake vrednosti v število. Ker obstaja vrstni red med klasifikacijami, lahko za označevanje uporabimo vrednosti 0, 1 in 2 nizka, srednje in visoko tveganja. Obstaja veliko načinov za spreminjanje vrednosti stolpcev, po Pythonu preprosto je bolje kot zapleteno moto, uporabili bomo .replace() in jih preprosto nadomestite z njihovimi celoštevilskimi predstavitvami:

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

Po zamenjavi vrednosti lahko podatke razdelimo na tiste, ki jih bomo uporabili za usposabljanje modela lastnosti or X, in kar želimo napovedati, nalepke or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

Ko X in y kompleti pripravljeni, lahko uporabimo Scikit-Learn's train_test_split() metodo za njihovo nadaljnjo razdelitev na nize za vlak in test:

from sklearn.model_selection import train_test_split

SEED = 42
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)

Nasvet: ne pozabite uporabiti semena naključnega stanja, če želite, da bo rezultat ponovljiv. Uporabili smo naključno seme stanja, tako da lahko reproducirate enake rezultate kot iz vodnika.

Tukaj uporabljamo 20 % podatkov za testiranje in 80 % za usposabljanje.

Usposabljanje RandomForestClassifier

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Scikit-Learn izvaja ansamble pod sklearn.ensemble modul. Kot RandomForestClassifier.

Če imamo vlak in preskusne komplete, jih lahko uvozimo RandomForestClassifier razreda in ustvarite model. Za začetek ustvarimo gozd s tremi drevesi z nastavitvijo n_estimators parameter kot 3 in z vsakim drevesom, ki ima tri ravni, z nastavitvijo max_depthdo 2:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

Opomba: Privzeta vrednost za n_estimators is 100. To poveča napovedno moč in posploševanje ansambla, vendar ustvarjamo manjšega, da bi ga lažje vizualizirali in pregledovali. S samo 3 drevesi – lahko jih vizualiziramo in pregledamo ročno za nadaljnjo izgradnjo naše intuicije o posameznih drevesih in njihovi soodvisnosti. Enako velja za max_depth, Ki je None, kar pomeni, da se drevesa lahko poglabljajo vse globlje, da ustrezajo zahtevanim podatkom.

Da model prilagodimo podatkom – imenujemo fit() metoda, vstavljanje funkcij in oznak za usposabljanje:


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

Zdaj lahko primerjamo predvidene oznake z dejanskimi oznakami, da ocenimo, kako uspešen je bil model! Preden ocenimo model, si oglejmo celoten ansambel.

Če želimo pogledati nekoliko globlje v model, lahko vizualiziramo vsako od dreves in kako delijo podatke. To lahko storite z uporabo tree modul, vgrajen v Scikit-Learn, in nato zanka skozi vsakega od ocenjevalcev v skupini:


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

Zgornja koda prikazuje drevesne ploskve:

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Opazite, kako so si tri drevesa različna. Prvi se začne z BS značilnost, druga z DiastolicBP, tretji pa z BS ponovno. Čeprav tretji gleda na drugačno število vzorcev. Na desni veji prvi dve drevesi prav tako odločata o uporabi Age na ravni listov, medtem ko se tretje drevo konča z BS funkcija. S samo tremi ocenjevalci je jasno, kako povečevanje daje bogato, raznoliko predstavitev znanja, ki ga je mogoče uspešno sestaviti v zelo natančen model.

Več kot je dreves v gozdu, bolj raznolik je lahko model. Vendar obstaja točka zmanjševanja donosov, tako kot pri mnogih drevesih, ki se prilegajo naključni podmnožici značilnosti, bo na voljo kar nekaj podobnih dreves, ki ne ponujajo veliko raznolikosti v skupini in ki bodo začela imeti preveč glasovalne moči in izkrivlja ansambel, da je preveč primeren za nabor podatkov o usposabljanju, kar škoduje posploševanju na nizu za validacijo.

Prej je bila postavljena hipoteza o tem, da bi imeli več dreves in kako bi to lahko izboljšalo rezultate modela. Oglejmo si rezultate, ustvarimo nov model in preverimo, ali hipoteza drži!

Vrednotenje RandomForestClassifier

Scikit-Learn olajša ustvarjanje izhodišč z zagotavljanjem a DummyClassifier, ki daje napovedi brez uporabe vnosnih funkcij (popolnoma naključni izhodi). Če je vaš model boljši od DummyClassifier, nekaj učenje se dogaja! Če želite povečati učenje – lahko samodejno preizkusite različne hiperparametre z uporabo a RandomizedSearchCV or GridSearchCV. Poleg izhodišča lahko ocenite zmogljivost svojega modela s pomočjo več meritev.

Nekatere tradicionalne klasifikacijske metrike, ki jih je mogoče uporabiti za ovrednotenje algoritma, so natančnost, priklic, rezultat f1, natančnost in matrika zmede. Tukaj je kratka razlaga vsakega od njih:

  1. Precision: ko je naš cilj razumeti, katere pravilne vrednosti napovedi je naš klasifikator štel za pravilne. Natančnost bo te prave pozitivne vrednosti delila z vzorci, ki so bili predvideni kot pozitivni;

$$
natančnost = frac{besedilo{resnični pozitivni}}{besedilo{resnični pozitivni} + besedilo{lažni pozitivni}}
$$

  1. Recall: običajno izračunano skupaj z natančnostjo, da bi razumeli, koliko resničnih pozitivnih rezultatov je identificiral naš klasifikator. Odpoklic se izračuna tako, da se resnični pozitivni učinki delijo s čimer koli, kar bi bilo predvideno kot pozitivno.

$$
odpoklic = frac{besedilo{resnični pozitivni}}{besedilo{resnični pozitivni} + besedilo{lažni negativni}}
$$

  1. Ocena F1: je uravnotežena oz harmonično srednjo vrednost natančnosti in odpoklica. Najnižja vrednost je 0, najvišja pa 1. Kdaj f1-score je enako 1, pomeni, da so bili vsi razredi pravilno predvideni – to je zelo težko doseči rezultat z resničnimi podatki (izjeme skoraj vedno obstajajo).

$$
besedilo{f1-rezultat} = 2* frac{besedilo{natančnost} * besedilo{priklic}}{besedilo{natančnost} + besedilo{priklic}}
$$

  1. Matrica zmede: ko moramo vedeti, za koliko vzorcev smo dobili pravilne ali napačne vsak razred. Pokličemo vrednosti, ki so bile pravilne in pravilno napovedane resnično pozitivni, se imenujejo tiste, ki so bile napovedane kot pozitivne, vendar niso bile pozitivne lažno pozitivno. Ista nomenklatura prave negative in lažno negativnih uporablja se za negativne vrednosti;

  2. natančnost: opisuje, koliko napovedi je imel naš klasifikator pravilnih. Najnižja vrednost natančnosti je 0, najvišja pa 1. To vrednost običajno pomnožimo s 100, da dobimo odstotek:

$$
natančnost = frac{besedilo{število pravilnih napovedi}}{besedilo{skupno število napovedi}}
$$

Opomba: Praktično je nemogoče pridobiti 100-odstotno natančnost pri resničnih podatkih, za katere bi želeli uporabiti strojno učenje. Če vidite klasifikator s 100-odstotno natančnostjo ali celo skoraj 100-odstotni rezultat – bodite skeptični in izvedite vrednotenje. Pogost vzrok za te težave je uhajanje podatkov (neposredno ali posredno uhajanje dela testa usposabljanja v testni niz). Ni soglasja o tem, kaj je "dobra natančnost", predvsem zato, ker je odvisna od vaših podatkov – včasih bo 70-odstotna natančnost visoka! Včasih bo to zelo nizka natančnost. Na splošno, več kot 70 % zadostuje za številne modele, vendar to določi raziskovalec domene.

Za uvoz potrebnih knjižnic in ogled rezultatov lahko izvedete naslednji skript:

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

Izhod bo videti nekako takole:

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

V poročilu o klasifikaciji opazite, da je priklic visok, 0.89 za razred 0, tako natančnost kot priklic sta visoka za razred 2, 0.74, 0.72 – in za razred 1 sta nizka, zlasti priklic 0.17 in natančnost 0.57 . Razmerje med priklicem in natančnostjo za vse tri razrede posamezno je zajeto v F1 rezultat, ki je harmonična sredina med priklicem in natančnostjo – model deluje ok za razred 0, dokaj slabo za razred 1 in spodobno za razred 2.

Model ima zelo težave pri prepoznavanju primeri srednjega tveganja.

Natančnost, ki jo dosega naš naključni gozdni klasifikator s samo 3 drevesi, je 0.58 (58 %) – to pomeni, da dobi nekaj več kot polovico pravilnih rezultatov. To je nizka natančnost in morda bi jo lahko izboljšali z dodajanjem več dreves.

Če pogledamo matriko zmede, lahko vidimo, da je večina napak pri razvrščanju 52 zapisov srednjega tveganja kot nizkega tveganja, kar daje nadaljnji vpogled v nizek priklic razreda 1. Pristransko je k razvrščanju bolnikov s srednjim tveganjem kot nizko- rizičnimi bolniki.

Druga stvar, ki jo je mogoče preveriti, da ustvarimo še večji vpogled, je, katere značilnosti klasifikator najbolj upošteva pri napovedovanju. To je pomemben korak za razložljivi sistemi strojnega učenja, in pomaga prepoznati in ublažiti pristranskost v modelih.

Da bi to videli, lahko dostopamo do feature_importances_ lastnost klasifikatorja. To nam bo dalo seznam odstotkov, tako da bomo lahko dostopali tudi do feature_names_in_ lastnost, da dobite ime vsake funkcije, jih organizirate v podatkovnem okviru, razvrstite od najvišjega do najnižjega in narišete rezultat:


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Opazite, kako klasifikator večinoma upošteva krvni sladkor, nato nekaj diastoličnega tlaka, telesne temperature in le malo starosti za odločitev, to je lahko tudi povezano z nizkim priklicem v razredu 1, morda so podatki o srednjem tveganju povezani s funkcijami, ki niso model zelo upošteva. Lahko se poskusite bolj poigrati s pomembnostjo funkcij, da to raziščete in ugotovite, ali spremembe modela vplivajo na uporabljene funkcije, tudi, ali obstaja pomembno razmerje med nekaterimi funkcijami in predvidenimi razredi.

Končno je prišel čas za ustvarjanje novega modela z več drevesi, da vidimo, kako to vpliva na rezultate. Ustvarimo rfc_ gozd z 900 drevesi, 8 nivoji in enakim semenom. Se bodo rezultati izboljšali?

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

Izračun in prikaz meritev:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

To ustvari:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

To kaže, kako je dodajanje več dreves in bolj specializiranih dreves (višje ravni) izboljšalo naše meritve. Še vedno imamo nizek priklic za razred 1, vendar je natančnost zdaj 74-odstotna. Ocena F1 pri razvrščanju primerov z visokim tveganjem je 0.85, kar pomeni, da je primere z visokim tveganjem zdaj lažje identificirati v primerjavi z 0.73 v prejšnjem modelu!

Pri vsakodnevnem projektu je morda bolj pomembno prepoznati primere z visokim tveganjem, na primer z metriko, podobno natančnosti, ki je znana tudi kot občutljivost v statistiki. Poskusite prilagoditi nekatere parametre modela in opazujte rezultate.

Do zdaj smo pridobili splošno razumevanje, kako je mogoče uporabiti Random Forest za razvrščanje podatkov – v naslednjem razdelku lahko uporabimo isti nabor podatkov na drugačen način, da vidimo, kako isti model napoveduje vrednosti z regresijo.

Uporaba naključnih gozdov za regresijo

V tem razdelku bomo preučili, kako lahko algoritem Random Forest uporabimo za reševanje problemov regresije z uporabo Scikit-Learn. Koraki, ki sledijo za implementacijo tega algoritma, so skoraj enaki korakom, izvedenim za klasifikacijo, poleg vrste modela in vrste predvidenih podatkov – to bodo zdaj neprekinjene vrednosti – obstaja le ena razlika v pripravi podatkov.

Ker je regresija narejena za številčne vrednosti – izberimo številsko vrednost iz nabora podatkov. Videli smo, da je bil krvni sladkor pomemben pri razvrstitvi, zato bi moral biti predvidljiv na podlagi drugih lastnosti (ker če je v korelaciji z neko značilnostjo, je tudi ta lastnost v korelaciji z njo).

Po tem, kar smo naredili za klasifikacijo, najprej uvozimo knjižnice in isti nabor podatkov. Če ste to že naredili za klasifikacijski model, lahko ta del preskočite in greste neposredno na pripravo podatkov za usposabljanje.

Uvažanje knjižnic in podatkov
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
Predobdelava podatkov za regresijo

To je regresijska naloga, tako da lahko namesto napovedovanja razredov napovemo enega od številskih stolpcev nabora podatkov. V tem primeru je BS stolpec bo predviden. To pomeni y podatki bodo vsebovali podatke o krvnem sladkorjuin X podatki bodo vsebovali vse funkcije poleg krvnega sladkorja. Po ločitvi X in y podatkov, lahko razdelimo vlak in preskusne nize:

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
Usposabljanje RandomForestRegressorja

Zdaj, ko smo povečali naš nabor podatkov, je čas, da usposobimo naš algoritem za reševanje tega problema regresije, da ga nekoliko spremenimo – ustvarili bomo model z 20 drevesi v gozdu in vsako s 4 ravnmi. Če želite to narediti, lahko izvedete naslednjo kodo:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

Najdete lahko podrobnosti za vse parametre RandomForestRegressor v uradni dokumentaciji.

Ker bi izris in ogled 20 dreves zahteval nekaj časa in predanosti, lahko izrišemo samo prvo, da si ogledamo, kako se razlikuje od klasifikacijskega drevesa:

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Upoštevajte, da ima regresijsko drevo podatkom že dodeljeno vrednost, ki spada na vsako vozlišče. To so vrednosti, ki bodo povprečene pri združevanju 20 dreves. Po tem, kar smo naredili s klasifikacijo, lahko narišete tudi pomembnosti funkcij, da vidite, katere spremenljivke regresijski model bolj upošteva pri izračunu vrednosti.

Čas je, da nadaljujete do zadnjega in zadnjega koraka pri reševanju problema strojnega učenja in ocenite delovanje algoritma!

Ocenjevanje RandomForestRegressorja

Za regresijske težave so metrike, uporabljene za vrednotenje algoritma, povprečna absolutna napaka (MAE), povprečna kvadratna napaka (MSE) in koren povprečne kvadratne napake (RMSE).

  1. Povprečna absolutna napaka (MAE): ko odštejemo napovedane vrednosti od dejanskih vrednosti, dobimo napake, seštejemo absolutne vrednosti teh napak in dobimo njihovo povprečje. Ta metrika daje predstavo o skupni napaki za vsako napoved modela, manjša kot je (bližje 0), tem bolje.

$$
mae = (frac{1}{n})sum_{i=1}^{n}left | Dejansko – Predvidena pravica |
$$

Opomba: Morda boste naleteli tudi na y in ŷ zapis v enačbah. The y se nanaša na dejanske vrednosti in ŷ na predvidene vrednosti.

  1. Povprečna kvadratna napaka (MSE): podobna je metriki MAE, vendar kvadrira absolutne vrednosti napak. Poleg tega, tako kot pri MAE, manjši kot je ali bližje 0, tem bolje. Vrednost MSE je kvadrirana, da so velike napake še večje. Ena stvar, na katero je treba biti zelo pozoren, je, da je metriko običajno težko razlagati zaradi velikosti njenih vrednosti in dejstva, da niso v istem obsegu podatkov.

$$
mse = vsota_{i=1}^{D}(dejansko – predvideno)^2
$$

  1. Koren srednje kvadratne napake (RMSE): poskuša rešiti problem razlage, ki se pojavi pri MSE, tako da dobi kvadratni koren njegove končne vrednosti, da bi jo prilagodil nazaj na iste enote podatkov. Lažje je interpretirati in dobro, ko moramo prikazati ali pokazati dejansko vrednost podatka z napako. Prikazuje, koliko se lahko podatki razlikujejo, tako da, če imamo RMSE 4.35, lahko naš model naredi napako bodisi zato, ker je dejanski vrednosti dodal 4.35 ali pa potrebuje 4.35, da pride do dejanske vrednosti. Bližje kot je 0, tem bolje.

$$
rmse = sqrt{ vsota_{i=1}^{D}(dejansko – predvideno)^2}
$$

Uporabimo lahko katero koli od teh treh metrik primerjate modeli (če ga moramo izbrati). Lahko tudi primerjamo isti regresijski model z različnimi vrednostmi argumentov ali z različnimi podatki in nato upoštevamo metriko vrednotenja. To je znano kot uglaševanje hiperparametrov – prilagajanje hiperparametrov, ki vplivajo na učni algoritem in opazovanje rezultatov.

Pri izbiri med modeli se običajno bolje obnesejo tisti z najmanjšimi napakami. Če so se pri spremljanju modelov meritve poslabšale, je bila prejšnja različica modela boljša ali pa je prišlo do pomembne spremembe v podatkih, da je model deloval slabše, kot je bil.

Za iskanje teh vrednosti lahko uporabite naslednjo kodo:

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

Izhod naj bo:

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

Pri 20 drevesih je povprečna kvadratna napaka 1.75, kar je nizko, a kljub temu – s povečanjem števila dreves in eksperimentiranjem z drugimi parametri bi se ta napaka verjetno lahko še zmanjšala.

Prednosti uporabe naključnega gozda

Kot pri vsakem algoritmu ima tudi njegova uporaba prednosti in slabosti. V naslednjih dveh razdelkih si bomo ogledali prednosti in slabosti uporabe naključnega gozda za klasifikacijo in regresijo.

  1. Algoritem naključnega gozda ni pristranski, saj obstaja več dreves in vsako drevo je usposobljeno za naključno podmnožico podatkov. V bistvu se algoritem naključnega gozda opira na moč "množice"; zato je splošna stopnja pristranskosti algoritma zmanjšana.
  2. Ta algoritem je zelo stabilen. Tudi če je v naboru podatkov uvedena nova podatkovna točka, to ne vpliva veliko na celoten algoritem, saj lahko novi podatki vplivajo na eno drevo, vendar je zelo težko vplivati ​​na vsa drevesa.
  3. Algoritem naključnega gozda dobro deluje, če imate tako kategorične kot numerične značilnosti.
  4. Algoritem naključnega gozda dobro deluje tudi, če podatki vsebujejo manjkajoče vrednosti ali niso prilagojeni.

Slabosti uporabe naključnega gozda

  1. Glavna pomanjkljivost naključnih gozdov je njihova kompleksnost. Zahtevajo veliko več računalniških sredstev zaradi velikega števila združenih odločitvenih dreves pri usposabljanju velikih skupin. Vendar – s sodobno strojno opremo usposabljanje tudi velikega naključnega gozda ne vzame veliko časa.

Naprej – ročni projekt od konca do konca

Ali zaradi vaše radovedne narave želite iti dlje? Priporočamo, da si ogledate naše Vodeni projekt: »Praktično napovedovanje cen nepremičnin – strojno učenje v Pythonu«.

Dokončni vodnik po algoritmu Random Forest s Pythonom in Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

V tem vodenem projektu – naučili se boste, kako zgraditi zmogljive tradicionalne modele strojnega učenja in modele globokega učenja, uporabiti Ensemble Learning in učiti meta-učence za napovedovanje cen stanovanj iz vreče modelov Scikit-Learn in Keras.

Z uporabo Kerasa, API-ja za globoko učenje, zgrajenega na Tensorflowu, bomo eksperimentirali z arhitekturami, zgradili skupino zloženih modelov in usposobili meta-učenec nevronsko mrežo (model ravni 1), da ugotovimo ceno hiše.

Globoko učenje je neverjetno – a preden se zatečete k njemu, je priporočljivo poskusiti težavo rešiti tudi s preprostejšimi tehnikami, kot je npr. plitko učenje algoritmi. Naša osnovna uspešnost bo temeljila na a Naključna gozdna regresija algoritem. Poleg tega – raziskali bomo ustvarjanje sklopov modelov prek Scikit-Learn s tehnikami, kot je npr. vrečanje v vreče in glasovanje.

To je projekt od konca do konca in kot pri vseh projektih strojnega učenja bomo tudi mi začeli z – s Raziskovalne analize podatkov, sledi Predobdelava podatkov in končno Plitvo gradnje in Modeli globokega učenja da ustrezajo podatkom, ki smo jih predhodno raziskali in očistili.

Časovni žig:

Več od Stackabuse