GridSearch для оценки внутри OneVsRestClassifier
Я хочу выполнить GridSearchCV в SVC-модели, но это использует стратегию one-vs-all. Для последней части я могу просто сделать это:
model_to_set = OneVsRestClassifier(SVC(kernel="poly"))
Моя проблема связана с параметрами. Скажем, я хочу попробовать следующие значения:
parameters = {"C":[1,2,4,8], "kernel":["poly","rbf"],"degree":[1,2,3,4]}
Чтобы выполнить GridSearchCV, я должен сделать что-то вроде:
cv_generator = StratifiedKFold(y, k=10)
model_tunning = GridSearchCV(model_to_set, param_grid=parameters, score_func=f1_score, n_jobs=1, cv=cv_generator)
Однако, я выполняю его, я получаю:
Traceback (most recent call last):
File "/.../main.py", line 66, in <module>
argclass_sys.set_model_parameters(model_name="SVC", verbose=3, file_path=PATH_ROOT_MODELS)
File "/.../base.py", line 187, in set_model_parameters
model_tunning.fit(self.feature_encoder.transform(self.train_feats), self.label_encoder.transform(self.train_labels))
File "/usr/local/lib/python2.7/dist-packages/sklearn/grid_search.py", line 354, in fit
return self._fit(X, y)
File "/usr/local/lib/python2.7/dist-packages/sklearn/grid_search.py", line 392, in _fit
for clf_params in grid for train, test in cv)
File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 473, in __call__
self.dispatch(function, args, kwargs)
File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 296, in dispatch
job = ImmediateApply(func, args, kwargs)
File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 124, in __init__
self.results = func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/sklearn/grid_search.py", line 85, in fit_grid_point
clf.set_params(**clf_params)
File "/usr/local/lib/python2.7/dist-packages/sklearn/base.py", line 241, in set_params
% (key, self.__class__.__name__))
ValueError: Invalid parameter kernel for estimator OneVsRestClassifier
В принципе, поскольку SVC находится внутри OneVsRestClassifier и что ящик оценки посылает в GridSearchCV, параметры SVC недоступны.
Чтобы выполнить то, что я хочу, я вижу два решения:
- При создании SVC каким-то образом скажите ему не использовать стратегию one-vs-one, а одно-vs-all.
- Как-то покажите GridSearchCV, что параметры соответствуют оценке внутри OneVsRestClassifier.
Мне еще предстоит найти способ сделать любую из упомянутых альтернатив. Вы знаете, есть ли способ сделать любой из них? Или, может быть, вы могли бы предложить другой способ получить тот же результат?
Спасибо!
Ответы
Ответ 1
Когда вы используете вложенные оценки с помощью поиска по сетке, вы можете охватить параметры с помощью __
в качестве разделителя. В этом случае модель SVC хранится как атрибут с именем estimator
внутри модели OneVsRestClassifier
:
from sklearn.datasets import load_iris
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import f1_score
iris = load_iris()
model_to_set = OneVsRestClassifier(SVC(kernel="poly"))
parameters = {
"estimator__C": [1,2,4,8],
"estimator__kernel": ["poly","rbf"],
"estimator__degree":[1, 2, 3, 4],
}
model_tunning = GridSearchCV(model_to_set, param_grid=parameters,
score_func=f1_score)
model_tunning.fit(iris.data, iris.target)
print model_tunning.best_score_
print model_tunning.best_params_
Это дает:
0.973290762737
{'estimator__kernel': 'poly', 'estimator__C': 1, 'estimator__degree': 2}