scikit grid поиск по нескольким классификаторам python



Я хотел узнать, есть ли лучший, более встроенный способ выполнить поиск по сетке и протестировать несколько моделей в одном конвейере. Конечно, параметры моделей были бы другими, что затруднило бы мне разобраться в этом. Вот что я сделал:



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_


Однако этот подход по-прежнему дает наилучшую модель внутри каждого классификатора, а не сравнение между классификаторами.
406   3  

3 ответов:

Хотя тема немного устарела, я публикую ответ на случай, если он кому-то поможет в будущем.

Вместо того, чтобы, используя поиск по сетке отбора hyperparameter, вы можете использовать 'hyperopt' библиотека.

Пожалуйста, взгляните на раздел 2.2 этой страницы. В приведенном выше случае вы можете использовать " hp.выражение choice', чтобы выбрать один из различных конвейеров, а затем определить выражения параметров для каждого из них отдельно.

В вашей целевой функции вам нужно иметь проверку в зависимости от выбранного конвейера и возвращать оценку CV для выбранного конвейера и параметров (возможно, через cross_cal_score).

Объект trials в конце выполнения укажет наилучший конвейер и параметры в целом.

Поиск Гиперпараметрической сетки postпо нескольким моделям в scikit-learn предлагает реализацию оценщика EstimatorSelectionHelper, который может запускать различные оценки, каждая со своей собственной сеткой параметров.

Хотя решение от дубека более прямолинейно, оно не помогает при взаимодействии между параметрами элементов конвейера, которые стоят перед классификатором. Поэтому я написал вспомогательный класс для работы с ним и могу включить его в Настройки конвейера по умолчанию 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 , Если кто-то хочет проверить его.

Comments

    Ничего не найдено.