Maskininlärning - besluts träd


Beslutsdator (Decision Tree)

I detta kapitel kommer vi att visa hur man skapar en "beslutsdator". Beslutsdatorer är en typ av flödesschema som hjälper dig att fatta beslut baserat på tidigare erfarenhet.

I detta exempel kommer någon att försöka besluta om de bör delta i en komedishow.

Lyckligt nog registrerar vår karaktär alltid när det arrangeras en komedishow i staden, och registrerar information om komediaktörer, och också markerar om de har varit där.

Ålder Erfarenhet 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 skapa ett beslutsdatorträd baserat på denna datauppsättning, detta beslutsdatorträd kan användas för att avgöra om det är värt att delta i några nya föreställningar.

Arbetsprincip

Först, importera de nödvändiga modulerna och använd pandas för att läsa datauppsättningen:

Exempel

Läs och skriv ut datauppsättningen:

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 Exempel

För att skapa ett beslutsdatorträd måste all data vara numerisk.

Vi måste konvertera de icke-numeriska kolumnerna 'Nationality' och 'Go' till numeriska.

Pandas har en map() Metod, denna metod accepterar en dictionary som innehåller information om hur värdena ska konverteras.

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

Detta innebär att värdet 'UK' konverteras till 0, 'USA' till 1 och 'N' till 2.

Exempel

Ändra strängvärden till numeriska värden:

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 Exempel

Då måste vi dela upp egenskapskolumnen och målkolumnen.

Egenskapskolumnen är de kolumner vi försöker förutsäga från, målkolumnen är de kolumner som har de värden vi försöker förutsäga.

Exempel

X är egenskapskolumnen, y är målkolumnen:

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

Kör Exempel

Nu kan vi skapa en faktisk beslutsdatorträd som passar våra detaljer och sedan spara en .png-fil på datorn:

Exempel

Skapa ett besluts träd, spara det som en bild och visa bilden:

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 Exempel

Resultatförklaring

Besluts trädet använder dina tidigare beslut för att beräkna sannolikheten för att du är villig att se en komisk skådespelare.

Låt oss läsa olika aspekter av besluts trädet:


Rank

Rank <= 6.5 Det innebär att komiska skådespelare med rankning under 6.5 kommer att följa True Pil (till vänster), och övriga följer False Pil (till höger).

gini = 0.497 Detta representerar kvaliteten på skärningen och är alltid ett nummer mellan 0.0 och 0.5, där 0.0 innebär att alla prover får samma resultat, och 0.5 innebär att skärningen är helt mitt i.

samples = 13 Det innebär att det fortfarande finns 13 komiska skådespelare vid detta beslutsögonblick, eftersom detta är det första steget, så är de alla komiska skådespelare.

value = [6, 7] Det innebär att av de 13 komiska skådespelarna kommer 6 att få "NO" och 7 att få "GO".

Gini

Det finns många sätt att dela upp proverna, och vi använder GINI-metoden i denna handledning.

Gini-metoden använder följande formel:

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

Där x är antalet positiva svar ("GO"), n är provantalet, och y är antalet negativa svar ("NO"), beräknas med följande formel:

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


Nästa steg innehåller två rutor, en för komiska skådespelare med 'Rank' 6.5 eller lägre, och den andra för övriga.

True - 5 komiska skådespelare slutar här:

gini = 0.0 Det innebär att alla prover får samma resultat.

samples = 5 Det innebär att det fortfarande finns 5 komiska skådespelare i denna gren (5 skådespelarens klass är 6.5 eller lägre komiska skådespelare).

value = [5, 0] Det innebär att 5 får "NEJ" och 0 får "JA".

False - 8 teateraktörer fortsätter:

Nationalitet (nationalitet)

Nationalitet <= 0.5 Det innebär att komiska skådespelare med nationalitetsvärde under 0.5 kommer att följa den vänstra pilen (detta innebär alla från Storbritannien), medan de andra kommer att följa den högra pilen.

gini = 0.219 Det innebär att ungefär 22% av exemplen kommer att röra sig i en riktning.

samples = 8 Det innebär att det fortfarande finns 8 komiska skådespelare i denna gren (8 komiska skådespelare med betyg över 6.5).

value = [1, 7] Det innebär att av de åtta komiska skådespelarna kommer 1 att få "NEJ" och 7 kommer att få "JA".


True - 4 teateraktörer fortsätter:

Ålder (ålder)

Ålder <= 35.5 Det innebär att komiska skådespelare under 35.5 år kommer att följa den vänstra pilen, medan de andra kommer att följa den högra pilen.

gini = 0.375 Det innebär att ungefär 37.5% av exemplen kommer att röra sig i en riktning.

samples = 4 Det innebär att det fortfarande finns 4 komiska skådespelare i denna gren (4 komiska skådespelare från Storbritannien).

value = [1, 3] Det innebär att av de fyra komiska skådespelarna kommer 1 att få "NEJ" och 3 kommer att få "JA".

False - 4 komiska skådespelare avslutar här:

gini = 0.0 Detta representerar att alla prov får samma resultat.

samples = 4 Det innebär att det fortfarande finns 4 komiska skådespelare i denna gren (4 komiska skådespelare från Storbritannien).

value = [0, 4] Det innebär att av de fyra komiska skådespelarna kommer 0 att få "NEJ" och 4 kommer att få "JA".


True - 2 komiska skådespelare avslutar här:

gini = 0.0 Detta representerar att alla prov får samma resultat.

samples = 2 Det innebär att det fortfarande finns 2 komiska skådespelare i denna gren (2 komiska skådespelare under 35.5 år).

value = [0, 2] Det innebär att av de två komiska skådespelarna kommer 0 att få "NEJ" och 2 kommer att få "JA".

False - 2 teateraktörer fortsätter:

Erfarenhet (erfarenhet)

Erfarenhet <= 9.5 Det innebär att komiska skådespelare med 9.5 år eller mer erfarenhet kommer att följa den vänstra pilen, medan de andra kommer att följa den högra pilen.

gini = 0.5 Det innebär att 50% av exemplen kommer att röra sig i en riktning.

samples = 2 Det innebär att det fortfarande finns 2 komiska skådespelare i denna gren (2 komiska skådespelare över 35.5 år).

value = [1, 1] Det innebär att av de två komiska skådespelarna kommer 1 att få "NEJ" och 1 kommer att få "JA".


True - 1 av komiska skådespelare avslutar här:

gini = 0.0 Detta representerar att alla prov får samma resultat.

samples = 1 Detta representerar att det fortfarande finns 1 komediskådespelare i denna gren (en med 9.5 år eller mindre erfarenhet av komedi).

value = [0, 1] Detta representerar att 0 representerar "NEJ", 1 representerar "JA".

False - 1 komediskådespelare härifrån:

gini = 0.0 Detta representerar att alla prov får samma resultat.

samples = 1 Detta representerar att det fortfarande finns 1 komediskådespelare i denna gren (av vilka 1 har mer än 9.5 års erfarenhet av komedi).

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

Förutsägda värden

Vi kan använda beslutsverktyget för att förutsäga nya värden.

Till exempel: Skall jag se på ett program med en 40-årig amerikansk komediskådespelare med 10 års erfarenhet och en komedirankning på 7?

Exempel

Använd predict() Metoder för att förutsäga nya värden:

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

Kör Exempel

Exempel

Vad är svaret om komedigraden är 6?

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

Kör Exempel

Olika svar

Om du kör tillräckligt många gånger kommer beslutsverktyget att ge dig olika resultat, även om du anger samma data.

Detta beror på att beslutsverktyget inte kan ge oss 100% säkra svar. Det baseras på sannolikheten för resultaten, svaren kommer att variera.