Stacking StandardScaler () с помощью RFECV и GridSearchCV - PullRequest
0 голосов
/ 07 января 2019

Итак, я обнаружил, что StandardScaler () может ускорить выполнение моего RFECV в моем GridSearchCV при каждом вложенном трехкратном перекрестном подтверждении. Без 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 (), чтобы она нормализовала данные каждый раз, а не только один раз (?). Пожалуйста, исправьте меня, если я ошибаюсь или мой конвейер неверен и, следовательно, почему он все еще работает в течение длительного времени.

У меня есть 8000 строк из 145 объектов, которые должны быть удалены с помощью RFECV, и 6 C-значений, которые должны быть удалены с помощью GridSearchCV. Таким образом, для каждого значения C лучший набор характеристик определяется RFECV.

Спасибо!

Обновление:

Итак, я поместил StandardScaler в RFECV следующим образом:

 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: Неверный параметр C для конвейера оценки (память = нет, steps = [('standardcaler', StandardScaler (copy = True, with_mean = True,> with_std = True)), ('svc', SVC (C = 1.0, cache_size = 200, class_weight = Нет,> coef0 = 0.0, solution_function_shape = 'ovr', степень = 3, гамма = 'auto', ядро ​​= 'linear', max_iter = -1, вероятность = Ложь, random_state = Нет, сокращение = Истина, tol = 0,001, многословно = False))]). Проверьте список доступных параметров с помощью> estimator.get_params().keys().

1 Ответ

0 голосов
/ 07 января 2019

Кумар прав. Кроме того, что вы, возможно, захотите сделать, включите verbose в GridSearchCV. Кроме того, вы можете добавить ограничение на число итераций SVC, начиная с очень небольшого числа, например 5, просто чтобы убедиться, что проблема не в сходимости.

...