Шаг 178.
Введение в машинное обучение с использованием Python. Объединение алгоритмов в цепочки и конвейеры. Выбор оптимальной модели с помошью решетчатого поиска

    На этом шаге мы рассмотрим способы выбора оптимальной модели.

    Вы можете пойти дальше, объединив GridSearchCV и Pipeline: можно осуществлять поиск лишь по фактическим этапам, выполняемым в конвейере (например, речь может идти о целесообразности использования StandardScaler() или MinMaxScaler()). Подобное действие приведет к еще большему пространству поиска и нужно тщательно взвесить его целесообразность. Как правило, перебор всех возможных моделей не является оптимальной стратегией машинного обучения. Однако ниже приводится пример сравнения результатов работы RandomForestClassifier и SVC на наборе данных iris. Мы знаем, что SVC, возможно, потребуются отмасштабированные данные, поэтому необходимо решить, использовать StandardScaler() или обойтись без предварительной обработки. Что касается RandomForestClassifier, мы знаем, что для него предварительная обработка данных не требуется. Мы начинаем с построения конвейера. В данном случае мы задаем имена этапов в явном виде. Наш конвейер будет включать два этапа: один - для предварительной обработки, второй - для классификатора. Создаем экземпляры объектов с помощью SVC и StandardScaler:

[In 35]:
pipe = Pipeline([('preprocessing', StandardScaler()), ('classifier', SVC())])

    Теперь мы можем задать сетку параметров для поиска. Нам нужно выбрать либо RandomForestClassifier, либо SVC. Поскольку они используют разные параметры для настройки, один метод нуждается в предварительной обработке, а другой - нет, мы можем воспользоваться списком словарей, в котором каждый словарь представляет отдельную сетку параметров (см. 147 шаг "Экономичный решетчатый поиск"). Чтобы задать модель для этапа, мы должны указать имя этапа в качестве названия параметра. Если нам нужно пропустить какой-то этап в конвейере (например, потому что нам не нужна предварительная обработка для RandomForest), мы можем задать для этапа значение None:

[In 36]:
from sklearn.ensemble import RandomForestClassifier
param_grid = [
    {'classifier': [SVC()], 'preprocessing': [StandardScaler(), None],
     'classifier__gamma': [0.001, 0.01, 1, 10, 100],
     'classifier__C': [0.001, 0.01, 1, 10, 100]},
    {'classifier': [RandomForestClassifier(n_estimators=100)],
     'preprocessing': [None], 'classifier__max_features': [1, 2, 3]}]

    Мы можем создать экземпляр класса GridSearchCV и запустить решетчатый поиск в обычном режиме на наборе данных cancer.

[In 37]:
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, random_state=0)
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
print("Наилучшие параметры:\n{}\n".format(grid.best_params_))
print("Наил значение правильности перекр проверки: {:.2f}".format(grid.best_score_))
print("Правильность на тестовом наборе: {:.2f}".format(grid.score(X_test, y_test)))

Наилучшие параметры:
{'classifier': SVC(C=10, gamma=0.01), 'classifier__C': 10, 'classifier__gamma': 0.01, 
    'preprocessing': StandardScaler()}

Наил значение правильности перекр проверки: 0.99
Правильность на тестовом наборе: 0.98

    По итогам решатчатого поиска становится ясно, что модель SVC с предварительной обработкой StandardScaler, параметрами C=10 и gamma=0.01 дает наилучший результат.

    Архив блокнота со всеми вычислениями, выполненными на 132-178 шагах, можно взять здесь.

    На следующем шаге мы рассмотрим выводы и перспективы.




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