Machine Learning - Decision Tree


Beslutningstræ (Decision Tree)

I dette kapitel vil vi vise dig, hvordan du laver en 'beslutningstræ'. Beslutningstræer er en procesplan, der kan hjælpe dig med at træffe beslutninger baseret på tidligere erfaringer.

I dette eksempel vil en person forsøge at afgøre, om de skal deltage i komedieforestillingen.

Heldigvis, vores eksempel person registrerer sig hver gang der afholdes en komedieforestilling i byen, og registrerer nogle oplysninger om komedieaktører, og registrerer også om de har været der.

Alder Oplevelse 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

Nu kan Python oprette et beslutningstræ baseret på dette dataæt, som kan bruges til at afgøre, om det er værd at deltage i nye forestillinger.

Arbejdsmekanisme

Først skal vi importere de nødvendige moduler og bruge pandas til at læse dataæt:

Eksempel

Læs og print dataæt

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)

Kør Eksempel

For at lave et beslutningstræ skal alle data være numeriske.

Vi skal konvertere de ikke-numeriske kolonner 'Nationality' og 'Go' til numeriske.

Pandas har en map() Metode, der accepterer en dictionary, der indeholder information om, hvordan værdierne skal konverteres.

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

Det betyder, at værdien 'UK' konverteres til 0, værdien 'USA' konverteres til 1, og værdien 'N' konverteres til 2.

Eksempel

Konverter strengværdier til numeriske værdier:

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)

Kør Eksempel

Herefter skal vi adskille egenskabskolonnen fra målkolonnen.

Egenskabskolonnen er kolonnen, vi forsøger at forudsige fra, og målkolonnen er kolonnen med værdier, vi forsøger at forudsige.

Eksempel

X er kolonnen med egenskaber, y er kolonnen med mål:

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

Kør Eksempel

Nu kan vi oprette det faktiske beslutningstræ, der passer til vores detaljer, og derefter gemme en .png-fil på computeren:

Eksempel

Opret et beslutningstræ, gem det som et billede og vis billedet:

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()

Kør Eksempel

Resultatforklaring

Beslutningstræet bruger dine tidligere beslutninger til at beregne sandsynligheden for, om du vil se en komisk skuespiller.

Lad os læse forskellige aspekter af beslutningstræet:


Rank

Rank <= 6.5 Viser, at komiske skuespillere med en rangering lavere end 6.5 vil følge True Pil (venstre), og de øvrige følger False Pil (højre)

gini = 0.497 Viser kvaliteten af skilleprocessen, og er altid et tal mellem 0.0 og 0.5, hvor 0.0 betyder, at alle prøver får det samme resultat, og 0.5 betyder, at skilleprocessen er fuldt ud fordeling.

samples = 13 Viser, at der stadig er 13 komiske skuespillere tilbage på dette beslutningspunkt, fordi dette er det første trin, og de er alle komiske skuespillere.

value = [6, 7] Viser, at af de 13 komiske skuespillere, 6 vil få "NO", og 7 vil få "GO".

Gini

Der er mange måder at skille prøver på, og vi bruger GINI-metoden i denne tutorial.

Gini-metoden bruger følgende formel:

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

Her er x antallet af positive svar ("GO"), n er prøveantallet, og y er antallet af negative svar ("NO"), og beregnes med følgende formel:

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


Næste trin indeholder to rammer, en ramme til komiske skuespillere med 'Rank' på 6.5 eller lavere, og den anden ramme.

True - 5 komiske skuespillere slutter her:

gini = 0.0 Viser, at alle prøver får det samme resultat.

samples = 5 Viser at der stadig er 5 komiske skuespillere tilbage (5 skuespillere med en rangering på 6.5 eller lavere).

value = [5, 0] Det betyder, at 5 får "NEJ" og 0 får "JA".

False - 8 teateraktører fortsætter:

Nationalitet (nationalitet)

Nationalitet <= 0.5 Det betyder, at komikere med nationalitetsværdi mindre end 0.5 vil følge den venstre pil (dette betyder alle fra Storbritannien), mens de øvrige vil følge den højre pil.

gini = 0.219 Det betyder, at omtrent 22% af prøven vil bevæge sig i én retning.

samples = 8 Det betyder, at der stadig er otte komikere tilbage i denne gren (otte komikere med en karakter over 6.5).

value = [1, 7] Det betyder, at af de otte komikere, 1 vil få "NEJ", og 7 vil få "JA".


True - 4 teateraktører fortsætter:

Alder (alder)

Alder <= 35.5 Det betyder, at komikere under 35.5 år vil følge den venstre pil, mens de øvrige vil følge den højre pil.

gini = 0.375 Det betyder, at omtrent 37.5% af prøven vil bevæge sig i én retning.

samples = 4 Det betyder, at der stadig er 4 komikere tilbage i denne gren (4 komikere fra Storbritannien).

value = [1, 3] Det betyder, at af de fire komikere, 1 vil få "NEJ", og 3 vil få "JA".

False - 4 komikere her ender:

gini = 0.0 Det betyder, at alle prøver får det samme resultat.

samples = 4 Det betyder, at der stadig er 4 komikere tilbage i denne gren (4 komikere fra Storbritannien).

value = [0, 4] Det betyder, at af de fire komikere, 0 vil få "NEJ", og 4 vil få "JA".


True - 2 komikere her ender:

gini = 0.0 Det betyder, at alle prøver får det samme resultat.

samples = 2 Det betyder, at der stadig er 2 komikere tilbage i denne gren (2 komikere på 35.5 år eller yngre).

value = [0, 2] Det betyder, at af de to komikere, 0 vil få "NEJ", og 2 vil få "JA".

False - 2 teateraktører fortsætter:

Erfaring (erfaring)

Erfaring <= 9.5 Det betyder, at komikere med 9.5 års erfaring eller mere vil følge den venstre pille, mens de øvrige vil følge den højre pille.

gini = 0.5 Det betyder, at 50% af prøven vil bevæge sig i én retning.

samples = 2 Det betyder, at der stadig er 2 komikere tilbage i denne gren (2 komikere over 35.5 år).

value = [1, 1] Det betyder, at af de to komikere, 1 vil få "NEJ", og 1 vil få "JA".


True - 1 navngivet komiker her ender:

gini = 0.0 Det betyder, at alle prøver får det samme resultat.

samples = 1 Det betyder, at der stadig er 1 komiker i denne gren (1 komiker med 9,5 år eller mindre erfaring).

value = [0, 1] 0 betyder "NEJ", 1 betyder "JA".

False - 1 komiker her til:

gini = 0.0 Det betyder, at alle prøver får det samme resultat.

samples = 1 Det betyder, at der stadig er 1 komiker i denne gren (af dem er 1 komiker med mere end 9,5 års erfaring).

value = [1, 0] 1 betyder "NEJ", 0 betyder "JA".

Forudsigede værdier

Vi kan bruge beslutningstræet til at forudsige nye værdier.

For eksempel: Skal jeg se en program med en 40-årig amerikansk komiker, der har 10 års erfaring og en komediebedømmelse på 7?

Eksempel

Brug predict() Metoder til at forudsige nye værdier:

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

Kør Eksempel

Eksempel

Hvad er svaret, hvis komedien er rangeret som 6?

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

Kør Eksempel

Forskellige resultater

Hvis det kører nok gange, vil beslutningstræet give dig forskellige resultater, selvom du indtaster de samme data.

Dette skyldes, at beslutningstræet ikke kan give os 100% sikre svar. Det er baseret på sandsynlighederne for resultaterne, og svarene vil variere.