На этом шаге мы рассмотрим особенности организации такого поиска.
В некоторых случаях перебор всех возможных комбинаций по всем параметрам, который обычно выполняет GridSearchCV, не является хорошей идеей. Например, SVC имеет параметр kernel, и в зависимости от того, какое ядро выбрано, все остальные параметры будут иметь соответствующие этому выбору значения. Если kernel='linear', модель является линейной и используется только параметр С. Если используется kernel='rbf', используются параметры C и gamma (однако другие параметры типа degree не используются). В этом случае поиск по всем возможным комбинациям C, gamma и kernel не имеет смысла: если kernel='linear', то gamma не используется и перебор различных значений gamma - это пустая трата времени. Чтобы обработать подобные "условные" параметры, GridSearchCV позволяет превратить param_grid в список словарей. Каждый словарь в списке выделяется в самостоятельную сетку параметров. Возможный решетчатый поиск, включающий настройки ядра и параметров, мог бы выглядеть следующим образом:
[In 33]: param_grid = [{'kernel': ['rbf'], 'C': [0.001, 0.001, 0.1, 1, 10, 100], 'gamma': [0.001, 0.001, 0.1, 1, 10, 100]}, {'kernel': ['linear'], ''C'': [0.001, 0.001, 0.1, 1, 10, 100]}] print("List of grids:\n{}".format(param_grid)) List of grids: [{'kernel': ['rbf'], 'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}, {'kernel': ['linear'], 'C': [0.001, 0.01, 0.1, 1, 10, 100]}]
В первой сетке параметр kernel всегда принимает значение 'rbf' (обратите внимание, элемент параметра kernel представляет собой список единичной длины), изменяются значения как параметра C, так и параметра gamma. Во второй сетке параметр kernel всегда принимает значение linear и поэтому изменяется только параметр С. Теперь давайте применим этот более сложный поиск параметров:
[In 34]: grid_search = GridSearchCV(SVC(), param_grid, cv=5) grid_search.fit(X_train, y_train) print("Наилучшие значения параметров: {}".format(grid_search.best_params_)) print("Наилучшее значение кросс-валидац. правильности: {:.2f}".format(grid_search.best_score_)) Наилучшие значения параметров: {'C': 10, 'gamma': 0.1, 'kernel': 'rbf'} Наилучшее значение кросс-валидац. правильности: 0.97
Давайте снова посмотрим на cv_results_. Как и следовало ожидать, если kernel имеет значение 'linear', то меняется только параметр C:
[In 35]: results = pd.DataFrame(grid_search.cv_results_) # мы выводим транспонированную таблицу для лучшего отображения на странице: display(results.T)
Рис.1. Транспонированная таблица (изображение кликабельно)
На следующем шаге мы рассмотрим применение различных стратегий перекрестной проверки с помошью решетчатого поиска.