Apprendimento automatico - Albero di decisione


Albero decisionale (Decision Tree)

In questa sezione, vi mostreremo come creare un "albero decisionale". Un albero decisionale è un diagramma che può aiutarti a prendere decisioni basate su esperienze precedenti.

In questo esempio, una persona cercherà di decidere se dovrebbe partecipare al programma di commedia.

Fortunatamente, i personaggi del nostro esempio si iscrivono ogni volta che si tiene un programma di commedia nel paese, e si iscrivono anche alcune informazioni sugli attori di commedia, e si registra anche se sono stati lì.

Età Esperienza 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

Ora, basandosi su questo set di dati, Python può creare un albero decisionale, che può essere utilizzato per determinare se è utile partecipare a qualsiasi nuovo spettacolo.

Funzionamento

Prima di tutto, importare i moduli necessari e leggere il set di dati utilizzando pandas:

Esempio

Leggere e stampare il set di dati:

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)

Eseguire l'esempio

Per creare un albero decisionale, tutti i dati devono essere numerici.

Dobbiamo convertire le colonne non numeriche 'Nationality' e 'Go' in numeri.

Pandas ha un map() Metodo, questo metodo accetta un dizionario che contiene informazioni su come convertire i valori.

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

Questo significa convertire il valore 'UK' in 0, il valore 'USA' in 1 e il valore 'N' in 2.

Esempio

Convertire i valori di stringa in numeri:

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)

Eseguire l'esempio

Poi, dobbiamo separare le colonne delle caratteristiche dalla colonna del obiettivo.

Le colonne delle caratteristiche sono le colonne da cui cerchiamo di fare previsioni, la colonna del obiettivo è la colonna che contiene i valori che cerchiamo di prevedere.

Esempio

X è la colonna delle caratteristiche, y è la colonna del obiettivo:

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

Eseguire l'esempio

Ora, possiamo creare un albero decisionale reale, adattarlo ai nostri dettagli e salvare un file .png sul computer:

Esempio

Crea un decision tree, salvalo come immagine e visualizzalo:

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

Eseguire l'esempio

Spiegazione dei risultati

Il decision tree utilizza le tue decisioni precedenti per calcolare la probabilità di voler vedere un attore comico.

Lettura delle diverse parti del decision tree:


Rank

Rank <= 6.5 Rappresenta che gli attori comici con ranking inferiore a 6.5 seguiranno True Freccia (a sinistra), il resto segue False Freccia (a destra).

gini = 0.497 Rappresenta la qualità della divisione e sempre un numero tra 0.0 e 0.5, dove 0.0 rappresenta che tutti i campioni hanno ottenuto lo stesso risultato, mentre 0.5 rappresenta una divisione completa nel mezzo.

samples = 13 Rappresenta che a questo punto della decisione ci sono ancora 13 attori comici, perché è il primo passo, quindi tutti sono attori comici.

value = [6, 7] Rappresenta che tra questi 13 attori comici, 6 riceveranno 'NO' e 7 riceveranno 'GO'.

Gini

Ci sono molti modi per dividere i campioni, e in questo tutorial utilizziamo il metodo GINI.

Il metodo Gini utilizza la seguente formula:

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

Dove, x è il numero di risposte affermative ('GO'), n è il numero di campioni, e y è il numero di risposte negative ('NO'), calcolato con la seguente formula:

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


Il passo successivo include due caselle, una per gli attori comici con 'Rank' di 6.5 o inferiore, e l'altra per il resto.

True - 5 attori comici finiscono qui:

gini = 0.0 Rappresenta che tutti i campioni hanno ottenuto lo stesso risultato.

samples = 5 Rappresenta che in questa branca rimangono ancora 5 attori comici (5 attori di livello 6.5 o inferiore).

value = [5, 0] Cio significa che 5 riceveranno "NO" e 0 riceveranno "GO".

False - 8 attori teatrali continuano:

Nationality (nazionalità)

Nationality <= 0.5 Cio significa che gli attori comici con valore di nazionalità inferiore a 0.5 seguiranno la freccia di sinistra (ciò significa tutti coloro che provengono dal Regno Unito), mentre gli altri seguiranno quella di destra.

gini = 0.219 Questo significa che circa il 22% dei campioni si muoveranno in una direzione.

samples = 8 Cio significa che in questa ramificazione rimangono 8 attori comici (8 attori comici con valutazione superiore a 6.5).

value = [1, 7] Cio significa che di questi 8 attori comici, 1 riceverà "NO" e 7 riceveranno "GO".


True - 4 attori teatrali continuano:

Age (età)

Age <= 35.5 Cio significa che gli attori comici di 35.5 anni o più giovani seguiranno la freccia di sinistra, mentre gli altri seguiranno quella di destra.

gini = 0.375 Questo significa che circa il 37.5% dei campioni si muoveranno in una direzione.

samples = 4 Cio significa che in questa ramificazione rimangono 4 attori comici (4 attori comici britannici).

value = [1, 3] Cio significa che di questi 4 attori comici, 1 riceverà "NO" e 3 riceveranno "GO".

False - 4 attori comici qui si concludono:

gini = 0.0 Rappresenta che tutti i campioni ottengono lo stesso risultato.

samples = 4 Cio significa che in questa ramificazione rimangono 4 attori comici (4 attori comici britannici).

value = [0, 4] Cio significa che di questi 4 attori comici, 0 riceverà "NO" e 4 riceveranno "GO".


True - 2 attori comici qui si concludono:

gini = 0.0 Rappresenta che tutti i campioni ottengono lo stesso risultato.

samples = 2 Cio significa che in questa ramificazione rimangono 2 attori comici (2 attori comici di 35.5 anni o più giovani).

value = [0, 2] Cio significa che di questi due attori comici, 0 riceverà "NO" e 2 riceveranno "GO".

False - 2 attori teatrali continuano:

Experience (esperienza)

Experience <= 9.5 Cio significa che gli attori comici con più di 9.5 anni di esperienza seguiranno la freccia di sinistra, mentre gli altri seguiranno quella di destra.

gini = 0.5 Cio significa che il 50% dei campioni si muoveranno in una direzione.

samples = 2 Cio significa che in questa ramificazione rimangono 2 attori comici (2 attori comici con età superiore a 35.5 anni).

value = [1, 1] Cio significa che uno dei due attori comici riceverà "NO" e l'altro "GO".


True - 1 attore comico qui si conclude:

gini = 0.0 Rappresenta che tutti i campioni ottengono lo stesso risultato.

samples = 1 Rappresenta che in questa branca rimane un attore comico (uno ha 9,5 anni o meno di esperienza comica).

value = [0, 1] Rappresenta che 0 rappresenta "NO", 1 rappresenta "GO".

False - 1 attore comico fino a questo punto:

gini = 0.0 Rappresenta che tutti i campioni ottengono lo stesso risultato.

samples = 1 Rappresenta che in questa branca rimane un attore comico (uno ha più di 9,5 anni di esperienza comica).

value = [1, 0] 1 rappresenta "NO", 0 rappresenta "GO".

Valore predetto

Possiamo usare l'albero di decisione per prevedere nuovi valori.

Ad esempio: dovrei guardare un programma interpretato da un attore comico americano di 40 anni con 10 anni di esperienza e un punteggio comico di 7?

Esempio

Usare predict() Metodi per prevedere nuovi valori:

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

Eseguire l'esempio

Esempio

Qual è la risposta se il livello comico è 6?

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

Eseguire l'esempio

Risultati diversi

Se eseguito abbastanza volte, anche se inserisci dati identici, l'albero di decisione ti fornirà risultati diversi.

Questo è perché l'albero di decisione non può fornirci una risposta certa del 100%. Si basa sulla probabilità dei risultati e le risposte possono variare.