2016-04-17 10 views
0

回帰問題のテキストフィーチャーについて、いくつかのフィーチャー選択をしようとしています。現在、トレーニングセットには〜200Kの機能があります。私はscikit-learnの中で機能選択ツールのいくつかを使用したいが、f_regressionスコアリング機能をSelectKBest変圧器に渡そうとするときには、scipyの疎な行列で作業することに問題がある。Scipy Sparse Arraysを使用したF-Regressionのフィーチャーの選択

f_regressionスコアリング関数は、引数としてX機能行列、y応答ベクトルと、デフォルトでTrueに設定されているオプションのcenter引数を取ることが表示されます。

f_regressor = f_regression(X, y, center=False) 
feature_selector = SelectKBest(f_regressor, k=k) 
selected_features = feature_selector.fit_transform(X, y) 

私はスコアリング関数が呼び出すことはできませんというエラーが出ます:私は私のような何かをしようとした場合しかし、SelectKBest変圧器へcenter=Falsef_regressionを渡すことができれば、問題がある解決するだろうかと考えています。私はそれが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_regressor'の代わりに' f_regression'を渡すと機能しますか? '' X、y'を取るが、あなたが望むように 'center'をセットするカバー関数やラムダを作るのはどうでしょうか?それを評価する代わりに、新しい機能を作りましょう。 – hpaulj

+0

@hpaulj:私を遅くして考えるのに感謝します。 (もちろん) 'functools'ライブラリには完全にエレガントなソリューションがあります。カバー/ラムダ関数の提案をありがとう。 – kylerthecreator

答えて

0

@hpaulからのコメントをご覧ください。 functoolsライブラリを使用し、.partial()メソッドを使用してデフォルトの引数を上書きすると効果的です。次のようなものがあります。

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

通常通り使用してください。

関連する問題