我正在嘗試針對迴歸問題對文本特徵做一些特徵選擇。目前,訓練集具有〜200K的特性 - 方式太多了。我想在scikit-learn中使用一些功能選擇工具,但是我在使用scipy稀疏矩陣時遇到了問題,特別是在嘗試將f_regression
評分函數傳遞給SelectKBest
變壓器時。使用Scipy稀疏陣列進行F-Regression特徵選擇
看來,f_regression
得分函數使用作爲參數的X
特徵矩陣,y
響應向量,和一個可選的center
參數,該參數被默認設置爲True。我相信會解決的問題是,如果我能與center=False
通過f_regression
到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
變壓器的源代碼,它看起來並不像擬合函數確實爲這個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
如果有人在不久的將來有這個解決方法,那將不勝感激。提前致謝閱讀。
因此,如果您通過'f_regression'而不是'f_regressor',它會起作用嗎?如何使用'X,y'來製作一個封面函數或lambda,但是如果你想要的話可以設置'center'?而不是評估它,做一個新的功能。 – hpaulj
@hpaulj:謝謝讓我放慢速度思考。當然有一個完美的解決方案 - 'functools'庫。感謝封面/ lambda功能的建議。 – kylerthecreator