Aprendizaje automático - Árbol de decisión


Árbol de decisiones (Decision Tree)

En este capítulo, le mostraremos cómo crear un "árbol de decisiones". Un árbol de decisiones es un diagrama de flujo que le ayuda a tomar decisiones basadas en su experiencia anterior.

En este ejemplo, una persona intentará decidir si debe participar en el programa de comedia.

Por suerte, en nuestro ejemplo, la persona en cuestión se registra cada vez que se presenta un programa de comedia en el pueblo, y también registra información sobre los actores de comedia, y también indica si ha estado allí.

Edad Experiencia 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

Ahora, basado en este conjunto de datos, Python puede crear un árbol de decisiones, que se puede usar para decidir si vale la pena asistir a cualquier nuevo espectáculo.

Principio

Primero, importamos los módulos necesarios y leemos el conjunto de datos usando pandas:

实例

Leer y imprimir 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 crear un árbol de decisiones, todos los datos deben ser números.

Debemos convertir las columnas no numéricas 'Nationality' y 'Go' a valores numéricos.

Pandas tiene un map() Método, que acepta un diccionario que contiene información sobre cómo convertir los valores.

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

Representa cambiar el valor 'UK' a 0, 'USA' a 1 y 'N' a 2.

实例

Cambiar los valores de cadena a números:

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, debemos separar las columnas de características de la columna de objetivo.

Las columnas de características son las columnas de las que intentamos predecir, y la columna de objetivo es la columna con los valores que intentamos predecir.

实例

X es la columna de características, y y es la columna de objetivo:

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

运行实例

Ahora, podemos crear el árbol de decisiones real, ajustarlo a nuestros detalles y luego guardar un archivo .png en el ordenador:

实例

Crea un árbol de decisiones, guárdalo como imagen y muestra 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()

运行实例

Explicación de los resultados

El árbol de decisiones usa tus decisiones anteriores para calcular la probabilidad de que quieras ver a un actor cómico.

Vamos a leer diferentes aspectos del árbol de decisiones:


Rank

Rank <= 6.5 Representa que los actores cómicos con un rango inferior o igual a 6.5 seguirán True flecha (hacia la izquierda), y el resto sigue False flecha (hacia la derecha).

gini = 0.497 Representa la calidad de la división y siempre es un número entre 0.0 y 0.5, donde 0.0 representa que todos los ejemplos obtuvieron el mismo resultado, y 0.5 representa que la división se realiza completamente en el medio.

samples = 13 Representa que en este punto de decisión aún quedan 13 actores cómicos, ya que es el primer paso, por lo que todos son actores cómicos.

value = [6, 7] Representa que de 13 actores cómicos, 6 obtendrán "NO" y 7 obtendrán "GO".

Gini

Hay muchos métodos para dividir ejemplos, en este tutorial usamos el método GINI.

El método Gini utiliza la siguiente fórmula:

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

Donde, x es la cantidad de respuestas afirmativas ("GO"), n es la cantidad de ejemplos, y y es la cantidad de respuestas negativas ("NO"), se calcula con la siguiente fórmula:

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


El siguiente paso incluye dos cuadros, uno para actores cómicos con un 'Rank' de 6.5 o inferior, y el resto en otro cuadro.

True - 5 actores cómicos terminan aquí:

gini = 0.0 Representa que todos los ejemplos obtuvieron el mismo resultado.

samples = 5 Representa que en esta rama aún quedan 5 actores cómicos (5 actores con un rango de 6.5 o inferior).

value = [5, 0] lo que significa que 5 recibirán "NO" y 0 recibirán "GO".

False - 8 actores de teatro continúan:

Nationality (nacionalidad)

Nationality <= 0.5 lo que significa que los actores de comedia con un valor de nacionalidad menor o igual a 0.5 seguirán la flecha a la izquierda (lo que significa todos los que vienen de Gran Bretaña), y el resto seguirán la flecha a la derecha.

gini = 0.219 lo que significa que aproximadamente el 22% de las muestras se moverán en una dirección.

samples = 8 lo que significa que aún quedan 8 actores de comedia en esta rama (8 actores de comedia con una calificación superior a 6.5).

value = [1, 7] lo que significa que en estos 8 actores de comedia, 1 recibirá "NO", y 7 recibirán "GO".


True - 4 actores de teatro continúan:

Age (edad)

Age <= 35.5 lo que significa que los actores de comedia de 35.5 años o menos seguirán la flecha a la izquierda, y el resto seguirán la flecha a la derecha.

gini = 0.375 lo que significa que aproximadamente el 37.5% de las muestras se moverán en una dirección.

samples = 4 lo que significa que aún quedan 4 actores de comedia en esta rama (4 actores de comedia de Gran Bretaña).

value = [1, 3] lo que significa que en estos 4 actores de comedia, 1 recibirá "NO", y 3 recibirán "GO".

False - 4 actores de comedia aquí terminan:

gini = 0.0 表示所有样本都得到相同的结果。

samples = 4 lo que significa que aún quedan 4 actores de comedia en esta rama (4 actores de comedia de Gran Bretaña).

value = [0, 4] lo que significa que en estos 4 actores de comedia, 0 recibirá "NO", y 4 recibirá "GO".


True - 2 actores de comedia aquí terminan:

gini = 0.0 表示所有样本都得到相同的结果。

samples = 2 lo que significa que aún quedan 2 actores de comedia en esta rama (2 actores de comedia de 35.5 años o más jóvenes).

value = [0, 2] lo que significa que en estos 2 actores de comedia, 0 recibirá "NO", y 2 recibirá "GO".

False - 2 actores de teatro continúan:

Experience (experiencia)

Experience <= 9.5 lo que significa que los actores de comedia con 9.5 años de experiencia o más seguirán la flecha a la izquierda, y el resto seguirán la flecha a la derecha.

gini = 0.5 lo que significa que el 50% de las muestras se moverán en una dirección.

samples = 2 lo que significa que aún quedan 2 actores de comedia en esta rama (2 actores de comedia mayores de 35.5 años).

value = [1, 1] lo que significa que 1 de estos 2 actores de comedia recibirá "NO", y 1 recibirá "GO".


True - 1 actor de comedia aquí termina:

gini = 0.0 表示所有样本都得到相同的结果。

samples = 1 表示此分支中还剩下 1 名喜剧演员(1 名具有 9.5 年或以下经验的喜剧演员)。

value = [0, 1] 表示 0 表示 "NO",1 表示 "GO"。

False - 1 名喜剧演员到这里为止:

gini = 0.0 表示所有样本都得到相同的结果。

samples = 1 表示此分支中还剩下 1 位喜剧演员(其中 1 位具有超过 9.5 年经验的喜剧演员)。

value = [1, 0] 表示 1 表示 "NO",0 表示 "GO"。

预测值

我们可以使用决策树来预测新值。

例如:我是否应该去看一个由 40 岁的美国喜剧演员主演的节目,该喜剧演员有 10 年的经验,喜剧排名为 7?

实例

使用 predict() 方法来预测新值:

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

运行实例

实例

如果喜剧等级为 6,答案是什么?

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

运行实例

不同的结果

如果运行足够多次,即使您输入的数据相同,决策树也会为您提供不同的结果。

这是因为决策树无法给我们 100% 的肯定答案。它基于结果的可能性,答案会有所不同。