Подтвердить что ты не робот

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.

Мне еще предстоит найти способ сделать любую из упомянутых альтернатив. Вы знаете, есть ли способ сделать любой из них? Или, может быть, вы могли бы предложить другой способ получить тот же результат?

Спасибо!

4b9b3361

Ответ 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}