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

时间:2016-04-17 16:21:29

标签: python scipy scikit-learn sparse-matrix text-mining

我正在尝试针对回归问题对文本功能进行一些功能选择。目前,训练集具有约200K的功能 - 方式太多。我想在scikit-learn中使用一些特征选择工具,但我在使用scipy稀疏矩阵时遇到问题,特别是在尝试将f_regression评分函数传递给SelectKBest变换器时。

f_regression评分函数似乎将X特征矩阵,y响应向量和可选center参数作为参数,设置为True默认情况下。我相信如果我可以将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时,它会立即返回特征的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

如果有人在不久的将来有解决方法,那将非常感激。提前感谢您阅读。

1 个答案:

答案 0 :(得分:0)

请参阅上面@hpaul的评论。使用functools库并使用.partial()方法覆盖默认参数非常有效。类似的东西:

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

然后正常使用。