Поиск по сетке гиперпараметров SVM-анова и получение выбранной функции в Sklearn

В документе sklearn есть пример SVM-Anova. Я хочу дополнительно сделатьGridSearchCV для гиперпараметров, идентификатора, C и гаммы для SVM для каждого процентиля функций, используемых в примере, например:

transform = feature_selection.SelectPercentile(feature_selection.f_classif)
clf = Pipeline([('anova', transform), 
                ('normal',preprocessing.StandardScaler()),
                ('svc', svm.SVC())])
parameters = {
'svc__gamma': (1e-3, 1e-4),
'svc__C': (1, 10, 100, 1000)
}      

percentiles = (1, 3, 6, 10, 15, 20, 30, 40, 60, 80, 100)
for percentile in percentiles:
    clf.set_params(anova__percentile=percentile)
    search = GridSearchCV(clf, parameters,cv=StratifiedKFold(y,7,shuffle=True, random_state=5), scoring='roc_auc', n_jobs=1)
    search.fit(X,y)

Он отлично работает, делая это, я могу одновременно настраивать параметры Anova и SVM и использовать эту пару параметров для построения моей окончательной модели.

Тем не менее, я смущен тем, как это работает. Сначала он разделяет данные и проходит через конвейер? Если да, то как я могу определить функции, выбранные Anova, если я хочу получить более полное представление об этих выбранных функциях?

Скажем, я получаю лучшую оценку CV, используя пару параметров (процентиль для Anova и C/gamma для SVM), как я могу узнать, какие именно функции были сохранены в этих настройках? Потому что каждая настройка параметров была протестирована в CV, каждая из которых содержит складки с разными данными обучения и, следовательно, с другим набором функций, которые должны быть оценены Anova.

Один из способов, который я мог бы получить, — это пересечь наборы функций, сохраненные в каждом сгибе, для этой наиболее эффективной пары параметров, но я не знаю, как изменить код для этого.

Любые предложения или сомнения по поводу метода приветствуются.


person Francis    schedule 19.04.2015    source источник


Ответы (1)


Вы можете избавиться от цикла по процентилям и просто поместить процентили в сетку параметров. Затем вы можете посмотреть на выбранные функции search.best_estimator_, то есть search.best_estimator_.named_steps['anova'].get_support()

person Andreas Mueller    schedule 23.04.2015
comment
Спасибо! Но как он определяет окончательные выбранные функции? Лучший оценщик поставляется с лучшим процентилем, который максимизирует оценку CV, но этот конкретный процентиль выбирает разные функции в разных разделах сгиба в CV, как я могу определить окончательный подмножество функций? - person Francis; 07.07.2015
comment
Он был переобучен на всей обучающей выборке после нахождения наилучших параметров. - person Andreas Mueller; 07.07.2015
comment
так что это означает, что в этом случае он переустанавливает лучший параметр для всего набора данных X, в то время как перекрестная проверка выполнялась для каждого раздела сгиба (частичный набор данных) для процентилей-кандидатов? - person Francis; 07.07.2015
comment
Спасибо. Но могу я спросить, зачем определять финальное подмножество функций таким образом? Почему бы не использовать схему голосования, например, аккумулируя подмножество признаков по всем кратным разделам, каждый из которых выбирается ниже порога наилучшего процентиля. Затем мы можем ранжировать вхождения функций в накопленном подмножестве функций. - person Francis; 08.07.2015
comment
Это было бы возможно, но это не стандартный способ использования перекрестной проверки. Вместо этого это был бы подход к упаковке. - person Andreas Mueller; 09.07.2015