2017-08-19 11 views
1

テキスト分類のパイプラインのさまざまな設定を試してみたいと思います。scikit-learn PipelineとGridSearchCVを使用しているときのエラー

私はこの

pipe = Pipeline([('c_vect', CountVectorizer()),('feat_select', SelectKBest()), 
            ('ridge', RidgeClassifier())]) 

parameters = {'c_vect__max_features': [10, 50, 100, None], 
         'feat_select__score_func': [chi2, f_classif, mutual_info_classif, SelectFdr, SelectFwe, SelectFpr], 
         'ridge__solver': ['sparse_cg', 'lsqr', 'sag'], 'ridge__tol': [1e-2, 1e-3], 'ridge__alpha': [0.01, 0.1, 1]} 

gs_clf = GridSearchCV(pipe, parameters, n_jobs=5) 
gs_clf = gs_clf.fit(clean_train_data, train_labels_list) 

をした。しかし、私はSelectFdrはここSelectKBestためのマニュアルに従って利用できる特徴選択機能の一つであると考えられるにもかかわらず、このエラーが出る:http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html

Traceback (most recent call last): 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/externals/joblib/_parallel_backends.p 
y", line 350, in __call__ 
    return self.func(*args, **kwargs) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 1 
31, in __call__ 
    return [func(*args, **kwargs) for func, args, kwargs in self.items] 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 1 
31, in <listcomp> 
    return [func(*args, **kwargs) for func, args, kwargs in self.items] 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 
437, in _fit_and_score 
    estimator.fit(X_train, y_train, **fit_params) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/pipeline.py", line 257, in fit 
    Xt, fit_params = self._fit(X, y, **fit_params) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/pipeline.py", line 222, in _fit 
    **fit_params_steps[name]) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/externals/joblib/memory.py", line 362 
, in __call__ 
    return self.func(*args, **kwargs) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/pipeline.py", line 589, in _fit_trans 
form_one 
    res = transformer.fit_transform(X, y, **fit_params) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/base.py", line 521, in fit_transform 
    return self.fit(X, y, **fit_params).transform(X) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/feature_selection/base.py", line 76, 
in transform 
    mask = self.get_support() 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/feature_selection/base.py", line 47, 
in get_support 
    mask = self._get_support_mask() 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/feature_selection/univariate_selectio 
n.py", line 503, in _get_support_mask 
    scores = _clean_nans(self.scores_) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/feature_selection/univariate_selectio 
n.py", line 30, in _clean_nans 
    scores = as_float_array(scores, copy=True) 
    File ".../anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py", line 93, in as_ 
float_array 
    return X.astype(return_dtype) 
TypeError: float() argument must be a string or a number, not 'SelectFdr' 

なぜこのようなことが起こるのか?

答えて

1

SelectFdr、SelectFwe、SelectFprは、クラス(SelectKBestなど)です。彼らはスコアリング関数ではありません。利用可能

スコアリング機能はgiven in documentationです:デフォルトの使用の採点機能f_classifによって

For regression: f_regression, mutual_info_regression 
For classification: chi2, f_classif, mutual_info_classif 

そして、それらのクラス(SelectFdr、SelectFwe、SelectFpr)。そのため、パラメータからそれらを削除する必要があります。

あなたがそれらを使用する場合:

parameters = {'c_vect__max_features': [10, 50, 100, None], 
       'feat_select':[SelectKBest(), SelectFdr(), SelectFwe(), SelectFdr()] 
       'feat_select__score_func': [chi2, f_classif, mutual_info_classif], 
       'ridge__solver': ['sparse_cg', 'lsqr', 'sag'], 
       'ridge__tol': [1e-2, 1e-3], 'ridge__alpha': [0.01, 0.1, 1]} 

お知らせ新しいのparam 「feat_select」そこに:あなたはこのようなパラメータグリッドを変更することができます。はい、GridSearchCVに送信するときにパイプライン内でトランスオブジェクトを変更することもできます。お役に立てれば。それ以上の疑問があれば質問してください。

+0

ありがとうございます!私はあなたがそれを行うことができるかどうかはわかりませんでした私はちょっと違う別の質問があります。 SelectFdrは偽陽性を減らそうとしますか?偽陰性を減らす機能はありますか?そうでない場合は、パイプライン内でポジティブと見なされるラベルを指定する方法がありますか? – Atirag

関連する問題