2016-04-17 52 views
0

我正在嘗試針對迴歸問題對文本特徵做一些特徵選擇。目前,訓練集具有〜200K的特性 - 方式太多了。我想在scikit-learn中使用一些功能選擇工具,但是我在使用scipy稀疏矩陣時遇到了問題,特別是在嘗試將f_regression評分函數傳遞給SelectKBest變壓器時。使用Scipy稀疏陣列進行F-Regression特徵選擇

看來,f_regression得分函數使用作爲參數的X特徵矩陣,y響應向量,和一個可選的center參數,該參數被默認設置爲True。我相信會解決的問題是,如果我能與center=False通過f_regressionSelectKBest變壓器,但是如果我嘗試類似:

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 

如果有人在不久的將來有這個解決方法,那將不勝感激。提前致謝閱讀。

+1

因此,如果您通過'f_regression'而不是'f_regressor',它會起作用嗎?如何使用'X,y'來製作一個封面函數或lambda,但是如果你想要的話可​​以設置'center'?而不是評估它,做一個新的功能。 – hpaulj

+0

@hpaulj:謝謝讓我放慢速度思考。當然有一個完美的解決方案 - 'functools'庫。感謝封面/ lambda功能的建議。 – kylerthecreator

回答

0

查看以上@hpaul的評論。使用functools庫和使用.partial()方法來覆蓋默認參數很有用。例如:

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

然後照常使用。