Machine Learning - Beslisboom
Beslissingsboom
In dit hoofdstuk laten we u zien hoe u een "Beslisboom" maakt. Een beslisboom is een stroomschema en kan u helpen beslissingen te nemen op basis van eerdere ervaringen.
In het voorbeeld zal een persoon proberen te beslissen of hij/zij naar een comedyshow moet gaan of niet.
Gelukkig heeft onze voorbeeldpersoon zich elke keer geregistreerd als er een comedyshow in de stad was, en wat informatie over de komiek, en ook geregistreerd of hij/zij ging of niet.
Leeftijd | Ervaring | Rang | Nationaliteit | Gaan |
36 | 10 | 9 | VK | NEE |
42 | 12 | 4 | VS | NEE |
23 | 4 | 6 | N | NEE |
52 | 4 | 4 | VS | NEE |
43 | 21 | 8 | VS | JA |
44 | 14 | 5 | VK | NEE |
66 | 3 | 7 | N | JA |
35 | 14 | 9 | VK | JA |
52 | 13 | 7 | N | JA |
35 | 5 | 9 | N | JA |
24 | 3 | 5 | VS | NEE |
18 | 3 | 7 | VK | JA |
45 | 9 | 9 | VK | JA |
Nu kan Python op basis van deze dataset een beslissingsboom maken die kan worden gebruikt om te beslissen of nieuwe shows de moeite waard zijn om naar te kijken.
Hoe werkt het?
Importeer eerst de modules die je nodig hebt en lees de dataset met panda's:
Voorbeeld
Lees en print de dataset:
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 een beslisboom te maken, moeten alle gegevens numeriek zijn.
We moeten de niet-numerieke kolommen 'Nationaliteit' en 'Go' omzetten in numerieke waarden.
Pandas heeft een map()
methode die een woordenboek nodig heeft met informatie over het converteren van de waarden.
{'UK': 0, 'USA': 1, 'N': 2}
Betekent: converteer de waarden 'UK' naar 0, 'USA' naar 1 en 'N' naar 2.
Voorbeeld
Verander stringwaarden in numerieke waarden:
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 moeten we de feature- kolommen scheiden van de doelkolom .
De functiekolommen zijn de kolommen waaruit we proberen te voorspellen , en de doelkolom is de kolom met de waarden die we proberen te voorspellen.
Voorbeeld
X
is de functiekolommen,
y
is de doelkolom:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Nu kunnen we de eigenlijke beslisboom maken, deze aanpassen aan onze details en een .png-bestand op de computer opslaan:
Voorbeeld
Maak een beslisboom, sla deze op als afbeelding en toon de afbeelding:
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 uitgelegd
De beslisboom gebruikt uw eerdere beslissingen om de kans te berekenen dat u wel of niet naar een cabaretier wilt gaan.
Laten we de verschillende aspecten van de beslisboom eens doornemen:
Rang
Rank <= 6.5
betekent dat elke komiek met een rang van 6.5 of lager de
True
pijl (naar links) zal volgen en de rest de False
pijl (naar rechts).
gini = 0.497
verwijst naar de kwaliteit van de splitsing en is altijd een getal tussen 0,0 en 0,5, waarbij 0,0 zou betekenen dat alle monsters hetzelfde resultaat hebben, en 0,5 zou betekenen dat de splitsing precies in het midden wordt uitgevoerd.
samples = 13
betekent dat er op dit punt in de beslissing nog 13 comedians over zijn, en dat zijn ze allemaal, aangezien dit de eerste stap is.
value = [6, 7]
betekent dat van deze 13 comedians 6 een "NEE" krijgen en 7 een "GO".
Gini
Er zijn veel manieren om de samples te splitsen, we gebruiken de GINI-methode in deze tutorial.
De Gini-methode gebruikt deze formule:
Gini = 1 - (x/n)2 - (y/n)2
Waar x
is het aantal positieve antwoorden ("GO"),
n
is het aantal steekproeven en
y
is het aantal negatieve antwoorden ("NEE"), wat ons deze berekening geeft:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
De volgende stap bevat twee dozen, een doos voor de comedians met een 'Rank' van 6.5 of lager, en een doos met de rest.
Waar - 5 komieken eindigen hier:
gini = 0.0
betekent dat alle monsters hetzelfde resultaat kregen.
samples = 5
betekent dat er nog 5 komieken over zijn in deze branche (5 komieken met een Rank van 6.5 of lager).
value = [5, 0]
betekent dat 5 een "NEE" krijgt en 0 een "GO".
False - 8 Comedians Verder:
Nationaliteit
Nationality <= 0.5
betekent dat de comedians met een nationaliteitswaarde van minder dan 0,5 de pijl naar links volgen (wat betekent dat iedereen uit het VK, ), en de rest de pijl naar rechts volgen.
gini = 0.219
betekent dat ongeveer 22% van de monsters in één richting zou gaan.
samples = 8
betekent dat er nog 8 comedians over zijn in deze branche (8 comedians met een Rank hoger dan 6.5).
value = [1, 7]
betekent dat van deze 8 comedians, 1 een "NEE" krijgt en 7 een "GO".
Waar - 4 komieken gaan verder:
Leeftijd
Age <= 35.5
betekent dat comedians van 35,5 jaar of jonger de pijl naar links volgen en de rest de pijl naar rechts.
gini = 0.375
betekent dat ongeveer 37,5% van de monsters in één richting zou gaan.
samples = 4
betekent dat er nog 4 comedians over zijn in deze branche (4 comedians uit het VK).
value = [1, 3]
betekent dat van deze 4 komieken er 1 een "NEE" krijgt en 3 een "GO".
False - 4 komieken eindigen hier:
gini = 0.0
betekent dat alle monsters hetzelfde resultaat kregen.
samples = 4
betekent dat er nog 4 comedians over zijn in deze branche (4 comedians niet uit het VK).
value = [0, 4]
betekent dat van deze 4 komieken 0 een "NEE" krijgt en 4 een "GO".
Waar - 2 komieken eindigen hier:
gini = 0.0
betekent dat alle monsters hetzelfde resultaat kregen.
samples = 2
betekent dat er nog 2 cabaretiers over zijn in deze branche (2 cabaretiers van 35,5 jaar of jonger).
value = [0, 2]
betekent dat van deze 2 komieken 0 een "NEE" krijgt en 2 een "GO".
False - 2 Comedians Verder:
Ervaring
Experience <= 9.5
betekent dat comedians met 9,5 jaar ervaring of minder de pijl naar links zullen volgen en de rest de pijl naar rechts.
gini = 0.5
betekent dat 50% van de monsters in één richting zou gaan.
samples = 2
betekent dat er nog 2 cabaretiers over zijn in deze branche (2 cabaretiers ouder dan 35.5).
value = [1, 1]
betekent dat van deze 2 komieken, 1 een "NEE" krijgt en 1 een "GO".
Waar - 1 komiek eindigt hier:
gini = 0.0
betekent dat alle monsters hetzelfde resultaat kregen.
samples = 1
betekent dat er in deze branche nog 1 cabaretier over is (1 cabaretier met 9,5 jaar ervaring of minder).
value = [0, 1]
betekent dat 0 een "NEE" krijgt en 1 een "GO".
False - 1 komiek eindigt hier:
gini = 0.0
betekent dat alle monsters hetzelfde resultaat kregen.
samples = 1
betekent dat er in deze branche nog 1 cabaretier over is (1 cabaretier met meer dan 9,5 jaar ervaring).
value = [1, 0]
betekent dat 1 een "NEE" krijgt en 0 een "GO".
Waarden voorspellen
We kunnen de beslisboom gebruiken om nieuwe waarden te voorspellen.
Voorbeeld: Moet ik naar een show gaan met in de hoofdrol een 40-jarige Amerikaanse komiek, met 10 jaar ervaring en een comedy-ranglijst van 7?
Voorbeeld
Gebruik de methode predict() om nieuwe waarden te voorspellen:
print(dtree.predict([[40, 10, 7, 1]]))
Voorbeeld
Wat zou het antwoord zijn als de komische rang 6 was?
print(dtree.predict([[40, 10, 6, 1]]))
Verschillende resultaten
U zult zien dat de beslisboom u verschillende resultaten geeft als u deze vaak genoeg uitvoert, zelfs als u deze met dezelfde gegevens voedt.
De beslisboom geeft ons namelijk geen 100% zeker antwoord. Het is gebaseerd op de waarschijnlijkheid van een uitkomst en het antwoord zal variëren.