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.41267633
tai 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)
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)
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)
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)
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)
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:
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.