使用 Scipy 稀疏数组的 F 回归特征选择

F-Regression Feature Selection Using Scipy Sparse Arrays

我正在尝试针对回归问题对文本特征进行一些特征选择。目前,训练集有大约 20 万个特征——太多了。我想使用 scikit-learn 中的一些特征选择工具,但我在使用 scipy 稀疏矩阵时遇到问题,尤其是在尝试将 f_regression 评分函数传递给 SelectKBest 变压器.

似乎 f_regression 评分函数将一个 X 特征矩阵、一个 y 响应向量和一个可选的 center 参数作为参数,该参数被设置默认情况下为真。我相信如果我可以将 f_regressioncenter=False 传递给 SelectKBest 转换器,那么可以解决问题,但是如果我尝试类似的方法:

f_regressor = f_regression(X, y, center=False)
feature_selector = SelectKBest(f_regressor, k=k)
selected_features = feature_selector.fit_transform(X, y)

我收到一条错误消息,指出评分函数不可调用。我假设这是因为当我将它初始化为 f_regress 时,它会立即 returns 特征的 p 值和 f 分数。

此外,在 SelectKBest 转换器的源代码中,fit 函数看起来并没有对这个 center 参数进行任何检查,所以我没有看到任何直接的方法将带有 center=False 的评分函数传递给转换器:

# Abbreviated from the sklearn source
def fit(self, X, y):
    X, y = check_X_y(X, y, ['csr', 'csc'])

    # Error I've been getting when instantiating the f_regressor - not callable
    if not callable(self.score_func):
        raise TypeError("The score function should be a callable, %s (%s) "
                        "was passed."
                        % (self.score_func, type(self.score_func)))

    self._check_params(X, y)

    """Score func gets called here - only on X and y, assuming center=True.
    Maybe some argument checking could happen here in the future?
    Not sure if `center` argument could be passed as attribute via
    the constructor?
    """

    score_func_ret = self.score_func(X, y)
    if isinstance(score_func_ret, (list, tuple)):
        self.scores_, self.pvalues_ = score_func_ret
        self.pvalues_ = np.asarray(self.pvalues_)
    else:
        self.scores_ = score_func_ret
        self.pvalues_ = None

    self.scores_ = np.asarray(self.scores_)

    return self

如果有人在不久的将来对此有解决方法,我们将不胜感激。提前感谢阅读。

请参阅上面@hpaul 的评论。使用 functools 库并使用 .partial() 方法覆盖默认参数效果很好。类似于:

f_regress = functools.partial(f_regression, center=False)
feature_selector = SelectKBest(f_regress, k=k)

然后正常使用