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.
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.