sklearn.feature_selection.SelectFwe 是如何运作的?

How does sklearn.feature_selection.SelectFwe work?

import numpy as np
from sklearn.feature_selection import SelectFwe, f_regression
from sklearn import __version__ #1.0.2

我有这个示例数据集:

X = np.array([
    [3,0,2,1],
    [7,3,0,5],
    [4,2,5,1],
    [6,2,7,3],
    [3,2,5,2],
    [6,1,1,4]
])
y = np.array([2,9,2,4,5,9])

f_regression(X, y)函数returns两个数组:

(array([ 4.68362124,  0.69456469,  2.59714175, 27.64721141]),
 array([0.09643779, 0.45148854, 0.18234859, 0.00626275]))

第一个包含我的数据集的 4 个特征的 F 统计量,第二个包含与 F 统计量关联的 p 值。

现在假设我想提取p值低于0.15的特征;我期望的是第一个和最后一个功能被选中。我想使用 SelectFwe (here the documentation) 来执行这一步,所以:

SelectFwe(f_regression, alpha=.15).fit(X, y).get_support()

不幸的是它returns array([False, False, False, True]),意思是只选择了最后一个特征。

为什么会这样?我是否误解了 SelectFwe 的工作原理?可能下面的图片有帮助:

我用来制作情节的代码:

plt.plot(
    np.linspace(0,1,101),
    [SelectFwe(f_regression, alpha=alpha).fit(X, y).get_support().sum() for alpha in np.linspace(0,1,101)]
)

plt.xlabel("alpha")
plt.ylabel("selected features")
plt.show()

source中,alpha除以特征数:

    def _get_support_mask(self):
        check_is_fitted(self)

        return self.pvalues_ < self.alpha / len(self.pvalues_)

这是因为 class 正在考虑“family-wise 错误”率,即

the probability of making one or more false discoveries

(wikipedia, my emph). You can use instead SelectFpr, "false positive rate" test, which works exactly the same but doesn't divide by the number of features. See also Issue1007.