Использование явного (предопределенного) набора проверки для поиска в сетке с помощью 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 на этот ответ, потому что я предлагаю пакет, который я создал. Это прискорбно, учитывая, что пакет был создан специально для решения этого типа проблемы.