Pandas计算熵返回'-inf':成因分析与修正方法咨询
关于计算信用卡客户数据集熵时出现
-inf 的问题解答 嘿,我来帮你理清这个问题——你遇到的 -inf 熵值,本质是因为用错了计算方法,咱们一步步拆解:
为什么会出现 -inf?
首先,scipy.stats.entropy 这个函数的设计初衷是接收概率分布(也就是每个类别出现的频率,总和得是1),而不是直接丢原始数据进去。你直接传整个DataFrame的话,函数会把每列的原始数值当成概率项来计算,这就完全偏离了香农熵的计算逻辑。
当某列里有0值,或者所有取值完全相同时,计算过程中会触发 0 * log(0) 的运算——理论上这个项的极限是0,但计算机里 log(0) 直接返回 -inf,最后就得到了你看到的 -inf 结果。简单说,这些 -inf 对应的特征其实是没有分布多样性的(比如全是同一个值),理论熵应该是0,只是错误的输入方式让函数输出了异常值。
正确计算特征熵的方法
要得到正确的熵值,得先统计每个特征的取值频率,再传给熵函数。用Pandas可以这么写:
import pandas as pd from scipy.stats import entropy # 先把不需要计算的ID列去掉(如果有的话) feature_data = df.drop(columns=["ID"]) # 写个小函数计算单个特征的熵 def get_feature_entropy(series): # 统计每个取值的频率(normalize=True会转成概率) value_probs = series.value_counts(normalize=True).values # 如果特征只有一种取值,熵直接是0;否则计算熵 return entropy(value_probs) if len(value_probs) > 1 else 0.0 # 对所有特征应用这个函数 feature_entropies = feature_data.apply(get_feature_entropy)
快速修正现有结果(把 -inf 换成0)
如果你只是想快速处理当前得到的结果,用NumPy的nan_to_num就能一键替换 -inf 为0:
import numpy as np # 你原来的熵结果数组 original_entropy = np.array([10.11582214, 10.01808774, 10.25940955, 10.22181775, 10.25018627, 10.27641471, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, -np.inf, 9.15542383, 8.98160775, 8.97607359, 8.94236069, 8.94899185, 8.81999977, 8.80026465]) # 替换所有负无穷为0 corrected_entropy = np.nan_to_num(original_entropy, neginf=0) print(corrected_entropy)
这么处理后,那些原本无多样性的特征熵就会变成符合理论的0值。
最后再提醒下
以后计算特征熵的时候,一定要先转成概率分布再传进函数,不然很容易出现这种数值异常。那些 -inf 其实就是函数在告诉你“我收到的输入不对,没法算出合理的熵”~
内容的提问来源于stack exchange,提问作者JSVJ
相关产品推荐
相关产品推荐

