そのため、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()
。