我正在尝试针对回归问题对文本功能进行一些功能选择。目前,训练集具有约200K的功能 - 方式太多。我想在scikit-learn中使用一些特征选择工具,但我在使用scipy稀疏矩阵时遇到问题,特别是在尝试将f_regression
评分函数传递给SelectKBest
变换器时。
f_regression
评分函数似乎将X
特征矩阵,y
响应向量和可选center
参数作为参数,设置为True默认情况下。我相信如果我可以将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
时,它会立即返回特征的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
如果有人在不久的将来有解决方法,那将非常感激。提前感谢您阅读。
答案 0 :(得分:0)
请参阅上面@hpaul的评论。使用functools
库并使用.partial()
方法覆盖默认参数非常有效。类似的东西:
f_regress = functools.partial(f_regression, center=False)
feature_selector = SelectKBest(f_regress, k=k)
然后正常使用。