使用 Scipy 稀疏数组的 F 回归特征选择
F-Regression Feature Selection Using Scipy Sparse Arrays
我正在尝试针对回归问题对文本特征进行一些特征选择。目前,训练集有大约 20 万个特征——太多了。我想使用 scikit-learn 中的一些特征选择工具,但我在使用 scipy 稀疏矩阵时遇到问题,尤其是在尝试将 f_regression
评分函数传递给 SelectKBest
变压器.
似乎 f_regression
评分函数将一个 X
特征矩阵、一个 y
响应向量和一个可选的 center
参数作为参数,该参数被设置默认情况下为真。我相信如果我可以将 f_regression
和 center=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)
然后正常使用
我正在尝试针对回归问题对文本特征进行一些特征选择。目前,训练集有大约 20 万个特征——太多了。我想使用 scikit-learn 中的一些特征选择工具,但我在使用 scipy 稀疏矩阵时遇到问题,尤其是在尝试将 f_regression
评分函数传递给 SelectKBest
变压器.
似乎 f_regression
评分函数将一个 X
特征矩阵、一个 y
响应向量和一个可选的 center
参数作为参数,该参数被设置默认情况下为真。我相信如果我可以将 f_regression
和 center=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)
然后正常使用