我注意到sklearn mutual_info_classif函数中的行为与我在互信息目标中的期望不一致。
给定一组列[' a ', 'B', 'C']和一个因变量y,计算的互信息可以是所有特征与y(单个标量)之间的互信息,也可以是单个特征与y(标量列表)之间的互信息。基于此,我不确定sklearn返回给我的值是什么,因为值随着特征的顺序而变化,它随着输入的特征数量而变化。
- sklearn给出的互信息值(特征和因变量之间)随着列的排序而变化。例如,以下查询给出不同的输出。
feature_scores = mutual_info_classif(X[['A', 'B', 'C']], y, random_state=0)
feature_scores
array([0. , 0.13, 0.045])
feature_scores = mutual_info_classif(X[['A', 'C', 'B']], y, random_state=0)
feature_scores
array([0. , 0.017, 0.14]
- 另一个意想不到的行为是改变特性集会改变互信息值。
feature_scores = mutual_info_classif(X[['A', 'B']], y, random_state=0)
feature_scores
array([0. , 0.14])
feature_scores = mutual_info_classif(X[['A', 'B', 'C']], y, random_state=0)
feature_scores
array([0. , 0.13, 0.045])
谁能给我解释一下这种行为,为什么这是正确的?
mutual_info_classif
可能使用单个随机数生成器,这意味着改变处理数据的数量和顺序会改变随机值用于计算互信息的方式。
为了避免这种情况,您可以一次只计算每个列的MI。