Disculpas si esto se ha hecho en otro lugar, pero parece una pregunta específica. Estoy trabajando en un código de aprendizaje automático por diversión y luchando por descubrir cómo eliminar exactamente una columna con entropía de cero.

def generate_tree(data, tree, branch="", parent="root"):

  entropies = [binary_entropy(data.iloc[:,i]) for i in range(len(data.iloc[0]))]

  if np.argmin(entropies) == 0:
    data = data.drop(data.columns[np.argmin(entropies)])

  no_column_left = (len(data.columns) == 0)
  one_animal_left = (len(data.index) == 1)

  if no_column_left or one_animal_left:
    tree.create(branch+", ".join(data.index), parent=parent)
    return

  data = data.loc[data.loc[:,data.columns[np.argmax(entropies)]] == 1]
  data = data.drop(data.columns[np.argmax(entropies)], axis = 1)
  entropies = [binary_entropy(data.iloc[:,i]) for i in range(len(data.iloc[0]))]

  selected_column = str(data.columns[np.argmax(entropies)])
  node = tree.create_node(branch+selected_column, parent=parent)
  mask = data.columns

  generate_tree(data[mask], tree, branch="+", parent = node)

  generate_tree(data[~mask], tree, branch="-", parent = node)

Entonces, según tengo entendido, entropies calcula las entropías para cada columna. A continuación, tenemos una declaración if que debería capturar cualquier valor en la matriz de entropías igual a cero y luego eliminarlos del marco de datos, sin embargo, no creo que esto se esté recogiendo y no puedo entender por qué.

no_column_left y one_animal_left deben registrar un True o False en cuanto a si se ha logrado cada uno. Luego, se utilizan en la siguiente declaración if para determinar si hemos llegado al final del árbol. Si no, debemos calcular las nuevas entropías del marco de datos reducido con las siguientes tres líneas de código.

Para agregar la columna seleccionada al árbol, la convertimos en una cadena y se agrega al árbol.

En última instancia, mi pregunta aquí es, ¿qué estoy haciendo mal para que la salida de cada marco de datos reducido siga incluyendo columnas con entropía cero? Cualquier orientación muy apreciada.

También doy algunos resultados a continuación, así que vea cuál es exactamente el problema.

[1.         0.91829583 0.91829583 0.81127812 0.97986876 0.97986876]
[1]
          can it fly?  is it a vertebrate?  is it endangered?  does it live in groups?  does it have hair?
cat                 0                    1                  0                        0                   1
duck                1                    1                  0                        1                   0
eagle               1                    1                  1                        0                   0
elephant            0                    1                  1                        1                   0
man                 0                    1                  1                        1                   1
rabbit              0                    1                  0                        1                   1
[0.91829583 0.         1.         0.91829583 1.        ]

[0.91829583 0.         1.         0.91829583 1.        ]
[1]
          can it fly?  is it a vertebrate?  does it live in groups?  does it have hair?
eagle               1                    1                        0                   0
elephant            0                    1                        1                   0
man                 0                    1                        1                   1
[0.91829583 0.         0.91829583 0.91829583]

[0.91829583 0.         0.91829583 0.91829583]
[0 1 2]
       is it a vertebrate?  does it live in groups?  does it have hair?
eagle                    1                        0                   0
[0 0 0]

[0 0 0]
0
Keebles 12 mar. 2021 a las 17:59

1 respuesta

La mejor respuesta

La entropía mide la incertidumbre de una variable aleatoria. Si tiene una clase con probabilidad 1, entonces la entropía se reduce a sum(p * log(p)) = 1 * log(1) = 0, esto es correcto.

Debería poder obtener las columnas con Hentropy distinto de cero con las columnas que no tienen

data = data.loc[:, entropy != 0]
0
user12750353 12 mar. 2021 a las 15:33