Я изо всех сил пытаюсь объединить Sequential Feature Selector (из mlxtend) с GridSearchCV (из sklearn).
Моя цель - выполнить прямой выбор функции для каждого набора параметров, чтобы найти, какая комбинация параметров и функций дает лучший результат.Следующий код основан на примере 8 руководства пользователя из mlxtend (см. http://rasbt.github.io/mlxtend/user_guide/feature_selection/SequentialFeatureSelector/#example-8-sequential-feature-selection-and-gridsearch)
X = data.values #dataframe with 48 features and 200 rows
y = diags #binary classification for each row
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0)
svm = svm.SVC()
sfs = SFS(estimator = svm,
k_features = (1,len(data.columns)),
forward = True,
floating=False,
scoring = 'f1',
cv = 5)
pipe = Pipeline([
('sfs', sfs),
('svm', svm)
])
param_grid = [
{
'sfs__estimator__C': [0.001, 0.01, 0.1, 1, 10, 100, 1000],
'sfs__estimator__gamma': ['auto', 'scale', 0.001, 0.0001],
'sfs__estimator__kernel': ['linear', 'rbf'],
}
]
gs = GridSearchCV(estimator = pipe,
param_grid = param_grid,
scoring = 'f1',
n_jobs=1,
cv=5,
refit = True)
gs.fit(X_train, y_train)
print("Best parameters via GridSearch", gs.best_params_)
print("\nBest features:\n", gs.best_estimator_.steps[0][1].k_feature_idx_)
print("\nBest score:\n", gs.best_estimator_.steps[0][1].k_score_)
. При выполнении этого кода я получаю следующее:
Best parameters via GridSearch {'sfs__estimator__gamma': 'auto', 'sfs__estimator__kernel': 'linear', 'sfs__estimator__C': 0.001}
Best features:
(16, 39)
Best score:
0.31333333333333335
Я сомневался, что это былинаилучшие результаты, так как я на самом деле получал лучшие результаты при установке более высокого минимального количества объектов.
Я заметил, что изменение порядка сетки параметров изменило результаты. При использовании:
param_grid = [
{
# Notice the change of order for C, 0.01 is now first
'sfs__estimator__C': [0.01, 0.001, 0.1, 1, 10, 100, 1000],
'sfs__estimator__gamma': ['auto', 'scale', 0.001, 0.0001],
'sfs__estimator__kernel': ['linear', 'rbf'],
}
]
Я получил следующие результаты:
Best parameters via GridSearch {'sfs__estimator__gamma': 'auto', 'sfs__estimator__kernel': 'linear', 'sfs__estimator__C': 0.01}
Best features:
(16, 39)
Best score:
0.4428571428571429
Лучшие параметры, кажется, всегда возвращают первое значение каждого параметра. Я пробовал другие комбинации и параметры, где всегда были первые, и лучшие функции неизменить.
Я неправильно использую GridSearchCV? Или я печатаю неправильные атрибуты?