删除熵为零的列

Removal of column with entropy equal to zero

很抱歉,如果在其他地方有人问过这个问题,但我觉得这是一个具体的问题。我正在研究一些机器学习代码以获得乐趣,并努力弄清楚如何准确地删除熵为零的列。

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)

据我了解,entropies 计算每一列的熵。接下来,我们有一个 if 语句,它应该捕获熵数组中等于零的任何值,然后将它们从数据帧中删除,但是,我不相信这是被拾取的,也无法弄清楚为什么。

no_column_leftone_animal_left 应该注册一个 TrueFalse 是否每个都已经达到。然后在下面的 if 语句中使用它们来确定我们是否已经到达树的末尾。如果不是,我们将使用接下来的三行代码计算减少的数据帧的新熵。

要将所选列添加到树中,我们将其转换为字符串并将其添加到树中。

最终,我的问题是,我做错了什么,以至于每个减少的数据帧的输出都包含熵为零的列?非常感谢任何指导。

我还在下面给出了一些输出,看看到底是什么问题。

[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]

熵衡量随机变量的不确定性。 如果你有一个概率为 1 的 class,那么熵会减少到 sum(p * log(p)) = 1 * log(1) = 0,这是正确的。

您应该能够获得具有非零熵的列和没有

的列
data = data.loc[:, entropy != 0]