互信息分类#

sklearn.feature_selection.mutual_info_classif(X, y, *, discrete_features='auto', n_neighbors=3, copy=True, random_state=None, n_jobs=None)[source]#

估计离散目标变量的互信息。

两个随机变量之间的互信息 (MI) [1] 是一个非负值,它衡量变量之间的依赖性。当且仅当两个随机变量相互独立时,它等于零,较高的值表示较高的依赖性。

该函数依赖于基于k近邻距离的熵估计的非参数方法,如[2][3]中所述。这两种方法都基于最初在[4]中提出的思想。

它可以用于单变量特征选择,更多信息请参见用户指南

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

特征矩阵。

y形状为 (n_samples,) 的类数组

目标向量。

discrete_features‘auto’,布尔值或类数组,默认为 ‘auto’

如果为布尔值,则确定是否将所有特征视为离散的或连续的。如果为数组,则它应该是一个形状为 (n_features,) 的布尔掩码或包含离散特征索引的数组。如果为 ‘auto’,则对于稠密 X 赋值为 False,对于稀疏 X 赋值为 True。

n_neighbors整数,默认为 3

用于连续变量 MI 估计的邻居数量,参见 [2][3]。较高的值会降低估计的方差,但可能会引入偏差。

copy布尔值,默认为 True

是否复制给定的数据。如果设置为 False,则初始数据将被覆盖。

random_state整数、RandomState 实例或 None,默认为 None

确定用于向连续变量添加少量噪声以去除重复值的随机数生成。传递一个整数以在多次函数调用中获得可重复的结果。参见 词汇表

n_jobs整数,默认为 None

用于计算互信息的作业数。并行化是在 X 的列上进行的。None 表示 1,除非在 joblib.parallel_backend 上下文中。-1 表示使用所有处理器。更多详情参见 词汇表

1.5 版本中新增。

返回:
mindarray,形状为 (n_features,)

以 nat 单位估计每个特征与目标之间的互信息。

备注

  1. 使用术语“离散特征”代替“分类特征”,因为它更准确地描述了本质。例如,图像的像素强度是离散特征(但几乎不是分类特征),如果将它们标记为离散特征,则会得到更好的结果。另请注意,将连续变量视为离散变量,反之亦然,通常会产生不正确的结果,因此请注意这一点。

  2. 真实的互信息不能为负。如果其估计值结果为负,则将其替换为零。

参考文献

[2] (1,2)

A. Kraskov, H. Stogbauer 和 P. Grassberger,“估计互信息”。物理评论 E 69, 2004。

[3] (1,2)

B. C. Ross “离散和连续数据集之间的互信息”。PLoS ONE 9(2), 2014。

[4]

L. F. Kozachenko, N. N. Leonenko,“随机向量的熵样本估计:”,Probl. Peredachi Inf., 23:2 (1987), 9-16

示例

>>> from sklearn.datasets import make_classification
>>> from sklearn.feature_selection import mutual_info_classif
>>> X, y = make_classification(
...     n_samples=100, n_features=10, n_informative=2, n_clusters_per_class=1,
...     shuffle=False, random_state=42
... )
>>> mutual_info_classif(X, y)
array([0.58..., 0.10..., 0.19..., 0.09... , 0.        ,
       0.     , 0.     , 0.     , 0.      , 0.        ])