Masjienleer - Besluitboom
Besluitboom
In hierdie hoofstuk sal ons jou wys hoe om 'n "Besluitboom" te maak. 'n Besluitboom is 'n vloeidiagram en kan jou help om besluite te neem op grond van vorige ondervinding.
In die voorbeeld sal 'n persoon probeer besluit of hy/sy na 'n komedieprogram moet gaan of nie.
Gelukkig het ons voorbeeld persoon elke keer as daar 'n komedieprogram in die dorp was geregistreer, en bietjie inligting oor die komediant geregistreer, en ook geregistreer of hy/sy gaan of nie.
Ouderdom | Ervaring | Rang | Nasionaliteit | Gaan |
36 | 10 | 9 | VK | GEEN |
42 | 12 | 4 | VSA | GEEN |
23 | 4 | 6 | N | GEEN |
52 | 4 | 4 | VSA | GEEN |
43 | 21 | 8 | VSA | JA |
44 | 14 | 5 | VK | GEEN |
66 | 3 | 7 | N | JA |
35 | 14 | 9 | VK | JA |
52 | 13 | 7 | N | JA |
35 | 5 | 9 | N | JA |
24 | 3 | 5 | VSA | GEEN |
18 | 3 | 7 | VK | JA |
45 | 9 | 9 | VK | JA |
Nou, gebaseer op hierdie datastel, kan Python 'n besluitboom skep wat gebruik kan word om te besluit of enige nuwe vertonings die moeite werd is om na by te woon.
Hoe werk dit?
Voer eers die modules in wat jy nodig het, en lees die datastel met pandas:
Voorbeeld
Lees en druk die datastel:
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)
Om 'n besluitboom te maak, moet alle data numeries wees.
Ons moet die nie-numeriese kolomme 'Nasionaliteit' en 'Gaan' omskakel in numeriese waardes.
Pandas het 'n map()
metode wat 'n woordeboek neem met inligting oor hoe om die waardes om te skakel.
{'UK': 0, 'USA': 1, 'N': 2}
Beteken omskakel die waardes 'VK' na 0, 'VSA' na 1, en 'N' na 2.
Voorbeeld
Verander stringwaardes in numeriese waardes:
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)
Dan moet ons die kenmerkkolomme van die teikenkolom skei .
Die kenmerkkolomme is die kolomme waarvan ons probeer voorspel , en die teikenkolom is die kolom met die waardes wat ons probeer voorspel.
Voorbeeld
X
is die kenmerkkolomme,
y
is die teikenkolom:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Nou kan ons die werklike besluitboom skep, dit by ons besonderhede pas, en 'n .png-lêer op die rekenaar stoor:
Voorbeeld
Skep 'n Besluitboom, stoor dit as 'n prent en wys die prent:
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()
Resultaat verduidelik
Die besluiteboom gebruik jou vroeëre besluite om die kans te bereken dat jy 'n komediant wil gaan sien of nie.
Kom ons lees die verskillende aspekte van die besluitnemingsboom:
Rang
Rank <= 6.5
beteken dat elke komediant met 'n rang van 6.5 of laer die
True
pyl (na links) sal volg, en die res sal die False
pyl (na regs) volg.
gini = 0.497
verwys na die kwaliteit van die verdeling, en is altyd 'n getal tussen 0.0 en 0.5, waar 0.0 sou beteken dat al die monsters dieselfde resultaat gekry het, en 0.5 sou beteken dat die verdeling presies in die middel gedoen word.
samples = 13
beteken dat daar 13 komediante oor is op hierdie stadium van die besluit, wat almal van hulle is aangesien dit die eerste stap is.
value = [6, 7]
beteken dat van hierdie 13 komediante, 6 'n "NEE" sal kry, en 7 'n "GO".
Gini
Daar is baie maniere om die monsters te verdeel, ons gebruik die GINI-metode in hierdie tutoriaal.
Die Gini-metode gebruik hierdie formule:
Gini = 1 - (x/n)2 - (y/n)2
Waar x
is die aantal positiewe antwoorde ("GO"),
n
is die aantal steekproewe, en
y
is die aantal negatiewe antwoorde ("NEE"), wat vir ons hierdie berekening gee:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
Die volgende stap bevat twee bokse, een boks vir die komediante met 'n 'Rank' van 6.5 of laer, en een boks met die res.
Waar - 5 komediante eindig hier:
gini = 0.0
beteken dat al die monsters dieselfde resultaat gekry het.
samples = 5
beteken dat daar 5 komediante in hierdie tak oor is (5 komediante met 'n Rang van 6.5 of laer).
value = [5, 0]
beteken dat 5 'n "NEE" sal kry en 0 'n "GO" sal kry.
Onwaar - 8 komediante gaan voort:
Nasionaliteit
Nationality <= 0.5
beteken dat die komediante met 'n nasionaliteitswaarde van minder as 0,5 die pyl na links sal volg (wat beteken almal van die VK, ), en die res sal die pyl na regs volg.
gini = 0.219
beteken dat ongeveer 22% van die monsters in een rigting sou gaan.
samples = 8
beteken dat daar 8 komediante in hierdie tak oor is (8 komediante met 'n Rang hoër as 6.5).
value = [1, 7]
beteken dat van hierdie 8 komediante, 1 'n "NEE" sal kry en 7 'n "GO".
Waar - 4 komediante gaan voort:
Ouderdom
Age <= 35.5
beteken dat komediante op die ouderdom van 35,5 of jonger die pyl na links sal volg, en die res sal die pyl na regs volg.
gini = 0.375
beteken dat ongeveer 37,5% van die monsters in een rigting sou gaan.
samples = 4
beteken dat daar 4 komediante in hierdie tak oor is (4 komediante van die VK).
value = [1, 3]
beteken dat van hierdie 4 komediante, 1 'n "NEE" sal kry en 3 'n "GO".
Vals - 4 komediante eindig hier:
gini = 0.0
beteken dat al die monsters dieselfde resultaat gekry het.
samples = 4
beteken dat daar 4 komediante in hierdie tak oor is (4 komediante nie van die VK nie).
value = [0, 4]
beteken dat van hierdie 4 komediante, 0 'n "NEE" sal kry en 4 'n "GO".
Waar - 2 komediante eindig hier:
gini = 0.0
beteken dat al die monsters dieselfde resultaat gekry het.
samples = 2
beteken dat daar 2 komediante in hierdie tak oor is (2 komediante op die ouderdom van 35,5 of jonger).
value = [0, 2]
beteken dat van hierdie 2 komediante, 0 'n "NEE" sal kry en 2 'n "GO".
Onwaar - 2 komediante gaan voort:
Ervaring
Experience <= 9.5
beteken dat komediante met 9,5 jaar ondervinding, of minder, die pyl na links sal volg, en die res sal die pyl na regs volg.
gini = 0.5
beteken dat 50% van die monsters in een rigting sal gaan.
samples = 2
beteken dat daar 2 komediante in hierdie tak oor is (2 komediante ouer as 35,5).
value = [1, 1]
beteken dat van hierdie 2 komediante, 1 'n "NEE" sal kry en 1 'n "GO".
Waar - 1 komediant eindig hier:
gini = 0.0
beteken dat al die monsters dieselfde resultaat gekry het.
samples = 1
beteken dat daar 1 komediant in hierdie tak oor is (1 komediant met 9,5 jaar ondervinding of minder).
value = [0, 1]
beteken dat 0 'n "NEE" sal kry en 1 'n "GO".
Onwaar - 1 komediant eindig hier:
gini = 0.0
beteken dat al die monsters dieselfde resultaat gekry het.
samples = 1
beteken dat daar 1 komediant in hierdie tak oor is (1 komediant met meer as 9,5 jaar ondervinding).
value = [1, 0]
beteken dat 1 'n "NEE" sal kry en 0 'n "GO".
Voorspel waardes
Ons kan die Besluitboom gebruik om nuwe waardes te voorspel.
Voorbeeld: Moet ek 'n program gaan sien met 'n 40-jarige Amerikaanse komediant, met 10 jaar ondervinding, en 'n komedie-ranglys van 7?
Voorbeeld
Gebruik predict() metode om nuwe waardes te voorspel:
print(dtree.predict([[40, 10, 7, 1]]))
Voorbeeld
Wat sou die antwoord wees as die komedie-rang 6 was?
print(dtree.predict([[40, 10, 6, 1]]))
Verskillende resultate
Jy sal sien dat die Besluitboom jou verskillende resultate gee as jy dit genoeg kere hardloop, selfs al voer jy dit met dieselfde data.
Dit is omdat die Besluitboom nie vir ons 'n 100% seker antwoord gee nie. Dit is gebaseer op die waarskynlikheid van 'n uitkoms, en die antwoord sal verskil.