0

そのため、StandardScaler() を使用すると、ネストされた 3 分割クロス検証をそれぞれ高速に実行して、GridSearchCV 内に RFECV を作成できることがわかりました。StandardScaler() がなければ、私のコードは 2 日以上実行されていたので、キャンセルして StandardScaler をプロセスに挿入することにしました。しかし、今では 4 時間以上実行されており、正しく実行できたかどうかはわかりません。これが私のコードです:

# Choose Linear SVM as classifier
LSVM = SVC(kernel='linear')

selector = RFECV(LSVM, step=1, cv=3, scoring='f1')

param_grid = [{'estimator__C': [0.001, 0.01, 0.1, 1, 10, 100]}]

clf = make_pipeline(StandardScaler(), 
                GridSearchCV(selector,
                             param_grid,
                             cv=3,
                             refit=True,
                             scoring='f1'))

clf.fit(X, Y)

正直に言うと、StandardScaler() を GridSearchCV() 関数内に配置して、1 回だけでなく (?) フォールドごとにデータを正規化する必要があると思うので、正しくないと思います。私が間違っている場合、またはパイプラインが間違っている場合は修正してください。

RFECV によってプルーニングされる 145 個のフィーチャの 8,000 行と、GridSearchCV によってプルーニングされる 6 つの C 値があります。したがって、各 C 値について、最適な機能セットは RFECV によって決定されます。

ありがとう!

アップデート:

したがって、次のように RFECV 内に StandardScaler を配置します。

 clf = SVC(kernel='linear')

 kf = KFold(n_splits=3, shuffle=True, random_state=0)  

 estimators = [('standardize' , StandardScaler()),
               ('clf', clf)]

 class Mypipeline(Pipeline):
     @property
     def coef_(self):
         return self._final_estimator.coef_
     @property
     def feature_importances_(self):
         return self._final_estimator.feature_importances_ 

 pipeline = Mypipeline(estimators)
 rfecv = RFECV(estimator=pipeline, cv=kf, scoring='f1', verbose=10)

 param_grid = [{'estimator__svc__C': [0.001, 0.01, 0.1, 1, 10, 100]}]

 clf = GridSearchCV(rfecv, param_grid, cv=3, scoring='f1', verbose=10)

しかし、それでも次のエラーがスローされます。

ValueError: エスティメータ Pipeline(memory=None, steps=[('standardscaler', StandardScaler(copy=True, with_mean=True, >with_std=True)), ('svc', SVC(C=1.0, cache_size) のパラメータ C が無効です=200、class_weight=なし、>coef0=0.0、decision_function_shape='ovr'、次数=3、ガンマ='auto'、カーネル='linear'、max_iter=-1、確率=False、random_state=なし、縮小=True 、tol=0.001、verbose=False))])。> で使用可能なパラメーターのリストを確認しますestimator.get_params().keys()

4

1 に答える 1

-1

クマールは正しい。また、GridSearchCVでverboseをオンにします。また、収束に問題がないことを確認するためだけに、5 などの非常に小さな数から始めて、SVC の反復回数に制限を追加することもできます。

于 2019-01-07T15:05:48.653 に答える