Шаг 147.
Введение в машинное обучение с использованием Python. ... . Решетчатый поиск с перекрестной проверкой. Экономичный решетчатый поиск

    На этом шаге мы рассмотрим особенности организации такого поиска.

    В некоторых случаях перебор всех возможных комбинаций по всем параметрам, который обычно выполняет 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. Транспонированная таблица (изображение кликабельно)

    На следующем шаге мы рассмотрим применение различных стратегий перекрестной проверки с помошью решетчатого поиска.




Предыдущий шаг Содержание Следующий шаг