Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn

Introduktion

Tilfældig Skov algoritme er en træbaseret overvåget læringsalgoritme, der bruger et ensemble af forudsigelser af mange beslutningstræer, enten til at klassificere et datapunkt eller bestemme dets omtrentlige værdi. Det betyder, at den enten kan bruges til klassificering eller regression.

Når der ansøges om klassificering, vælges datapunktets klasse baseret på den klasse, der blev stemt flest af af træerne; og når det anvendes til regression, er værdien af ​​datapunktet gennemsnittet af alle værdier, der udlæses af træerne.

En vigtig ting at huske, når du bruger Random Forests, er, at antallet af træer er en hyperparameter, og det vil blive defineret, før du kører modellen.

Når du arbejder med datavidenskab, kan en af ​​grundene til, at en Random Forest-model blev valgt til et specifikt projekt, have at gøre med evnen til at se på sammensatte træer og forstå hvorfor der blev foretaget en klassificering, eller hvorfor en værdi blev givet – dette kaldes forklarlighed.

I betragtning af træbaserede algoritmer kan forsøg på at forklare en model gøres på flere måder, ved at vise og se på hvert træ (kan være svært, hvis modellen har 200 træer eller flere), vha. Shapley (eller SHAP) værdier, ser på de funktioner, der blev taget mest i betragtning af modellen, vha CITRON at undersøge sammenhænge mellem modelinput og output osv. Normalt anvendes en kombination af alle metoder.

I denne hurtige guide vil vi fokusere på at lave et diagram over de funktioner, der blev anset for at være vigtige for, at modellen kunne træffe en beslutning, når den klassificerede pingviner. Dette er kendt som at undersøge egenskabens betydning, og kan formidles til andre medlemmer af teamet (tekniske og ikke-tekniske) for at give et indblik i, hvordan beslutninger træffes.

For at gøre dette, lad os importere de nødvendige biblioteker, indlæse Palmer Penguins-datasættet, opdele dataene, skabe modellen, indhente funktionernes betydning og bruge Seaborn til at plotte dem! Vi vil ikke dykke meget ned i dataene, EDA eller selve modellen – det er emnet for den dedikerede guide.

Bemærk: Du kan downloade datasættet fra GitHub eller direkte fra koden.

Import af biblioteker

Lad os starte med at importere et par biblioteker, som vi skal bruge:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

Opdeling af data

Lad os opdele dataene til træning og test:


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


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

Opnåelse af funktioners betydning

Endelig – vi kan træne en model og eksportere funktionernes vigtighed med:


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

Dette udsender:

array([0.41267633, 0.30107056, 0.28625311])

Det er funktionsværdierne, for at se funktionsnavne, kør:


rf.feature_names_in_

Dette resulterer i det tilsvarende navn på hver funktion:

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

Dette betyder, at den vigtigste funktion for at bestemme pegvinklasser for denne særlige model var bill_length_mm!

Vigtigheden er i forhold til målet for, hvor godt dataene adskilles i hver nodeopdeling - i dette tilfælde er målet givet af Gini -indeks – Gini-værdien vægtes så med, hvor mange rækker der er blevet delt ved brug af bill_length_mm indslag og gennemsnit over de 100 træer i ensemblet. Resultatet af disse trin står for 0.41267633eller mere end 40 % i dette tilfælde.

Visualisering af funktions betydning

En almindelig måde at repræsentere vigtige værdier på er ved at bruge bar-chat. Lad os først oprette en dataramme med funktionsnavnene og deres tilsvarende betydning, og derefter visualisere dem ved hjælp af Seaborns barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

Rådgivning: En god praksis ved præsentation af information er at ordne værdier enten i stigende eller faldende rækkefølge. I dette tilfælde er dataene allerede bestilt, hvor den første værdi er den første, vi vil vide. Når dette ikke er tilfældet, kan du bestille datarammen med sort_values. Dette kan gøres på enhver kolonne i stigende eller faldende rækkefølge: importances_df.sort_values(by="importances", ascending=False).

Når man ser på dette første plot, er det sværere at fortolke værdien af ​​hver funktions betydning. Det er tydeligt, at styklængden er større end de to andre stænger, men ikke ligefrem bill_depth_mm svarer til 0.30107056, og at flipper_length_mm er 0.28625311. Så dette første diagram kan forbedres ved at vise værdien af ​​hver søjle. Dette kan gøres ved at få adgang til Seaborn's containers objekt. Den gemmer hver søjleinformation og sender værdierne som søjlemærker:

Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Nu kan vi se hver vigtighedsværdi klart eller næsten tydeligt, fordi bill_length_mm værdien skæres af en lodret linje, der er en del af diagrammets ydre kant. Kanter bruges til at omslutte et område som et middel til at fokusere mere opmærksomhed på det, men i dette tilfælde behøver vi ikke at omslutte, fordi der kun er én graf. Lad os fjerne grænsen og forbedre tallenes læsbarhed:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Diagrammet virker lettere at læse, men fluebenene på X-aksen ser ud til at være flydende, og vi har allerede værdierne sammen med søjlerne, så vi kan fjerne xticks:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Læg mærke til, hvordan Y- og X-etiketterne er lidt svære at læse efter at have fjernet. Y-mærket, feature_names, er lodret og i X-aksen er der kun importances. Da titlen allerede siger, at diagrammet er af Betydning af funktioner, kan vi også fjerne aksemærkaterne:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Du kan se, hvordan dette diagram er renere, let at læse og forstå, når du sammenligner med det første. Der er stadig nogle ting, vi kan gøre. Bemærk, at tallene er virkelig tæt på søjlerne, det ville være lettere at læse, hvis der var lidt mere mellemrum mellem dem.

Et andet element i dette plot er farverne, når der bruges kontrastfarver, overfører det en idé om adskillelse, omvendt, når der bruges lignende farver, kommunikerer de en idé om enhed eller dele af en helhed. Da funktionerne alle er en del af pingviner, kan vi bruge en farve, der gør hver bjælke distinkt og samtidig bevare enhed:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Hvis du vil gøre resultaterne endnu mere direkte, kan du ændre titlen og tilføje konklusionen. Hvad man ved er, at regningslængden blev betragtet som den vigtigste egenskab i henhold til de kriterier, vi tidligere har diskuteret. Dette kan være den første information for nogen, der ser på plottet, det kunne vi sige pingvinens nævlængde var den vigtigste egenskab for artsklassificering i Random Forest (RF) basismodellen :

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

Dette er det endelige resultat af diagrammet over funktioners betydning:

Få vigtige funktioner til tilfældige skove med Python og Scikit-Learn PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Konklusion

I denne vejledning – vi har bygget en Random Forest Classifier – og inspiceret de funktioner, der blev brugt til at træne modellen i et forsøg på at forklare hvad en model har lært, og hvad der påvirker dens ræsonnement.

Tidsstempel:

Mere fra Stablemisbrug