En este capítulo le mostraremos cómo hacer un «árbol de decisión». Un árbol de decisiones es un diagrama de flujo y puede ayudarlo a tomar decisiones basadas en la experiencia previa.
En el ejemplo, una persona intentará decidir si debe ir a un programa de comedia o no.
Afortunadamente, nuestra persona de ejemplo se ha registrado cada vez que hubo un espectáculo de comedia en la ciudad, y registró cierta información sobre el comediante, y también registró si asistió o no.
Edad | Experiencia | Ranking | Nacionalidad | 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 |
Ahora, en función de este conjunto de datos, Python puede crear un árbol de decisiones que se puede usar para decidir si vale la pena asistir a algún programa nuevo.
¿Como funciona?
Primero, lea el conjunto de datos con pandas:
Ejemplo
import pandas
df = pandas.read_csv("data.csv")
print(df)
Para hacer un árbol de decisión, todos los datos deben ser numéricos.
Tenemos que convertir las columnas no numéricas ‘Nacionalidad’ y ‘Ir’ en valores numéricos.
Pandas tiene un método map() que toma un diccionario con información sobre cómo convertir los valores.
{‘Reino Unido’: 0, ‘EE. UU.’: 1, ‘N’: 2}
Significa convertir los valores ‘UK’ a 0, ‘USA’ a 1 y ‘N’ a 2.
Ejemplo
Cambie los valores de cadena a valores numéricos:
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nacionalidad'] = df['Nacionalidad'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
Luego tenemos que separar las columnas de características de la columna de destino.
Las columnas de características son las columnas a partir de las cuales tratamos de predecir, y la columna de destino es la columna con los valores que intentamos predecir.
Ejemplo
X son las columnas de características, y es la columna de destino:
features = ['Edad', 'Experiencia', 'Ranking', 'Nacionalidad']
X = df[features]
y = df['Go']
print(X)
print(y)
Ahora podemos crear el árbol de decisiones real, ajustarlo con nuestros detalles. Comience importando los módulos que necesitamos:
Ejemplo
Cree y muestre un árbol de decisión:
import pandas
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
df = pandas.read_csv("data.csv")
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nacionalidad'] = df['Nacionalidad'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
features = ['Edad', 'Experiencia', 'Ranking', 'Nacionalidad']
X = df[features]
y = df['Go']
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
tree.plot_tree(dtree, feature_names=features)
Resultado explicado
El árbol de decisiones utiliza sus decisiones anteriores para calcular las probabilidades de que quiera ir a ver a un comediante o no.
Leamos los diferentes aspectos del árbol de decisión:
Rango
Rango <= 6.5 significa que cada comediante con un rango de 6.5 o menos seguirá la flecha Verdadero (a la izquierda), y el resto seguirá la flecha Falso (a la derecha).
gini = 0,497 se refiere a la calidad de la división y siempre es un número entre 0,0 y 0,5, donde 0,0 significaría que todas las muestras obtuvieron el mismo resultado y 0,5 significaría que la división se realizó exactamente en el medio.
muestras = 13 significa que quedan 13 comediantes en este punto de la decisión, que son todos, ya que este es el primer paso.
valor = [6, 7] significa que de estos 13 comediantes, 6 obtendrán un «NO» y 7 obtendrán un «SI».
Gini
Hay muchas formas de dividir las muestras, usamos el método GINI en este tutorial.
El método Gini utiliza esta fórmula:
Gini = 1 – (x/n)2 + (s/n)2
Donde x es el número de respuestas positivas («GO»), n es el número de muestras e y es el número de respuestas negativas («NO»), lo que nos da este cálculo:
1 – (7/13)2 + (6/13)2 = 0,497
El siguiente paso contiene dos casillas, una casilla para los comediantes con un ‘Rango’ de 6.5 o menos, y una casilla con el resto.
Cierto: 5 comediantes terminan aquí:
gini = 0.0 significa que todas las muestras obtuvieron el mismo resultado.
muestras = 5 significa que quedan 5 comediantes en esta rama (5 comediantes con un rango de 6.5 o inferior).
valor = [5, 0] significa que 5 obtendrá un «NO» y 0 obtendrá un «SI».
Falso – 8 comediantes continúan:
Nacionalidad
Nacionalidad <= 0,5 significa que los comediantes con un valor de nacionalidad inferior a 0,5 seguirán la flecha hacia la izquierda (lo que significa que todos los del Reino Unido), y el resto seguirá la flecha hacia la derecha.
gini = 0.219 significa que alrededor del 22% de las muestras irían en una dirección.
muestras = 8 significa que quedan 8 comediantes en esta rama (8 comediantes con un Rango superior a 6.5).
valor = [1, 7] significa que de estos 8 comediantes, 1 obtendrá un «NO» y 7 obtendrán un «SI».
Cierto – 4 comediantes continúan:
Años
Edad <= 35,5 significa que los comediantes de 35,5 años o menos seguirán la flecha hacia la izquierda, y el resto seguirá la flecha hacia la derecha.
gini = 0,375 significa que alrededor del 37,5% de las muestras irían en una dirección.
muestras = 4 significa que quedan 4 comediantes en esta rama (4 comediantes del Reino Unido).
valor = [1, 3] significa que de estos 4 comediantes, 1 obtendrá un «NO» y 3 obtendrán un «SI».
Falso: 4 comediantes terminan aquí:
gini = 0.0 significa que todas las muestras obtuvieron el mismo resultado.
muestras = 4 significa que quedan 4 comediantes en esta rama (4 comediantes que no son del Reino Unido).
valor = [0, 4] significa que de estos 4 comediantes, 0 obtendrá un «NO» y 4 obtendrá un «SI».
Cierto: 2 comediantes terminan aquí:
gini = 0.0 significa que todas las muestras obtuvieron el mismo resultado.
muestras = 2 significa que quedan 2 comediantes en esta rama (2 comediantes de 35,5 años o menos).
valor = [0, 2] significa que de estos 2 comediantes, 0 obtendrá un «NO» y 2 obtendrá un «SI».
Falso – 2 comediantes continúan:
Experiencia
Experiencia <= 9.5 significa que los comediantes con 9.5 años de experiencia, o menos, seguirán la flecha hacia la izquierda y el resto seguirá la flecha hacia la derecha.
gini = 0.5 significa que el 50% de las muestras irían en una dirección.
muestras = 2 significa que quedan 2 comediantes en esta sucursal (2 comediantes mayores de 35.5).
valor = [1, 1] significa que de estos 2 comediantes, 1 obtendrá un «NO» y 1 obtendrá un «SI».
Cierto: 1 comediante termina aquí:
gini = 0.0 significa que todas las muestras obtuvieron el mismo resultado.
muestras = 1 significa que queda 1 comediante en esta rama (1 comediante con 9,5 años de experiencia o menos).
value = [0, 1] significa que 0 obtendrá un «NO» y 1 obtendrá un «SI».
Falso – 1 comediante termina aquí:
gini = 0.0 significa que todas las muestras obtuvieron el mismo resultado.
muestras = 1 significa que queda 1 comediante en esta rama (1 comediante con más de 9.5 años de experiencia).
value = [1, 0] significa que 1 obtendrá un «NO» y 0 obtendrá un «SI».
Predecir valores
Podemos usar el árbol de decisiones para predecir nuevos valores.
Ejemplo: ¿Debería ir a ver un programa protagonizado por un comediante estadounidense de 40 años, con 10 años de experiencia y un ranking de comedia de 7?
Ejemplo
Utilice el método predict() para predecir nuevos valores:
print(dtree.predict([[40, 10, 7, 1]]))
Ejemplo
¿Cuál sería la respuesta si el rango de comedia fuera 6?
print(dtree.predict([[40, 10, 6, 1]]))
Resultados diferentes
Verá que el árbol de decisión le da resultados diferentes si lo ejecuta suficientes veces, incluso si lo alimenta con los mismos datos.
Esto se debe a que el árbol de decisiones no nos da una respuesta 100 % segura. Se basa en la probabilidad de un resultado, y la respuesta variará.