Teollinen oppitunnit - päätöspuut


Päätöspuu (Decision Tree)

Tässä luvussa näytämme sinulle, miten tehdä 'päätöspuun'. Päätöspuu on prosessikuva, joka auttaa sinua tekemään päätöksiä aikaisemman kokemuksen perusteella.

Tässä esimerkissä yksi henkilö yrittää päättää, pitäisikö hän osallistua komediaohjelmaan.

Onneksi, esimerkkimme hahmo rekisteröity aina kun komediaohjelma järjestetään kaupungissa, ja rekisteröi tietoja komediaesiäisistä, ja myös rekisteröi, onko hän/hän ollut paikalla.

Ikä Kokemus Rank Nationality Go
36 10 9 UK NO
42 12 4 USA NO
23 4 6 N NO
52 4 4 USA NO
43 21 8 USA YES
44 14 5 UK NO
66 3 7 N YES
35 14 9 UK YES
52 13 7 N YES
35 5 9 N YES
24 3 5 USA NO
18 3 7 UK YES
45 9 9 UK YES

Nyt, tämän tietojoukon perusteella Python voi luoda päätöspuun, jota voidaan käyttää päätöksen tekemiseen siitä, onko uusi esitys kannattavaa osallistua.

Toimintatapa

Ensiksi, tuodaan tarvittavat moduulit ja lue tietojoukko pandasilla:

Esimerkki

Lue ja tulosta tietojoukko:

import pandas
from sklearn import tree
import pydotplus
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)

Suorita esimerkki

Jos haluamme tehdä päätöspuun, kaikki tiedot täytyy olla lukuja.

Meidän täytyy muuntaa ei-numeriset sarakkeet 'Nationality' ja 'Go' lukuiksi.

Pandasilla on map() Metodi, joka hyväksyy sanakirjan, joka sisältää tiedot arvojen muuntamisesta.

{'UK': 0, 'USA': 1, 'N': 2}

Tämä tarkoittaa, että arvo 'UK' muunnetaan 0:ksi, 'USA' muunnetaan 1:ksi ja 'N' muunnetaan 2:ksi.

Esimerkki

Muunna merkkijonot lukuiksi:

d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)

Suorita esimerkki

Sitten meidän täytyy erottaa ominaisuusvälilehdet kohdeväliltä.

Ominaisuusvälilehdet ovat niitä sarakkeita, joista yritämme ennustaa, ja kohdevälit ovat niitä sarakkeita, joissa on arvoja, joita yritämme ennustaa.

Esimerkki

X on ominaisuusvälilehti, y on kohdeväli:

features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)

Suorita esimerkki

Nyt voimme luoda todellisen päätöspuun, joka sopii yksityiskohtiimme, ja tallentaa sen tietokoneeseen .png-tiedostona:

Esimerkki

Luo päätöspuu, tallenna se kuvana ja näytä kuva:

dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph = pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()

Suorita esimerkki

Tuloksen selitys

Päätöspuu laskee aikaisemman päätöksesi perusteella, kuinka todennäköistä on, että haluat katsoa koomikkoa.

Lue päätöspuun eri puolet:


Rank

Rank <= 6.5 Tämä osoittaa, että sijoittelu 6.5:n alapuolella olevat koomikot noudattavat True Nuoli (vasemmalle), ja muut noudattavat False Nuoli (oikealle).

gini = 0.497 Tämä osoittaa jakamisen laadun, ja se on aina luku 0.0-0.5 välillä, jossa 0.0 tarkoittaa, että kaikki näytteet saavat saman tuloksen, ja 0.5 tarkoittaa, että jakaminen on täysin keskellä.

samples = 13 Tämä osoittaa, että päätöksenteon tässä vaiheessa on vielä 13 koomikkoa, koska tämä on ensimmäinen vaihe, joten he kaikki ovat koomikoita.

value = [6, 7] Tämä osoittaa, että 13 koomikosta 6 saa "NO" ja 7 saa "GO".

Gini

Näytteiden jakamistapa on monenlaisia, käytämme tässä oppaassa GINI-metodia.

Gini-metodi käyttää seuraavaa kaavaa:

Gini = 1 - (x/n)2 - (y/n)2

Siinä, x on varmasti vastaus määrä ("GO"), n on näytteiden määrä, y on kieltävä vastaus määrä ("NO"), ja lasketaan seuraavalla kaavalla:

1 - (7 / 13)2 - (6 / 13)2 = 0.497


Seuraavassa vaiheessa on kaksi laatikkoa, yksi koomikoille, joiden 'Rank' on 6.5 tai alempi, ja muut yksi laatikko.

True - 5 koomikkoa päätyy täällä:

gini = 0.0 Tämä osoittaa, että kaikki näytteet saavat saman tuloksen.

samples = 5 Tämä osoittaa, että tässä haarakkeessa on vielä 5 koomikkoa (5:n luokitus on 6.5 tai alempi koomikko).

value = [5, 0] Tämä tarkoittaa, että 5 saa "EI" ja 0 saa "KYLLÄ".

False - 8 näyttelijää jatkaa:

Nationality(kansallisuus)

Nationality <= 0.5 Tämä tarkoittaa, että kansallisuusarvo alle 0,5 omaavat komediantit seuravat vasenta nuolta (tämä tarkoittaa kaikkia brittiläisiä), muut oikean.

gini = 0.219 Tämä tarkoittaa, että noin 22% näytteistä siirtyy yhteen suuntaan.

samples = 8 Tämä tarkoittaa, että tässä haarakohdassa on edelleen 8 komediantia (8 komediantia, joiden luokka on yli 6,5).

value = [1, 7] Tämä tarkoittaa, että näistä kahdeksasta komediasta 1 saa "EI" ja 7 saa "KYLLÄ".


True - 4 näyttelijää jatkaa:

Age(ikä)

Age <= 35.5 Tämä tarkoittaa, että 35,5 vuotta tai nuoremmat komediantit seuravat vasenta nuolta, muut oikean.

gini = 0.375 Tämä tarkoittaa, että noin 37,5% näytteistä siirtyy yhteen suuntaan.

samples = 4 Tämä tarkoittaa, että tässä haarakohdassa on edelleen 4 komediantia (4 brittiläistä komediantia).

value = [1, 3] Tämä tarkoittaa, että näistä neljästä komediasta 1 saa "EI" ja 3 saa "KYLLÄ".

False - 4 komediantia päätti täällä:

gini = 0.0 Tämä tarkoittaa, että kaikki esimerkit antavat saman tuloksen.

samples = 4 Tämä tarkoittaa, että tässä haarakohdassa on edelleen 4 komediantia (4 brittiläistä komediantia).

value = [0, 4] Tämä tarkoittaa, että näistä neljästä komediasta 0 saa "EI" ja 4 saa "KYLLÄ".


True - 2 komediantia päätti täällä:

gini = 0.0 Tämä tarkoittaa, että kaikki esimerkit antavat saman tuloksen.

samples = 2 Tämä tarkoittaa, että tässä haarakohdassa on edelleen 2 komediantia (2 alle 35,5-vuotiasta komediantia).

value = [0, 2] Tämä tarkoittaa, että näistä kahdesta komediasta 0 saa "EI" ja 2 saa "KYLLÄ".

False - 2 näyttelijää jatkaa:

Experience(kokemus)

Experience <= 9.5 Tämä tarkoittaa, että 9,5 vuotta tai enemmän kokemusta omaavat komediantit seuravat vasenta nuolta, muut oikean.

gini = 0.5 Tämä tarkoittaa, että 50% näistä näytteistä siirtyy yhteen suuntaan.

samples = 2 Tämä tarkoittaa, että tässä haarakohdassa on edelleen 2 komediantia (2 yli 35,5-vuotiasta komediantia).

value = [1, 1] Tämä tarkoittaa, että näistä kahdesta komediasta 1 saa "EI" ja 1 saa "KYLLÄ".


True - 1 niminen komedianti päätti täällä:

gini = 0.0 Tämä tarkoittaa, että kaikki esimerkit antavat saman tuloksen.

samples = 1 Tämä tarkoittaa, että tässä haaroituksessa on vielä yksi komediaesimerkki (jossa on yksi 9,5 vuotta tai vähemmän kokemusta oleva komediaesimerkki).

value = [0, 1] Tämä tarkoittaa, että 0 edustaa "EI", 1 edustaa "KYLLÄ".

False - 1 komediaesimerkki tähän mennessä:

gini = 0.0 Tämä tarkoittaa, että kaikki esimerkit antavat saman tuloksen.

samples = 1 Tämä tarkoittaa, että tässä haaroituksessa on vielä yksi komediaesimerkki (jossa on yksi yli 9,5 vuotta kokemusta oleva komediaesimerkki).

value = [1, 0] 1 edustaa "EI", 0 edustaa "KYLLÄ".

Ennustetut arvot

Voimme käyttää päätöspuuta ennustamaan uusia arvoja.

Esimerkiksi: Pitäisikö minun katsoa ohjelmaa, jonka näyttelijä on 40-vuotias yhdysvaltalainen komediaesimerkki ja jolla on 10 vuoden kokemus, ja jonka komediaarvo on 7?

Esimerkki

Käytä predict() Menetelmä uusien arvojen ennustamiseksi:

print(dtree.predict([[40, 10, 7, 1]]))

Suorita esimerkki

Esimerkki

Jos komediasarjan arvo on 6, mikä on vastaus?

print(dtree.predict([[40, 10, 6, 1]]))

Suorita esimerkki

Eri tulokset

Jos sitä suoritetaan riittävästi usein, päätöspuu voi tarjota erilaisia tuloksia, vaikka syötetään samat tiedot.

Tämä johtuu siitä, että päätöspuu ei voi antaa meille 100% varmaa vastausta. Se perustuu tulosten todennäköisyyteen, ja vastaus voi vaihdella.