Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Hanki satunnaisten metsien ominaisuuksien tärkeys Pythonin ja Scikit-Learnin avulla

esittely

- Satunnainen metsä Algoritmi on puupohjainen valvottu oppimisalgoritmi, joka käyttää useiden päätöspuiden ennusteita joko datapisteen luokittelemiseen tai sen likimääräisen arvon määrittämiseen. Tämä tarkoittaa, että sitä voidaan käyttää joko luokitukseen tai regressioon.

Luokittelua haettaessa datapisteen luokka valitaan puiden eniten äänestämän luokan perusteella; ja kun sitä sovelletaan regressioon, datapisteen arvo on kaikkien puiden antamien arvojen keskiarvo.

Random Forestsia käytettäessä on tärkeää muistaa, että puiden lukumäärä on hyperparametri ja se määritellään ennen mallin ajoa.

Datatieteen parissa työskennellessä yksi syy siihen, miksi tiettyyn projektiin valittiin Random Forest -malli, saattaa liittyä kykyyn tarkastella ryhmiteltyjä puita ja ymmärtää miksi luokittelu tehtiin tai miksi arvo annettiin – tätä kutsutaan selitettävyys.

Kun otetaan huomioon puupohjaiset algoritmit, mallin selittäminen voidaan tehdä useilla tavoilla näyttämällä ja katsomalla jokainen puu (voi olla vaikeaa, jos mallissa on 200 puuta tai enemmän), käyttämällä Shapleyn (tai SHAP) arvot, tarkastellaan ominaisuuksia, jotka malli otti eniten huomioon, käyttämällä Lime mallin syötteen ja lähdön välisten suhteiden tutkimiseen jne. Yleensä käytetään kaikkien menetelmien yhdistelmää.

Tässä pikaoppaassa keskitymme luomaan kaavion ominaisuuksista, joita pidettiin tärkeimpänä mallin kannalta päätöksenteossa pingviinien luokittelussa. Tämä tunnetaan tutkivana ominaisuuden merkitys, ja se voidaan välittää muille (teknisille ja ei-teknisille) tiimin jäsenille, jotta he voivat nähdä, miten päätökset tehdään.

Tätä varten tuodaan tarvittavat kirjastot, ladataan Palmer Penguins -tietojoukko, jaetaan tiedot, luodaan malli, hankitaan ominaisuuksien tärkeys ja piirretään ne Seabornilla! Emme perehdy paljoa tietoihin, EDA:han tai itse malliin – ne ovat omistetun oppaan aiheita.

Huomautus: Voit ladata tietojoukon osoitteesta GitHub tai suoraan koodista.

Kirjastojen tuominen

Aloitetaan tuomalla muutama kirjasto, joita käytämme:


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)

Tietojen jakaminen

Jaetaan tiedot harjoittelua ja testausta varten:


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)

Ominaisuuden tärkeyden hankkiminen

Lopuksi – voimme kouluttaa mallin ja viedä ominaisuuksien tärkeydestä seuraavilla tavoilla:


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

Tämä tuottaa:

array([0.41267633, 0.30107056, 0.28625311])

Nämä ovat ominaisuuden arvot. Näet ominaisuuksien nimet suorittamalla:


rf.feature_names_in_

Tästä seuraa kunkin ominaisuuden vastaava nimi:

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

Tämä tarkoittaa, että tärkein ominaisuus peguiiniluokkien päättämisessä tälle mallille oli bill_length_mm!

Tärkeys on suhteessa sen mittaan, kuinka hyvin data erotetaan kussakin solmujaossa – tässä tapauksessa mittarin antaa Gini -indeksi – gini-arvoa painotetaan sitten sillä, kuinka monta riviä on jaettu käytettäessä bill_length_mm ominaisuus ja keskiarvo yhtyeen 100 puulle. Näiden vaiheiden tulos selittää 0.41267633tai tässä tapauksessa yli 40 %.

Ominaisuuden tärkeyden visualisointi

Yleinen tapa esittää tärkeitä arvoja on käyttää baarikeskusteluja. Luodaan ensin tietokehys ominaisuuksien nimillä ja niitä vastaavilla tärkeydellä ja visualisoidaan ne sitten Seabornin avulla. 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);                          

Neuvo: Hyvä käytäntö tiedon esittämisessä on järjestää arvot joko nousevaan tai laskevaan järjestykseen. Tässä tapauksessa tiedot on jo järjestetty, ja ensimmäinen arvo on ensimmäinen, jonka haluamme tietää. Jos näin ei ole, voit tilata datakehyksen sort_values. Tämä voidaan tehdä missä tahansa sarakkeessa nousevassa tai laskevassa järjestyksessä: importances_df.sort_values(by="importances", ascending=False).

Kun tarkastellaan tätä ensimmäistä juonia, on vaikeampi tulkita kunkin ominaisuuden tärkeyden arvoa. On selvää, että laskun pituus on suurempi kuin kaksi muuta palkkia, mutta ei aivan sitä bill_depth_mm vastaa 0.30107056, ja että flipper_length_mm on 0.28625311. Joten tätä ensimmäistä kaaviota voidaan parantaa näyttämällä kunkin palkin arvo. Tämä voidaan tehdä avaamalla Seaborn's containers esine. Se tallentaa jokaisen pylvään tiedot ja välittää arvot palkkiotsikoina:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

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)

Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Nyt voimme nähdä jokaisen tärkeysarvon selvästi tai melkein selvästi, koska bill_length_mm arvoa leikataan pystyviivalla, joka on osa kaavion ulkoreunaa. Reunuksia käytetään rajaamaan alue, jotta siihen voidaan kiinnittää enemmän huomiota, mutta tässä tapauksessa meidän ei tarvitse sulkea sitä, koska kaavioita on vain yksi. Poistetaan reunus ja parannetaan numeroiden luettavuutta:

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)

Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Kaavio näyttää helpommin luettavalta, mutta X-akselin rastit näyttävät kelluvan ja meillä on jo arvot pylväiden kanssa, joten voimme poistaa 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)

Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Huomaa, kuinka rastien poistamisen jälkeen Y- ja X-tarroja on hieman vaikea lukea. Y-merkki, feature_names, on pystysuora ja X-akselilla on vain importances. Koska otsikossa jo todetaan, että kaavio on Ominaisuuden tärkeys, voimme myös poistaa akselimerkinnät:

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)

Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Voit nähdä, kuinka tämä kaavio on selkeämpi, helppolukuisempi ja ymmärrettävä, kun vertaat ensimmäiseen. Vielä on joitain asioita, joita voimme tehdä. Huomaa, että numerot ovat todella lähellä palkkeja, olisi helpompi lukea, jos niiden välissä olisi vähän enemmän tilaa.

Toinen elementti tässä juonessa ovat värit, kontrastivärejä käytettäessä se välittää ajatusta erottelusta, päinvastoin, kun käytetään samanlaisia ​​värejä, ne viestivät ajatusta yhtenäisyydestä tai kokonaisuuden osista. Koska kaikki ominaisuudet ovat osa pingviinejä, voimme käyttää värejä, jotka tekevät jokaisesta palkin erottuvan säilyttäen samalla yhtenäisyyden:

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) 

Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Jos haluat tehdä tuloksista vieläkin suorempia, voit muuttaa otsikkoa ja lisätä johtopäätöksen. Tiedetään, että laskun pituutta pidettiin tärkeimpänä ominaisuutena aiemmin keskustelemiemme kriteerien mukaan. Tämä voi olla ensimmäinen tieto jollekin, joka katsoo juonen, voisimme sanoa pingviinin nokkapituus oli tärkein ominaisuus lajien luokittelussa Random Forest (RF) -perusmallissa :

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)

Tämä on ominaisuuksien tärkeyskaavion lopputulos:

Hanki satunnaisten metsien ominaisuuksien tärkeys Python- ja Scikit-Learn PlatoBlockchain-tietotiedon avulla. Pystysuuntainen haku. Ai.

Yhteenveto

Tässä oppaassa – olemme rakentaneet satunnaisen metsäluokittajan – ja tarkastelimme ominaisuuksien tärkeyttä, joita käytettiin mallin kouluttamisessa. selittää mitä malli on oppinut ja mikä vaikuttaa sen päättelyyn.

Aikaleima:

Lisää aiheesta Stackabus