46

SVC モデルで GridSearchCV を実行したいのですが、それは 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 のパラメーターにはアクセスできません。

私が望むことを達成するために、私は2つの解決策を見ています:

  1. SVC を作成するときは、1 対 1 の戦略ではなく、1 対すべての戦略を使用するように何らかの方法で指示します。
  2. パラメーターが OneVsRestClassifier 内の推定器に対応することを GridSearchCV に何らかの方法で示します。

言及された代替手段のいずれかを実行する方法をまだ見つけていません。それらのいずれかを行う方法があるかどうか知っていますか? または、同じ結果を得るための別の方法を提案できますか?

ありがとう!

4

3 に答える 3

76

ネストされたエスティメータをグリッド検索で使用する場合__、セパレータとしてパラメータのスコープを設定できます。この場合、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}
于 2012-09-28T09:44:20.717 に答える