Проблемы вывода GridSearchCV в Scikit-learn - PullRequest
2 голосов
/ 02 августа 2020

Я хотел бы выполнить поиск гиперпараметров для выбора шагов предварительной обработки и моделей в sklearn следующим образом:

pipeline = Pipeline([("combiner", PolynomialFeatures()),
                     ("dimred", PCA()),
                     ("classifier", RandomForestClassifier())])

parameters = [{"combiner": [None]},
              {"combiner": [PolynomialFeatures()], "combiner__degree": [2], "combiner__interaction_only": [False, True]},

              {"dimred": [None]},
              {"dimred": [PCA()], "dimred__n_components": [.95, .75]},

              {"classifier": [RandomForestClassifier(n_estimators=100, class_weight="balanced")],
               "classifier__max_depth": [5, 10, None]},
              {"classifier": [KNeighborsClassifier(weights="distance")],
               "classifier__n_neighbors": [3, 7, 11]}]

CV = GridSearchCV(pipeline, parameters, cv=5, scoring="f1_weighted", refit=True, n_jobs=-1)
CV.fit(train_X, train_y)

Конечно, мне нужны результаты с лучшим конвейером с лучшими параметрами. Однако, когда я запрашиваю лучшие оценки с помощью CV.best_estimator_, я получаю только выигрышные компоненты, а не гиперпараметры:

Pipeline(steps=[('combiner', None), ('dimred', PCA()),
                ('classifier', RandomForestClassifier())])

Когда я распечатываю CV.best_params_, я получаю еще более короткую информацию (только с первый элемент Pipeline, combiner, без информации о dimred, classifier вообще):

{'combiner': None}

Как я могу получить лучшую комбинацию конвейера с компонентами и их гиперпараметрами?

Ответы [ 2 ]

1 голос
/ 02 августа 2020
Объекты

Pipeline имеют метод get_params(), который возвращает параметры конвейера. Сюда также входят параметры отдельных шагов. Основываясь на вашем примере, команда

CV.best_estimator_.get_params()

извлечет все параметры конвейера лучшей оценки, включая те, которые вы ищете.

0 голосов
/ 02 августа 2020

Поскольку ваш param_grid представляет собой список словарей, каждый такой словарь дает отдельную сетку, и поиск происходит по непересекающемуся объединению этих сеток. Таким образом, best_estimator_ и best_params_ в вашем случае соответствуют одноточечной сетке с combiner=None и всем остальным, как определено в исходном pipeline. (И поиск никогда не исследовал combiner=None с другими гиперпараметрами.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...