web-dev-qa-db-ja.com

複数の分類子に対するscikitグリッド検索

グリッド検索を実行し、単一のパイプラインで複数のモデルをテストするためのより組み込みの方法があるかどうかを知りたいと思いました。もちろん、モデルのパラメーターは異なりますが、これを理解するのは複雑です。これが私がしたことです:

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.grid_search import GridSearchCV


def grid_search():
    pipeline1 = Pipeline((
    ('clf', RandomForestClassifier()),
    ('vec2', TfidfTransformer())
    ))

    pipeline2 = Pipeline((
    ('clf', KNeighborsClassifier()),
    ))

    pipeline3 = Pipeline((
    ('clf', SVC()),
    ))

    pipeline4 = Pipeline((
    ('clf', MultinomialNB()),
    ))

    parameters1 = {
    'clf__n_estimators': [10, 20, 30],
    'clf__criterion': ['gini', 'entropy'],
    'clf__max_features': [5, 10, 15],
    'clf__max_depth': ['auto', 'log2', 'sqrt', None]
    }

    parameters2 = {
    'clf__n_neighbors': [3, 7, 10],
    'clf__weights': ['uniform', 'distance']
    }

    parameters3 = {
    'clf__C': [0.01, 0.1, 1.0],
    'clf__kernel': ['rbf', 'poly'],
    'clf__gamma': [0.01, 0.1, 1.0],

    }
    parameters4 = {
    'clf__alpha': [0.01, 0.1, 1.0]
    }

    pars = [parameters1, parameters2, parameters3, parameters4]
    pips = [pipeline1, pipeline2, pipeline3, pipeline4]

    print "starting Gridsearch"
    for i in range(len(pars)):
        gs = GridSearchCV(pips[i], pars[i], verbose=2, refit=False, n_jobs=-1)
        gs = gs.fit(X_train, y_train)
        print "finished Gridsearch"
        print gs.best_score_

ただし、このアプローチでも、各分類子内で最良のモデルが提供されており、分類子同士を比較していません。

30
Anuj

トピックは少し古いですが、将来誰かに役立つ場合に備えて、回答を投稿しています。

ハイパーパラメーターの選択にグリッド検索を使用する代わりに、 'hyperopt'ライブラリー を使用できます。

このページ のセクション2.2をご覧ください。上記の場合、「hp.choice」式を使用してさまざまなパイプラインを選択し、それぞれに個別にパラメーター式を定義できます。

目的関数では、選択したパイプラインに応じてチェックを行い、選択したパイプラインとパラメーターのCVスコアを返す必要があります(おそらく cross_cal_score を使用)。

実行の最後の試行オブジェクトは、全体として最高のパイプラインとパラメーターを示します。

6
Stergios

投稿 scikit-learnの複数のモデルにわたるハイパーパラメーターグリッド検索 (David S. Batistaによる)は、それぞれ独自のグリッドを持つさまざまな推定器を実行できるEstimatorSelectionHelper推定器の更新された実装を提供しますパラメータの。

18
dubek

Dubekのソリューションはより単純ですが、分類器の前にあるパイプライン要素のパラメーター間の相互作用には役立ちません。したがって、それを処理するために ヘルパークラス を記述し、scikitのデフォルトのパイプライン設定に含めることができます。最小限の例:

from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler, MaxAbsScaler
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from pipelinehelper import PipelineHelper

iris = datasets.load_iris()
X_iris = iris.data
y_iris = iris.target
pipe = Pipeline([
    ('scaler', PipelineHelper([
        ('std', StandardScaler()),
        ('max', MaxAbsScaler()),
    ])),
    ('classifier', PipelineHelper([
        ('svm', LinearSVC()),
        ('rf', RandomForestClassifier()),
    ])),
])

params = {
    'scaler__selected_model': pipe.named_steps['scaler'].generate({
        'std__with_mean': [True, False],
        'std__with_std': [True, False],
        'max__copy': [True],  # just for displaying
    }),
    'classifier__selected_model': pipe.named_steps['classifier'].generate({
        'svm__C': [0.1, 1.0],
        'rf__n_estimators': [100, 20],
    })
}
grid = GridSearchCV(pipe, params, scoring='accuracy', verbose=1)
grid.fit(X_iris, y_iris)
print(grid.best_params_)
print(grid.best_score_)

分類子だけでなく、パイプラインの他の要素にも使用できます。コードは github にあります。

8
bmurauer