Этот рассказ - вторая часть этого, где мы выбираем модель после оценки множества результатов.

После выбора модели для обучения мы должны выбрать, какие гиперпараметры работают лучше, обучить окончательную модель и отправить наши прогнозы.

Как выбрать лучшие гиперпараметры? В scikit-learn есть два основных метода: GridSearch и RandomizedSearch.

GridSearch: исчерпывающий поиск

В GridSearch мы генерируем кандидатов гиперпараметров из сетки параметров, и внутренне тестируем все их возможные комбинации. После того, как все гиперпараметры опробованы, выбирается модель, которая достигла наилучшей объективной метрики (в данном случае точности) с ее гиперпараметрами.

RandomizedSearch: хорошо ли случайный?

С другой стороны, в RandomizedSearch не проверяются все гиперпараметры. RandomizedSearch ожидает параметр n_itera, который равен t количеству оцениваемых настроек параметров. В чем разница? Обычно RandomizedSearch использует параметры в качестве распределения, и случайным образом алгоритм выбирает некоторые из них, поэтому для завершения поиска требуется меньше времени (поскольку он не тестирует полностью функцию космос).

По словам Бергстры и Бенжио в их статье, они показывают, что случайный поиск более эффективен для оптимизации параметров, чем поиск по сетке.

Независимо от того, какой подход мы выбрали, в чем заключается загвоздка? ​​ Если пространство параметров неверно, вы можете потратить много времени, но не найдете правильные параметры. Например, в модели RandomForest вы можете искать значения для n_estimator от 100 до 500, но правильным значением может быть 750.

На самом деле существует еще одна продвинутая, хотя и дорогая технология. Назовем несколько: Байесовская оптимизация, Эволюционная оптимизация.

Мы выбрали GridSearch, самый простой. Хотя помните, что мы можем повернуть или протестировать другую, чтобы найти лучшую комбинацию, которая даст нам лучший результат.

5. Настройка гиперпараметров: GridSearch

После выбора модели RandomForest и нашей методики поиска мы собираемся определить лучшие гиперпараметры, которые подходят для нашей проблемы. Для вычисления этой задачи требуется много времени, если пространство параметров слишком велико: чем больше было пространство для поиска, тем больше времени потребуется.

Скорее всего, в будущем мы могли бы улучшить это решение, перейдя к параллельному подходу или используя смешанную технику между RandomizedSearch GridSearch.

Как вы помните из нашего первого поста, мы используем конвейер для предварительной обработки и обучения классификатора:

Чтобы обучить все комбинации моделей, выполните аналогичный код:

Как вы можете видеть выше, GridSearch оценивает гиперпараметры по конвейеру. Помните, что наш конвейер был построен из других каналов, и они называются clf и preprocess. GridSearch имеет параметры формы <component>__<parameter>, так что можно обновлять каждый компонент вложенного объекта, в данном случае конвейера.
Итак, если бы мы хотели найти гиперпараметры для нашего конвейера предварительной обработки, мы могли бы использовать эту технику.
Но сколько комбинаций у нас есть?

len(ParameterGrid(params_rf)) # 432 combinations!

Конечно, это много времени ... В качестве домашнего задания мы предлагаем вам найти лучшую комбинацию гиперпараметров, в качестве уловки вы можете уменьшить пространство параметров поиска, используя какой-нибудь инструмент, например tune, или протестируйте другую технику настройки гиперпараметров.

StratifiedKFold - это вариант KFold, который возвращает стратифицированные складки. Складки создаются путем сохранения процента выборок для каждого целевого класса.
Мы устанавливаем refit как точность, потому что мы хотим найти лучшие гиперпараметры, которые оптимизируют точность, а не показатель f1, в этом точность регистра - наш объективный показатель.

После завершения gs_rf возвращает best_parameters_, словарь с гиперпараметрами, выбранными с помощью исчерпывающего поиска.

6. Оцените выбранные гиперпараметры.

Мы могли бы использовать методы удержания или k-кратной перекрестной проверки для оценки этих гиперпараметров.

Выдержать - это когда мы разделяем набор данных на наборы обучающих тестов (иногда наборы обучающих проверок). Мы подходим к набору поездов и оцениваем с помощью набора тестов.

K-кратная перекрестная проверка - это когда мы разделяем наш набор данных на k-кратную проверку. Затем мы обучаем модель с k-1 складками и оцениваем каждую модель с 1 кратностью. Процесс повторяется для каждого сгиба, так что в итоге мы обучили k моделей.

Мы можем выбрать, удержаться ли, когда у нас есть большой набор данных, или начать построение модели. CV обычно является предпочтительным, потому что он обучает k моделей и лучше работает с невидимыми данными.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.33, 
    stratify=y # stratify by target labels
)

Если вы помните, мы уже выбрали удержание, потому что мы подогнали поиск по сетке с X_train и y_train.

Затем мы печатаем отчет с моделью, оснащенной данными поезда, и оцениваем с помощью тестовых данных:

Как мы видим, функциональные потребности в ремонте несбалансированы. Это потому, что поддержка ниже по сравнению с функциональной и нефункциональной. O ваша модель не может работать так же хорошо, как другие ярлыки, потому что она не может хорошо обобщать эту цель.

Точность округляется до 80% для невидимых данных (дисперсия) и 95% для набора поездов (смещение). Здесь может произойти то, что наша модель может быть переоборудована. См. Компромисс смещения и дисперсии и кривую обучения.

7. Тренируйтесь со всем набором данных! Окончательная модель.

На данный момент мы подбираем окончательную модель, которая состоит из конвейера предварительной обработки и модели RandomForest, затем мы прогнозируем и отправляем результаты на конкурс.

rf_final = ( 
   get_pipeline_model(RandomForestClassifier())
   .set_params(**rf_params,)
)
rf_final = rf_final.fit(X,y)
predictions = rf_final.predict(datatest)
predictions = y_transformer.inverse_transform(predictions)
now_str = datetime.now().strftime(‘%Y-%m-%d_%H-%M-%S’)
pd.DataFrame(
   predictions, 
   index=datatest.index, 
   columns=[‘status_group’]
).to_csv(f’../data/results/results-rf-{now_str}.csv’)

Мы ожидаем, что наша модель получит примерно 80%, как мы видели в отчете об испытаниях.

Отправьте файл и молодец! мы получили хороший результат.

В качестве домашнего задания мы предлагаем вам найти лучшую комбинацию гиперпараметров и представить свои прогнозы на конкурс!

Первая статья находится здесь: Выбор между моделями машинного обучения с использованием конвейеров для повторного использования кода. Если хотите узнать больше, эти статьи основаны на этом и этом. Полный код находится здесь.