Aprendizaje automático: árbol de decisiones
Árbol de decisión
En este capítulo le mostraremos cómo hacer un "árbol de decisiones". 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.
Envejecer | Experiencia | Rango | Nacionalidad | Vamos |
36 | 10 | 9 | Reino Unido | NO |
42 | 12 | 4 | EE.UU | NO |
23 | 4 | 6 | norte | NO |
52 | 4 | 4 | EE.UU | NO |
43 | 21 | 8 | EE.UU | SÍ |
44 | 14 | 5 | Reino Unido | NO |
66 | 3 | 7 | norte | SÍ |
35 | 14 | 9 | Reino Unido | SÍ |
52 | 13 | 7 | norte | SÍ |
35 | 5 | 9 | norte | SÍ |
24 | 3 | 5 | EE.UU | NO |
18 | 3 | 7 | Reino Unido | SÍ |
45 | 9 | 9 | Reino Unido | SÍ |
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, importe los módulos que necesita y lea el conjunto de datos con pandas:
Ejemplo
Lea e imprima el conjunto de datos:
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)
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 map()
método que toma un diccionario con información sobre cómo convertir los valores.
{'UK': 0, 'USA': 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['Nationality'] = df['Nationality'].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 = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Ahora podemos crear el árbol de decisión real, ajustarlo con nuestros detalles y guardar un archivo .png en la computadora:
Ejemplo
Cree un árbol de decisiones, guárdelo como una imagen y muestre la imagen:
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()
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
Rank <= 6.5
significa que cada comediante con un rango de 6.5 o menos seguirá la
True
flecha (hacia la izquierda), y el resto seguirá la False
flecha (hacia 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.
samples = 13
significa que quedan 13 comediantes en este punto de la decisión, que son todos ya que este es el primer paso.
value = [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 - (y/n)2
Donde x
está el número de respuestas positivas ("GO"),
n
es el número de muestras y
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.
samples = 5
significa que quedan 5 comediantes en esta rama (5 comediantes con un Rango de 6.5 o menos).
value = [5, 0]
significa que 5 obtendrá un "NO" y 0 obtendrá un "SI".
Falso - 8 comediantes continúan:
Nacionalidad
Nationality <= 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.
samples = 8
significa que quedan 8 comediantes en esta rama (8 comediantes con un Rango superior a 6.5).
value = [1, 7]
significa que de estos 8 comediantes, 1 obtendrá un "NO" y 7 obtendrán un "SI".
Cierto - 4 comediantes continúan:
Envejecer
Age <= 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.
samples = 4
significa que quedan 4 comediantes en esta rama (4 comediantes del Reino Unido).
value = [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.
samples = 4
significa que quedan 4 comediantes en esta rama (4 comediantes que no son del Reino Unido).
value = [0, 4]
significa que de estos 4 comediantes, 0 obtendrá un "NO" y 4 obtendrá un "GO".
Cierto: 2 comediantes terminan aquí:
gini = 0.0
significa que todas las muestras obtuvieron el mismo resultado.
samples = 2
significa que quedan 2 comediantes en esta rama (2 comediantes de 35,5 años o menos).
value = [0, 2]
significa que de estos 2 comediantes, 0 obtendrá un "NO" y 2 obtendrá un "GO".
Falso - 2 comediantes continúan:
Experiencia
Experience <= 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.
samples = 2
significa que quedan 2 comediantes en esta sucursal (2 comediantes mayores de 35.5).
value = [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.
samples = 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.
samples = 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á.