Расширенные тактики машинного обучения

Делайте прогнозы продажной цены как профессиональный специалист по данным

Профессиональные секреты для улучшения ваших моделей машинного обучения и получения конкурентного преимущества

Введение

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

Немного обо мне

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

Содержание статьи

  1. Задача: обзор задачи машинного обучения.
  2. Данные: источник данных.
  3. Настройка рабочей среды.Рекомендации по созданию рабочей среды.
  4. Анализ данных: изучение данных.
  5. Разделение данных: подготовка данных для машинного обучения.
  6. Разработка функций: создание функций для ваших моделей.
  7. Обучение модели. Обучение моделей машинного обучения.
  8. Моделирование ансамбля: использование стека для повышения производительности модели.
  9. Дополнительный совет: как еще больше повысить эффективность вашей модели.

Соревнование

Задача, над которой мы работаем, — это задача передовых методов регрессии. Цель и показатель, указанные ниже, предоставлены Kaggle.

  • Цель. Ваша задача — спрогнозировать цену продажи каждого дома. Для каждого идентификатора в тестовом наборе необходимо предсказать значение переменной SalePrice.
  • Метрика. Заявки оцениваются по среднеквадратичной ошибке (RMSE) между логарифмом прогнозируемого значения и логарифмом наблюдаемой цены продажи. (Сбор логов означает, что ошибки в предсказании дорогих и дешевых домов одинаково повлияют на результат.)

Из этого я могу сразу же установить две вещи;

  1. Результат, который мы пытаемся предсказать (цена дома), является непрерывным, что дает мне понять, что мы имеем дело с задачей регрессии.
  2. Нас оценивают только по производительности модели. Бывают случаи, когда нашей целью будет построение модели для объяснения чего-либо, но это не один из таких случаев. Все, что мы пытаемся здесь сделать, это построить модель, которая лучше всего предсказывает цены на жилье, а это означает, что наша модель может быть как черный ящик, как мы хотим.

Данные

Данные предоставлены Kaggle и доступны для использования в соревнованиях или ваших собственных исследованиях.

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

Настройте свою рабочую среду

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

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

С питоном такого нет. Есть несколько нативных инструментов, но большинство полезных для машинного обучения нам придется импортировать самим. Существуют буквально тысячи этих инструментов (библиотек), которые мы можем использовать, что дает нам свободу создавать все, что мы хотим. Однако вся эта свобода достигается за счет сложности. Сами библиотеки могут быть огромными с множеством зависимостей. Если вы установите их неправильно, это может привести к проблемам и впоследствии ошибкам импорта (и головной боли). Мое практическое правило для решения этой проблемы — создавать одну виртуальную среду для каждого проекта. Давайте пройдемся по настройке среды для этого проекта.

Виртуальная среда — это изолированное рабочее пространство для управления зависимостями и конфигурациями в проектах разработки программного обеспечения.

Прежде чем мы углубимся в это, если вы следуете, сейчас самое время установить Анаконду, если вы еще этого не сделали.

Anaconda — менеджер среды, и лично я считаю его одним из лучших для специалистов по данным и инженеров машинного обучения.

Создание вашей среды

После того, как Anaconda установлена ​​на вашем компьютере, настроить новую среду несложно. Начните с открытия Anaconda Power Shell и выполнения следующего:

conda create -n Kaggle-env python=3.10 pip

Это создает среду с именем Kaggle-env с установленной версией Python 3.10 и pip. Вы можете найти новую среду по адресу \anaconda3\envs.

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

Теперь мы потратим некоторое время на создание среды со всеми необходимыми библиотеками. Это очень легко сделать, установив эти библиотеки через канал Conda. Я выбираю Conda, а не pip, потому что Conda автоматически разрешает зависимости, в то время как pip работает быстрее, но часто может приводить к конфликтам зависимостей, что приводит к ужасной ошибке импорта в дальнейшем.

Давайте изменим наш каталог, чтобы он указывал на нашу новую среду Conda, а затем активируем ее.

cd \anaconda3\envs\kaggle-env
conda activate Kaggle-env 

Установка библиотек

Затем установите все необходимые библиотеки для проекта. Если есть какие-либо библиотеки, которые вы хотите установить помимо этого, я настоятельно рекомендую вам указать правильный канал Conda для установки.

Исключением является библиотека XGBoost. Если у вас есть графический процессор, установка XGBoost с помощью pip автоматически предоставит вам доступ к версии библиотеки с поддержкой графического процессора.

conda install -c conda-forge scikit-learn
pip install xgboost
conda install -c anaconda pandas 
conda install -c conda-forge scikit-optimize
conda install -c anaconda jupyter

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

conda list

Список conda предоставит вам все библиотеки, установленные в вашей текущей активированной среде. Вы должны начать чувствовать сложность здесь, есть уже десятки библиотек!

Структура файла

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

Как только мы настроим нашу среду, запустите в PowerShell anaconda следующее, чтобы открыть лаборатории Jupyter и приступить к анализу данных.

jupyter lab

Анализ данных

Исследовательский анализ данных имеет решающее значение для понимания ваших данных и последующего принятия решения о вашем подходе к машинному обучению. Я думаю, что хорошее место для начала — посмотреть на отсутствующие данные. Давайте определим поля, в которых отсутствуют данные, а затем попытаемся понять, почему.

Обратите внимание, что в отраслевых проектах понять, почему отсутствуют данные, непросто, и часто требуется беседа с экспертом в предметной области, аналитиком данных или инженером данных.

Давайте посмотрим на некоторые из отсутствующих переменных.

  • Участок. Здравый смысл подсказывает, что эти отсутствующие наблюдения на самом деле могут быть там, где конкретное имущество не имеет фасада участка. Вы можете сказать это, посмотрев на распределение значений, нулей нет. Мы можем просто сделать разумное предположение и приписать недостающие значения нулю. Есть десять других переменных, у которых были отсутствующие значения аналогично LotFrontage, мы будем обрабатывать эти переменные таким же образом.
  • GarageYrBlt: отсутствующие даты года постройки гаража могут быть связаны с недвижимостью без гаража. Как вы решаете это в данных? Мы можем просто заменить отсутствующие значения на 9999. Еще мы сделаем преобразование этого типа данных из целого числа в объект. Это предотвратит ошибочную обработку моделью числового значения даты как значимого. Мы не хотим, чтобы модель сохраняла информацию об относительной величине числовых дат, это действительно не имеет смысла. Скорее мы хотим, чтобы модель рассматривала эти даты как категории. Преобразовывая это в объект, мы заставляем модель делать это.
  • В этих данных есть несколько переменных, которые «на самом деле» не отсутствуют. Скорее они совершенно бесполезно помечены как «NA», чтобы представить тот факт, что эта конкретная функция не существует в собственности. Метка «NA» плохо работает с алгоритмами или библиотеками обработки данных (Pandas), которые мы используем. К счастью, справиться с этим довольно просто, все, что нам нужно сделать, это заменить «NA» на «none». Мы сделаем это во всех применимых случаях.
  • Есть некоторые переменные с отсутствующими значениями, для которых нельзя использовать значения «Нет» или «Н/П». Кажется, что они случайно отсутствуют, но из одних только данных неясно, почему. Мы можем отбросить эти отсутствующие атрибуты, но это почти наверняка приведет к некоторой потере информации и может повлиять на производительность модели ниже по течению. Еще одна вещь, которую мы можем сделать, это приписать эти недостающие значения моде. Да, это приведет к некоторому смещению и может даже сместить распределение в некоторых случаях, но у нас есть преимущество в том, что мы можем сохранить эти наблюдения в данных. На этот раз мы выберем этот подход.

Есть варианты для более сложного вменения. Например, вменение групповых режимов или k-ближайших соседей. Если у вас больше знаний в предметной области, вы, вероятно, могли бы сделать это с отличными результатами. В этом случае мы выберем самый простой путь, приписав этому значению «глобальный» режим.

Удаление функций

Всякий раз, когда мы создаем модели машинного обучения, мы должны помнить, что не все функции должны быть в модели. Для целей этого проекта функция «Id» является просто уникальным идентификатором для каждого свойства и сама по себе не имеет никакой прогностической ценности. Включение этой функции в модель приведет к тому, что ваша модель будет соответствовать вашим обучающим данным и не будет работать в вашем тесте. Мы удалим «Id» из характеристик нашей модели.

Вот скрипт для очистки данных

Разделение данных

Разделение данных имеет решающее значение в любом конвейере машинного обучения для целей тестирования моделей. Вы хотите получить точную оценку того, насколько хорошо будет работать ваша модель, прежде чем выпустить ее в дикую природу. Обычно я делю свои данные на три подмножества. Обучение, проверка и тестирование. Для задач Kaggle вам обычно предоставляются тестовые данные. Итак, нам просто нужно создать наборы данных Validation и Train. Мы можем сделать это, просто разделив данные Train, предоставленные Kaggle, на 80% обучения и 20% проверки с использованием разделения тестов поезда Scikit-Learn.

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

from sklearn.model_selection import train_test_split
X_train, X_validation, y_train, y_validation = train_test_split(X, y, test_size=0.25, random_state=42)

Разработка функций

У нас есть чистые данные, но нам все еще нужно разработать некоторые функции. Наши данные имеют комбинацию числовых и категориальных переменных, и мы должны обрабатывать их по-разному. Наши числовые функции требуют масштабирования, а наши категориальные функции требуют кодирования.

Масштабирование

Преобразование журнала. Преобразование журнала — это метод, используемый для преобразования распределения числовых признаков, часто для уменьшения влияния выбросов или для того, чтобы сделать распределение более симметричным. Это может помочь стабилизировать дисперсию и сделать данные более подходящими для определенных моделей машинного обучения, которые предполагают гомоскедастичность (постоянную дисперсию) или чувствительны к распределению входных признаков.

Стандартизация. При работе с числовыми переменными мы часто обнаруживаем, что у нас есть переменные, которые выражены в разных масштабах. Например, переменная BsmtFullBath (полные ванные комнаты в подвале), скорее всего, будет целым числом меньше 10. С другой стороны, lotArea (размер участка в квадратных футах) — это действительное число с порядком величины до тысяч. Стандартизация масштабирует наши числовые признаки таким образом, что они имеют стандартное отклонение, равное 1, и среднее значение, равное 0. Стандартизируя числовые признаки, вы можете предотвратить доминирование в модели признаков с более крупными масштабами и убедиться, что каждый признак вносит справедливый вклад в прогноз.

Горячее кодирование

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

Горячее кодирование — это метод, используемый для представления категориальных данных в числовом формате, который может быть легко понят алгоритмами машинного обучения. Он работает путем создания двоичного вектора (вектора, состоящего только из 0 и 1) для каждой уникальной категории в категориальном признаке.

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

Предотвращение утечки данных — важно!

Ошибка, которую совершают многие новички, заключается в неправильном преобразовании наборов данных для обучения, проверки и тестирования. В дикой природе ваша обученная модель не увидит «тестовые» данные до момента вывода. Этот факт должен быть отражен в том, как вы применяете преобразования данных. Лучше всего сначала подобрать тренировочный набор, а затем преобразовать проверочный и тестовый наборы. Таким образом, вы не подвергаете свою модель информации в своих наборах проверки и тестирования преждевременно. К счастью, это делается очень просто с помощью модуля конвейера Scikit Learn. Вы можете просто настроить преобразования, которые вы хотите в конвейере. Модуль будет помещаться в поезд и трансформироваться при проверке и тестировании во время вывода по мере необходимости.

вот сценарий для настройки конвейеров для разработки функций.

Обучение модели

Большая часть обучения модели проходит «под колпаком». На самом деле это просто выбор правильных моделей, выбор правильного пространства гиперпараметров и выбор соответствующего режима настройки гиперпараметров.

Мы будем обучать три модели:

  1. Ридж-регрессор
  2. Случайный лесной регрессор
  3. XGBoost-регрессор

Машинное обучение

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

Целевая функция = функция потерь + функция регуляризации

  • Функция потерь. Функция потерь в машинном обучении количественно определяет разницу между прогнозируемыми результатами и фактическими целями. Он помогает оценить производительность модели и направляет процесс оптимизации во время обучения, настраивая параметры модели для минимизации потерь и повышения точности прогнозирования. Мы выберем среднеквадратичную ошибку в качестве нашей функции потерь, дающую нам некоторую меру чувствительности к выбросам.
  • Функция регуляризации. Препятствует усложнению модели за счет добавления штрафного члена к функции потерь. Хотя сложность помогает идентифицировать нелинейные шаблоны, существует риск переобучения. Регуляризация уравновешивает сложность, способствуя лучшему обобщению модели. Мы рассмотрим некоторые гиперпараметры регуляризации в следующем разделе.
  • Целевая функция: цель, которую необходимо минимизировать (или оптимизировать). Процесс минимизации целевой функции проводится алгоритмически. Популярны такие методы, как стохастический градиентный спуск и имитация отжига. Для оптимизатора мы будем придерживаться значения по умолчанию, используемого XGBoost.

Настройка гиперпараметров

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

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

Байесовский поиск. Байесовский поиск — это метод оптимизации, используемый для поиска лучших гиперпараметров для моделей машинного обучения. Он объединяет предварительные знания о пространстве поиска с наблюдаемыми данными для формирования вероятностной модели, которая предсказывает эффективность целевой функции. Поиск итеративно выбирает следующий набор гиперпараметров на основе функции сбора, которая уравновешивает исследование (выборку менее известных областей) и эксплуатацию (выборку областей с высокой прогнозируемой производительностью). Этот подход более эффективен, чем случайный поиск или поиск по сетке, поскольку он интеллектуально исследует пространство поиска и часто дает лучшие результаты с меньшим количеством итераций.

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

Какой гиперпараметр нам следует настроить?

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

Гиперпараметры XGBoost:

  • «regressor__learning_rate»: уменьшает веса функций, чтобы сделать процесс повышения более консервативным, предотвращая переоснащение.
  • «regressor__n_estimators»: количество повышающих раундов (деревьев), которые необходимо построить.
  • ‘regressor__max_depth’: максимальная глубина дерева, контролирующая сложность модели.
  • ‘regressor__min_child_weight’: минимальная сумма веса экземпляра (гессиана), необходимая в дочернем элементе, используемом для контроля переобучения.
  • «regressor__gamma»: минимальное снижение потерь, необходимое для создания дальнейшего раздела на листовом узле дерева, действующее как параметр регуляризации.
  • «regressor__subsample»: отношение подвыборки обучающих экземпляров, предотвращающее переоснащение и добавление случайности.
  • «regressor__colsample_bytree»: отношение подвыборки столбцов при построении каждого дерева, добавляющее случайность и предотвращающее переоснащение.
  • ‘regressor__reg_alpha’: термин регуляризации L1 для весов, добавляющий штраф к абсолютным значениям весов.
  • ‘regressor__reg_lambda’: термин регуляризации L2 для весов, добавляющий штраф к квадратным значениям весов.

Гиперпараметры случайного леса:

  • ‘regressor__n_estimators’: количество деревьев в лесу.
  • ‘regressor__max_depth’: максимальная глубина дерева, контролирующая сложность модели.
  • «regressor__min_samples_split»: минимальное количество выборок, необходимое для разделения внутреннего узла — используется для контроля переобучения.
  • «regressor__min_samples_leaf»: минимальное количество выборок, необходимое для конечного узла, а также контроль переобучения.

Гиперпараметры хребта:

  • «regressor__alpha»: сила регуляризации, которая определяет баланс между минимизацией целевой функции и минимизацией L2-нормы коэффициентов.

K-кратная перекрестная проверка

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

Библиотека Scikit-Optimize позволяет нам комбинировать наш канал преобразования с нашим пространством поиска и перекрестной проверкой K-fold для обучения нашей лучшей модели.

Моделирование ансамбля

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

Validation score XGBoost:  0.1463437246230569
Validation score Random Forest:  0.1404688700912944
Validation score Ridge:  0.1298283832194841

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

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

Мы получаем небольшой прирост производительности на проверочном наборе с многоуровневой моделью.

Validation score stacked model:  0.12824191185574282

Бонусный совет — повторите обучение на полных данных обучения

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

stacking_regressor.fit(X, y)

Производительность в тесте

  • До переобучения на полных обучающих данных производительность стека составляла 0,13472.
  • После переобучения на полных обучающих данных производительность стека составила 0,1266 — значительный прирост по сравнению с другой моделью.

Улучшения

Существует несколько способов повысить эффективность прогнозирования.

  1. Разработка функций. Используйте экспертные знания в предметной области для создания более информативных функций.
  2. Настройка гиперпараметров. Запустите настройку гиперпараметров на нескольких итерациях. Из соображений экономии времени я выполнил настройку только на 30 итерациях.
  3. Стекирование. Вы можете включить в стек несколько дополнительных моделей.

Спасибо за прочтение





Цитаты

[1] Чжоу, З.-Х. (2012). Методы ансамбля: основы и алгоритмы (1-е изд.). Чепмен и Холл/CRC. https://doi.org/10.1201/b12207