删除熵为零的列
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_left
和 one_animal_left
应该注册一个 True
或 False
是否每个都已经达到。然后在下面的 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]
很抱歉,如果在其他地方有人问过这个问题,但我觉得这是一个具体的问题。我正在研究一些机器学习代码以获得乐趣,并努力弄清楚如何准确地删除熵为零的列。
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_left
和 one_animal_left
应该注册一个 True
或 False
是否每个都已经达到。然后在下面的 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]