Использование явного (предопределенного) набора проверки для поиска в сетке с помощью sklearn

У меня есть набор данных, который ранее был разделен на 3 набора: тренировка, проверка и тестирование. Эти наборы должны использоваться как дано для сравнения производительности по различным алгоритмам.

Теперь я хотел бы оптимизировать параметры моего SVM, используя набор проверки. Тем не менее, я не могу найти, как явно ввести набор проверки в sklearn.grid_search.GridSearchCV(). Ниже приведен код, который я ранее использовал для перекрестной проверки K-Fold на тренировочном наборе. Тем не менее, для этой проблемы мне нужно использовать набор проверки, как указано. Как я могу это сделать?

from sklearn import svm, cross_validation
from sklearn.grid_search import GridSearchCV

# (some code left out to simplify things)

skf = cross_validation.StratifiedKFold(y_train, n_folds=5, shuffle = True)
clf = GridSearchCV(svm.SVC(tol=0.005, cache_size=6000,
                             class_weight=penalty_weights),
                     param_grid=tuned_parameters,
                     n_jobs=2,
                     pre_dispatch="n_jobs",
                     cv=skf,
                     scoring=scorer)
clf.fit(X_train, y_train)

Ответ 1

Использовать PredefinedSplit

ps = PredefinedSplit(test_fold=your_test_fold)

затем установите cv=ps в GridSearchCV

test_fold: "массивоподобная форма" (n_samples,)

test_fold [i] дает сгиб тестового набора образца i. Значение -1 указывает, что соответствующая выборка не является частью каких-либо сгибов тестового набора, но вместо этого всегда будет помещаться в тренировочную сгиб.

Также смотрите здесь

при использовании набора проверки установите для test_fold значение 0 для всех выборок, являющихся частью набора проверки, и значение -1 для всех остальных выборок.

Ответ 2

Подумайте об использовании hypopt Python hypopt (pip install hypopt), pip install hypopt которого я являюсь. Это профессиональный пакет, созданный специально для оптимизации параметров с набором валидации. Он работает с любой готовой моделью scikit-learn и может также использоваться с Tensorflow, PyTorch, Caffe2 и т.д.

# Code from https://github.com/cgnorthcutt/hypopt
# Assuming you already have train, test, val sets and a model.
from hypopt import GridSearch
param_grid = [
  {'C': [1, 10, 100], 'kernel': ['linear']},
  {'C': [1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
 ]
# Grid-search all parameter combinations using a validation set.
opt = GridSearch(model = SVR(), param_grid = param_grid)
opt.fit(X_train, y_train, X_val, y_val)
print('Test Score for Optimized Parameters:', opt.score(X_test, y_test))

РЕДАКТИРОВАТЬ: Я (кажется, я) получил -1 на этот ответ, потому что я предлагаю пакет, который я создал. Это прискорбно, учитывая, что пакет был создан специально для решения этого типа проблемы.