В документе 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.
Один из способов, который я мог бы получить, — это пересечь наборы функций, сохраненные в каждом сгибе, для этой наиболее эффективной пары параметров, но я не знаю, как изменить код для этого.
Любые предложения или сомнения по поводу метода приветствуются.