Apprendimento automatico - Albero decisionale
Albero decisionale
In questo capitolo ti mostreremo come creare un "albero decisionale". Un albero decisionale è un diagramma di flusso e può aiutarti a prendere decisioni basate sull'esperienza precedente.
Nell'esempio, una persona proverà a decidere se andare a uno spettacolo comico o meno.
Fortunatamente la nostra persona di esempio si è registrata ogni volta che c'era uno spettacolo comico in città, ha registrato alcune informazioni sul comico e si è registrata anche se ci andava o meno.
Età | Esperienza | Rango | Nazionalità | andare |
36 | 10 | 9 | UK | NO |
42 | 12 | 4 | Stati Uniti d'America | NO |
23 | 4 | 6 | n | NO |
52 | 4 | 4 | Stati Uniti d'America | NO |
43 | 21 | 8 | Stati Uniti d'America | SÌ |
44 | 14 | 5 | UK | NO |
66 | 3 | 7 | n | SÌ |
35 | 14 | 9 | UK | SÌ |
52 | 13 | 7 | n | SÌ |
35 | 5 | 9 | n | SÌ |
24 | 3 | 5 | Stati Uniti d'America | NO |
18 | 3 | 7 | UK | SÌ |
45 | 9 | 9 | UK | SÌ |
Ora, sulla base di questo set di dati, Python può creare un albero decisionale che può essere utilizzato per decidere se vale la pena assistere a nuovi spettacoli.
Come funziona?
Innanzitutto, importa i moduli di cui hai bisogno e leggi il set di dati con i panda:
Esempio
Leggi e stampa 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)
Per fare un albero decisionale, tutti i dati devono essere numerici.
Dobbiamo convertire le colonne non numeriche 'Nazionalità' e 'Vai' in valori numerici.
Pandas ha un map()
metodo che prende un dizionario con informazioni su come convertire i valori.
{'UK': 0, 'USA': 1, 'N': 2}
Significa convertire i valori 'UK' in 0, 'USA' in 1 e 'N' in 2.
Esempio
Cambia i valori delle stringhe in valori numerici:
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)
Quindi dobbiamo separare le colonne delle funzionalità dalla colonna di destinazione .
Le colonne delle caratteristiche sono le colonne da cui proviamo a prevedere e la colonna di destinazione è la colonna con i valori che proviamo a prevedere.
Esempio
X
è le colonne delle caratteristiche,
y
è la colonna di destinazione:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Ora possiamo creare l'albero decisionale vero e proprio, adattarlo ai nostri dettagli e salvare un file .png sul computer:
Esempio
Crea un albero decisionale, salvalo come immagine e mostra l'immagine:
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()
Risultato spiegato
L'albero decisionale utilizza le tue decisioni precedenti per calcolare le probabilità che tu voglia vedere un comico o meno.
Leggiamo i diversi aspetti dell'albero decisionale:
Rango
Rank <= 6.5
significa che ogni comico con un grado di 6,5 o inferiore seguirà la
True
freccia (a sinistra) e il resto seguirà la False
freccia (a destra).
gini = 0.497
si riferisce alla qualità della divisione ed è sempre un numero compreso tra 0,0 e 0,5, dove 0,0 significherebbe che tutti i campioni hanno ottenuto lo stesso risultato e 0,5 significherebbe che la divisione viene eseguita esattamente nel mezzo.
samples = 13
significa che ci sono 13 comici rimasti a questo punto nella decisione, che sono tutti perché questo è il primo passo.
value = [6, 7]
significa che di questi 13 comici, 6 riceveranno un "NO" e 7 riceveranno un "GO".
Gini
Esistono molti modi per dividere i campioni, in questo tutorial utilizziamo il metodo GINI.
Il metodo Gini utilizza questa formula:
Gini = 1 - (x/n)2 - (y/n)2
Dove x
è il numero di risposte positive ("GO"),
n
è il numero di campioni ed
y
è il numero di risposte negative ("NO"), che ci dà questo calcolo:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
Il passaggio successivo contiene due caselle, una casella per i comici con un "Rank" di 6,5 o inferiore e una casella con il resto.
Vero - 5 comici finiscono qui:
gini = 0.0
significa che tutti i campioni hanno ottenuto lo stesso risultato.
samples = 5
significa che ci sono 5 comici rimasti in questo ramo (5 comici con un grado di 6,5 o inferiore).
value = [5, 0]
significa che 5 riceverà un "NO" e 0 riceverà un "GO".
Falso - Continuano gli 8 comici:
Nazionalità
Nationality <= 0.5
significa che i comici con un valore di nazionalità inferiore a 0,5 seguiranno la freccia a sinistra (il che significa tutti dal Regno Unito, ), e il resto seguirà la freccia a destra.
gini = 0.219
significa che circa il 22% dei campioni andrebbe in una direzione.
samples = 8
significa che ci sono 8 comici rimasti in questo ramo (8 comici con un grado superiore a 6,5).
value = [1, 7]
significa che di questi 8 comici, 1 riceverà un "NO" e 7 riceverà un "GO".
Vero - 4 Comici Continuano:
Età
Age <= 35.5
significa che i comici di età pari o inferiore a 35,5 anni seguiranno la freccia a sinistra e il resto seguirà la freccia a destra.
gini = 0.375
significa che circa il 37,5% dei campioni andrebbe in una direzione.
samples = 4
significa che ci sono 4 comici rimasti in questo ramo (4 comici dal Regno Unito).
value = [1, 3]
significa che di questi 4 comici, 1 riceverà un "NO" e 3 riceverà un "GO".
Falso - 4 comici finiscono qui:
gini = 0.0
significa che tutti i campioni hanno ottenuto lo stesso risultato.
samples = 4
significa che ci sono 4 comici rimasti in questo ramo (4 comici non dal Regno Unito).
value = [0, 4]
significa che di questi 4 comici, 0 riceverà un "NO" e 4 riceverà un "GO".
Vero - 2 comici finiscono qui:
gini = 0.0
significa che tutti i campioni hanno ottenuto lo stesso risultato.
samples = 2
significa che sono rimasti 2 comici in questo ramo (2 comici di età pari o inferiore a 35,5 anni).
value = [0, 2]
significa che di questi 2 comici, 0 riceverà un "NO" e 2 riceverà un "GO".
Falso - 2 comici continuano:
Esperienza
Experience <= 9.5
significa che i comici con 9,5 anni di esperienza, o meno, seguiranno la freccia a sinistra e il resto seguirà la freccia a destra.
gini = 0.5
significa che il 50% dei campioni andrebbe in una direzione.
samples = 2
significa che sono rimasti 2 comici in questo ramo (2 comici di età superiore a 35,5).
value = [1, 1]
significa che di questi 2 comici, 1 riceverà un "NO" e 1 riceverà un "GO".
Vero - 1 Comico finisce qui:
gini = 0.0
significa che tutti i campioni hanno ottenuto lo stesso risultato.
samples = 1
significa che è rimasto 1 comico in questo ramo (1 comico con 9,5 anni di esperienza o meno).
value = [0, 1]
significa che 0 riceverà un "NO" e 1 riceverà un "GO".
Falso - 1 comico finisce qui:
gini = 0.0
significa che tutti i campioni hanno ottenuto lo stesso risultato.
samples = 1
significa che è rimasto 1 comico in questo ramo (1 comico con più di 9,5 anni di esperienza).
value = [1, 0]
significa che 1 riceverà un "NO" e 0 riceverà un "GO".
Prevedere i valori
Possiamo usare l'albero decisionale per prevedere nuovi valori.
Esempio: dovrei andare a vedere uno spettacolo interpretato da un comico americano di 40 anni, con 10 anni di esperienza e una classifica comica di 7?
Esempio
Usa il metodo predict() per prevedere nuovi valori:
print(dtree.predict([[40, 10, 7, 1]]))
Esempio
Quale sarebbe la risposta se il grado della commedia fosse 6?
print(dtree.predict([[40, 10, 6, 1]]))
Risultati diversi
Vedrai che l'albero decisionale ti dà risultati diversi se lo esegui abbastanza volte, anche se lo alimenta con gli stessi dati.
Questo perché l'albero delle decisioni non ci dà una risposta certa al 100%. Si basa sulla probabilità di un risultato e la risposta varierà.