Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Hankige Pythoni ja Scikit-Learni abil juhuslike metsade funktsioonide tähtsus

Sissejuhatus

. Juhuslik mets Algoritm on puupõhine juhendatud õppealgoritm, mis kasutab andmepunkti klassifitseerimiseks või selle ligikaudse väärtuse määramiseks paljude otsustuspuude ennustuste ansamblit. See tähendab, et seda saab kasutada kas klassifitseerimiseks või regressiooniks.

Klassifikatsiooni taotlemisel valitakse andmepunkti klass puude poolt enim hääli saanud klassi alusel; ja regressiooni puhul on andmepunkti väärtus kõigi puude poolt väljastatud väärtuste keskmine.

Juhuslike metsade kasutamisel on oluline meeles pidada, et puude arv on hüperparameeter ja see defineeritakse enne mudeli käivitamist.

Andmeteaduses töötades võis üks põhjusi, miks konkreetse projekti jaoks Random Foresti mudel valiti, olla seotud võimega vaadelda ühendatud puid ja mõista miks tehti klassifikatsioon või miks anti väärtus – seda nimetatakse seletatavus.

Arvestades puupõhiseid algoritme, saab mudelit selgitada mitmel viisil, kuvades ja vaadates iga puud (võib olla raske, kui mudelis on 200 või enam puud), kasutades Shapley (või SHAP) väärtused, vaadeldes funktsioone, mida mudel kõige enam arvesse võttis, kasutades LUBI mudeli sisendi ja väljundi vaheliste seoste uurimiseks jne. Tavaliselt kasutatakse kõigi meetodite kombinatsiooni.

Selles kiirjuhendis keskendume diagrammi loomisele omadustest, mida peeti mudeli jaoks oluliseks pingviinide klassifitseerimisel. Seda tuntakse kui uurimist funktsiooni tähtsus, ja seda saab edastada teistele meeskonnaliikmetele (tehnilistele ja mittetehnilistele), et anda ülevaade otsuste tegemisest.

Selleks impordime vajalikud teegid, laadime Palmer Penguinsi andmestiku, jagame andmed, loome mudeli, hankime funktsioonide tähtsused ja kasutame nende joonistamiseks Seaborni! Andmete, EDA või mudeli enda kohta me palju ei süvene – need on spetsiaalse juhendi teemad.

Märge: Andmestiku saate alla laadida aadressilt GitHub või otse koodist.

Raamatukogude importimine

Alustame mõne kasutatava teegi importimisega:


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)

Andmete tükeldamine

Jagame andmed koolituse ja testimise jaoks:


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)

Funktsiooni tähtsuse saamine

Lõpuks saame koolitada mudeli ja eksportida funktsioonide tähtsuse:


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

See annab väljundi:

array([0.41267633, 0.30107056, 0.28625311])

Need on funktsiooni väärtused, funktsioonide nimede nägemiseks käivitage:


rf.feature_names_in_

Selle tulemuseks on igale funktsioonile vastav nimi:

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

See tähendab, et selle konkreetse mudeli peviiniklasside määramisel oli kõige olulisem omadus bill_length_mm!

Tähtsus sõltub sellest, kui hästi andmed igas sõlmejaotuses eraldatakse – sel juhul annab mõõdu Gini indeks – gini väärtust kaalutakse seejärel selle järgi, mitu rida on funktsiooni kasutamisel poolitatud bill_length_mm funktsioon ja keskmine ansambli 100 puu kohta. Nende sammude tulemus arvestab 0.41267633, või antud juhul rohkem kui 40%.

Funktsiooni tähtsuse visualiseerimine

Levinud viis tähtsuse väärtuste esindamiseks on ribavestluste kasutamine. Loome esmalt andmeraami funktsioonide nimede ja nende vastava tähtsusega ning seejärel visualiseerime need Seaborni 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);                          

Nõuanne: Hea tava teabe esitamisel on järjestada väärtused kas kasvavas või kahanevas järjekorras. Sel juhul on andmed juba järjestatud, kusjuures esimene väärtus on esimene, mida me teada tahame. Kui see nii ei ole, saate andmeraami tellida sort_values. Seda saab teha mis tahes veerus kasvavas või kahanevas järjekorras: importances_df.sort_values(by="importances", ascending=False).

Seda esimest süžeed vaadates on raskem tõlgendada iga funktsiooni tähtsuse väärtust. On ilmne, et arve pikkus on suurem kui ülejäänud kaks riba, kuid mitte täpselt bill_depth_mm on samaväärne 0.30107056, ja et flipper_length_mm on 0.28625311. Seega saab seda esimest diagrammi parandada, kuvades iga riba väärtuse. Seda saab teha Seaborni juurde pääsedes containers objektiks. See salvestab iga riba teabe ja edastab väärtused ribasiltidena:

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

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)

Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Nüüd näeme iga tähtsuse väärtust selgelt või peaaegu selgelt, sest bill_length_mm väärtust lõigatakse vertikaalse joonega, mis on osa diagrammi välispiirist. Piire kasutatakse ala ümbritsemiseks, et sellele rohkem tähelepanu pöörata, kuid sel juhul ei pea me ümbritsema, kuna on ainult üks graafik. Eemaldame äärise ja parandame numbrite loetavust:

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)

Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Diagrammi näib olevat lihtsam lugeda, kuid X-teljel olevad linnukesed näivad ujuvat ja meil on juba väärtused koos tulpadega, nii et saame eemaldada 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)

Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Pange tähele, et pärast linnukeste eemaldamist on Y- ja X-märgised veidi raskesti loetavad. Y-märgis, feature_names, on vertikaalne ja X-teljel on ainult importances. Kuna pealkiri juba ütleb, et diagramm on Funktsioonide tähtsus, saame eemaldada ka teljesildid:

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)

Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Näete, kuidas see diagramm on puhtam, hõlpsasti loetav ja arusaadav, kui võrrelda seda esimesega. On veel asju, mida saame teha. Jälgige, et numbrid oleksid tõesti tulpade lähedal, oleks lihtsam lugeda, kui nende vahel oleks natuke rohkem ruumi.

Teine element selles süžees on värvid, kontrastsete värvide kasutamisel annab see edasi idee eraldatusest, vastupidi, kui kasutatakse sarnaseid värve, edastavad need ühtsuse või terviku osade ideed. Kuna kõik funktsioonid on osa pingviinidest, saame kasutada värve, mis muudavad iga riba eristatavaks, säilitades samal ajal ühtsuse:

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) 

Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Kui soovite tulemusi veelgi otsesemaks muuta, võite muuta pealkirja ja lisada järelduse. Teada on see, et varem käsitletud kriteeriumide kohaselt peeti kõige olulisemaks tunnuseks arve pikkust. See võib olla esimene teave inimesele, kes süžeed vaatab, võiksime nii öelda pingviini nobe pikkus oli Random Forest (RF) baasmudeli liikide klassifitseerimisel kõige olulisem tunnus :

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)

See on funktsioonide tähtsuse diagrammi lõpptulemus:

Hankige Pythoni ja Scikit-Learn PlatoBlockchaini andmeluure abil juhuslike metsade funktsioonide tähtsus. Vertikaalne otsing. Ai.

Järeldus

Selles juhendis – oleme loonud juhusliku metsaklassifikaatori – ja uurisime funktsioonide tähtsust, mida kasutati mudeli koolitamiseks, et selgitama mida mudel on õppinud ja mis mõjutab selle arutluskäiku.

Ajatempel:

Veel alates Stackabus