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_
Однако этот подход по-прежнему дает наилучшую модель внутри каждого классификатора, а не сравнение между классификаторами.
3 ответов:
Хотя тема немного устарела, я публикую ответ на случай, если он кому-то поможет в будущем.
Вместо того, чтобы, используя поиск по сетке отбора hyperparameter, вы можете использовать 'hyperopt' библиотека.
Пожалуйста, взгляните на раздел 2.2 этой страницы. В приведенном выше случае вы можете использовать " hp.выражение choice', чтобы выбрать один из различных конвейеров, а затем определить выражения параметров для каждого из них отдельно.
В вашей целевой функции вам нужно иметь проверку в зависимости от выбранного конвейера и возвращать оценку CV для выбранного конвейера и параметров (возможно, через cross_cal_score).
Объект trials в конце выполнения укажет наилучший конвейер и параметры в целом.
Поиск Гиперпараметрической сетки postпо нескольким моделям в scikit-learn предлагает реализацию оценщика
EstimatorSelectionHelper, который может запускать различные оценки, каждая со своей собственной сеткой параметров.
Хотя решение от дубека более прямолинейно, оно не помогает при взаимодействии между параметрами элементов конвейера, которые стоят перед классификатором. Поэтому я написал вспомогательный класс для работы с ним и могу включить его в Настройки конвейера по умолчанию scikit. Минимальный пример:
Он также может быть использован для других элементов конвейера, а не только для классификатора. Код находится на github , Если кто-то хочет проверить его.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_)
Comments