Árboles de decisión por etiquetas

1

Necesito hacer un árbol de decisiones y representar los datos mediante etiquetas en un gráfico (como se muestra en las dos ilustraciones). No tengo ningún problema para el árbol de decisiones, desafortunadamente, los puntos no se incluyen en el gráfico. Probé varios cambios en el código. El código proviene del sitio web scikit learn Trace la superficie de decisión de un árbol de decisión en el conjunto de datos de iris


Hay un ejemplo de los datos utilizados (X, Y, C5) a continuación (de un archivo de Excel):

Path = "Documents/Apprentissage/Python/Script/ClustAllRepres12.xlsx"
Wordbook = xlrd.open_workbook(Path)
Sheet = Wordbook.sheet_by_index(0)

X=[]
Y=[]
C5=[]

for i in range(1, Sheet.nrows):
    X.append(Sheet.cell_value(i, 0))
    Y.append(Sheet.cell_value(i, 1))
    C5.append(Sheet.cell_value(i, 8))    

X

Fuera []: [8.0, 9.0, 9.0, 9.0, 9.0, 10.0, 10.0, 11.0, 11.0, 11.0, 11.0, 11.0, 12.0, 12.0, 12.0, 12.0, 12.0, 13.0, 13.0, 13.0, 14.0, 14.0, 14.0 , 15.0, 15.0, 15.0, 15.0, 16.0, 16.0, 16.0, 16.0, 17.0, 17.0, 17.0, 17.0, 18.0, 18.0, 18.0, 18.0, 18.0, 19.0, 19.0, 19.0, 19.0, 19.0, 19.0, 20.0, 21.0 , 21,0, 22,0]

type(X)

Fuera []: lista

Y

Fuera []: [45.0, 17.0, 18.0, 24.0, 25.0, 27.0, 36.0, 38.0, 39.0, 24.0, 37.0, 40.0, 24.0, 31.0, 35.0, 36.0, 37.0, 39.0, 32.0, 33.0, 35.0, 43.0, 27.0 , 31.0, 35.0, 42.0, 18.0, 39.0, 43.0, 31.0, 42.0, 28.0, 32.0, 35.0, 43.0, 51.0, 52.0, 17.0, 19.0, 53.0, 49.0, 51.0, 53.0, 58.0, 16.0, 58.0, 59.0, 50.0 , 52,0, 54,0]

type(Y)

Fuera []: lista

C5

Fuera []: [2.0, 4.0, 3.0, 3.0, 3.0, 4.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 1.0, 4.0, 1.0, 3.0 , 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 3.0, 1.0, 5.0, 1.0, 3.0, 1.0, 1.0, 4.0, 4.0, 4.0, 1.0, 5.0, 1.0, 5.0, 2.0, 5.0, 5.0, 5.0, 5.0 , 5,0, 5,0]

type(C5)

Fuera []: lista


Existe el código del sitio web scikit learn:

import pandas as pd 
import numpy as np
import xlrd
import matplotlib.pyplot as plt

df_list = pd.DataFrame(
    {'X': X,
     'Y': Y,
    }) 
df = df_list.iloc[:,0:2].values  #transform to float type 

import sklearn
from sklearn.tree import DecisionTreeClassifier, plot_tree

#parameters
n_classes = 5
plot_colors = "ryb"
plot_step = 0.02

for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],[1, 2], [1, 3], [2, 3]]):
    # We only take the two corresponding features
    X = df #gives better result without [:, pair]
    y = C5

#train
clf = DecisionTreeClassifier().fit(X, y)

#plot the decision boundary
plt.subplot(2, 3, pairidx +1)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                     np.arange(y_min, y_max, plot_step))
plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)

# Plot the training points
for i, color in zip(range(n_classes), plot_colors):
    idx = np.where(y == i)
    plt.scatter(X[idx, 0], X[idx, 1], c=color, label=C5[i],
                cmap=plt.cm.RdYlBu, edgecolor='black', s=15)
plt.suptitle("Decision surface of a decision tree using paired features")
plt.legend(loc='lower right', borderpad=0, handletextpad=0)
plt.axis("tight")
plt.figure()
clf = DecisionTreeClassifier().fit(df_list, C5)
plot_tree(clf, filled=True)
plt.show()

Ahí está el gráfico que tengo :

ingrese la descripción de la imagen aquí

Como puede ver, los puntos no están representados en los gráficos. Doy un ejemplo del resultado esperado :

ingrese la descripción de la imagen aquí

6
  • 1
    Recuerde que las mejores preguntas contienen un ejemplo reproducible, pero que el ejemplo en cuestión también es mínimo.
    PiRocks
    9/12/19 a las 19:22
  • 1
    Entonces, ¿cuál es tu problema exactamente? 9/12/19 a las 19:23
  • Tienes que limitar tu problema a una cosa específica. ¿Dónde está la primera parte en la que las cosas están mal / incompletas?
    smci
    9/12/19 a las 19:33
  • He desarrollado la pregunta, también he ampliado el conjunto de datos @PiRocks 10/12/19 a las 12:01
  • El problema es que no hay puntos en los gráficos de salida (he agregado una imagen de mi salida) @NicolasGervais 10 dic 2019 a las 12:02
0

idx = np.where(y == i)

En esta línea, y es una lista Para devolver el índice de la lista que es igual a i (variable) Simplemente convierta a la lista en una matriz, todo funcionará bien

Así que solo agregue esta línea antes de trazar el diagrama de dispersión

**y = np.asarray(y)** # convert list to array since where will work for array only
# Plot the training points
for i, color in .....