Обзор проекта машинного обучения «Наука о данных во благо» на Python: часть вторая

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

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

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

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

Полный код доступен как Блокнот Jupyter как на Kaggle (где его можно запускать в браузере без необходимости загрузки), так и на GitHub. Это активное соревнование Kaggle и отличный проект, чтобы начать работу с машинным обучением или поработать над новыми навыками.

Оптимизация модели

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

Существует 4 основных метода настройки, от наименее эффективных (вручную) до наиболее эффективных (автоматических).

  1. Ручная настройка: выберите гиперпараметры на основе интуиции / опыта или наугад, обучите модели значениям, найдите оценку проверки и повторяйте, пока у вас не закончится терпение или вы не будете удовлетворены результатами.
  2. Поиск по сетке: настройте сетку гиперпараметров и для каждой отдельной комбинации значений обучите модель и найдите оценку проверки. Оптимальный набор гиперпараметров - это те, которые имеют наивысший балл.
  3. Случайный поиск: настройте сетку гиперпараметров и выберите случайные комбинации значений, обучите модель и найдите оценку проверки. Итерации поиска ограничены в зависимости от времени / ресурсов
  4. Автоматическая настройка: используйте методы (градиентный спуск, байесовская оптимизация, эволюционные алгоритмы) для управляемого поиска лучших гиперпараметров. Это информированные методы, использующие прошлую информацию.

Естественно, мы пропустим первые три метода и перейдем к самому эффективному: автоматической настройке гиперпараметров. Для этой реализации мы можем использовать библиотеку Hyperopt, которая выполняет оптимизацию с использованием версии байесовской оптимизации с Tree Parzen Estimator. Вам не нужно понимать эти термины, чтобы использовать модель, хотя я написал концептуальное объяснение здесь. (Я также написал статью об использовании Hyperopt для настройки модели здесь.)

Детали немного затянуты (см. Блокнот), но нам нужно 4 части для реализации байесовской оптимизации в Hyperopt.

  1. Целевая функция: что мы хотим максимизировать (или минимизировать)
  2. Доменное пространство: регион, по которому выполняется поиск.
  3. Алгоритм выбора следующих гиперпараметров: использует прошлые результаты, чтобы предложить следующие значения для оценки
  4. История результатов: сохраняет прошлые результаты.

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

Полную реализацию см. В записной книжке, но ниже приведены оценки оптимизации за 100 итераций поиска.

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

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

Оптимизированная модель (обозначенная OPT и использующая 10 складок перекрестной проверки с функциями после выбора) помещается прямо в середину неоптимизированных вариантов Gradient Boosting Machine (в которой использовались гиперпараметры, которые, как я обнаружил, хорошо работали для предыдущих задач). указывает на то, что мы еще не нашли оптимальные гиперпараметры, или может быть несколько наборов гиперпараметров, которые работают примерно одинаково.

Мы можем продолжить оптимизацию, чтобы попытаться найти еще лучшие гиперпараметры, но обычно возврат к настройке гиперпараметров намного меньше, чем возврат к проектированию функций. На данный момент у нас есть относительно высокопроизводительная модель, и мы можем использовать эту модель для прогнозирования тестовых данных. Затем, поскольку это соревнование Kaggle, мы можем отправлять прогнозы в таблицу лидеров. Таким образом мы попадаем в топ-50 (на данный момент), что является хорошим подтверждением всей нашей тяжелой работы!

На данный момент мы реализовали полное решение этой проблемы машинного обучения. Наша модель может делать достаточно точные прогнозы бедности в домохозяйствах Коста-Рики (оценка F1 относительно низкая, но это сложная проблема). Теперь мы можем перейти к интерпретации наших прогнозов и посмотреть, может ли наша модель научить нас чему-нибудь о проблеме. Несмотря на то, что у нас есть решение, мы не хотим упускать из виду, почему наше решение важно.

Примечание о соревнованиях Kaggle

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

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

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

Хорошая стратегия для получения максимальной отдачи от Kaggle - работать над проблемой до тех пор, пока у вас не будет достаточно хорошего решения - скажем, 90% от лучших результатов в таблице лидеров - а затем не беспокоиться о том, чтобы попасть на самый верх. Соревноваться - это весело, но обучение - самый ценный аспект работы над этими проектами.

Интерпретация результатов модели

В разгар написания всего кода машинного обучения можно легко упустить из виду важные вопросы: для чего мы делаем эту модель? На что повлияют наши прогнозы? К счастью, на этот раз наш ответ - не «увеличение доходов от рекламы», а эффективное предсказание того, какие домохозяйства больше всего подвержены риску бедности в Коста-Рике, чтобы они могли получить необходимую помощь.

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

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

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

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

Еще один момент, который следует извлечь из этого графика, заключается в том, что в целом наша модель не очень уверена в прогнозах. Предположение без данных дает вероятность 0,25 для каждого класса, и мы можем видеть, что даже при наименьшей крайней бедности наша модель редко имеет доверие более 40%. Это говорит нам о том, что это серьезная проблема - в доступных данных не так много разделения классов.

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

В древовидной модели, такой как Gradient Boosting Machine, значения функций представляют собой суммарное уменьшение примесей Джини для разбитых узлов для функции. Я никогда не считаю абсолютные значения очень полезными, вместо этого я нормализую числа и смотрю на них на относительной основе. Например, ниже приведены 10 наиболее важных функций оптимизированной модели GBM.

Здесь мы можем увидеть образование и возраст членов семьи, составляющие основную часть наиболее важных характеристик. Если посмотреть на важность, мы также увидим размер семьи. Это перекликается с выводами исследователей бедности: размер семьи коррелирует с более крайней бедностью, а уровень образования обратно коррелирует с бедностью. В обоих случаях мы не обязательно знаем, какие причины и какие, но мы можем использовать эту информацию, чтобы выделить факторы, требующие дальнейшего изучения. Будем надеяться, что эти данные можно будет использовать для дальнейшего сокращения бедности (которая неуклонно снижалась в течение последних 25 лет).

Помимо потенциальной помощи исследователям, мы можем использовать важность функций для дальнейшей разработки функций, пытаясь создать на их основе больше функций. В качестве примера с использованием приведенных выше результатов можно взять meaneduc и разделить на dependency для создания новой функции. Хотя это может быть не интуитивно понятно, трудно сказать заранее, что подойдет для модели.

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

Значения на диагонали - это те, которые модель правильно предсказала, потому что прогнозируемая метка совпадает с истинной меткой. Все, что выходит за пределы диагонали, неверно предсказывает. Мы видим, что наша модель лучше всего подходит для определения неуязвимых домохозяйств, но не очень хороша для распознавания других ярлыков.

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

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

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

Существуют и другие методы, которые мы можем использовать для понимания модели, такие как Local Interpretable Model-Agnostic Explainer (LIME), который использует более простую линейную модель для аппроксимации модели вокруг прогноза. Мы также можем рассмотреть отдельные деревья решений в лесу, которые обычно легко анализировать, поскольку они по сути имитируют процесс принятия решений человеком.

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

Исследовательские методы

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

Для этого проекта я решил опробовать две новые (для меня) техники:

Рекурсивное исключение признаков

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

Рекурсивное устранение признаков просто использовать с методом RFECV Scikit-Learn. Этот метод основан на оценщике (модели), а затем fit похож на любой другой метод Scikit-Learn. Часть scorer требуется для создания пользовательской метрики оценки с использованием оценки макроса F1.

Раньше я использовал важность функций для выбора, но никогда не реализовывал метод рекурсивного исключения функций и, как обычно, был приятно удивлен тем, насколько легко это было сделать в Python. Метод RFECV выбрал 58 из примерно 190 функций на основе оценок перекрестной проверки:

Затем выбранный набор функций был опробован для сравнения эффективности перекрестной проверки с исходным набором функций. (Окончательные результаты представлены после следующего раздела). Учитывая простоту использования этого метода, я думаю, что это хороший инструмент для моделирования. Как и любая другая операция Scikit-Learn, она может вписаться в Pipeline, что позволяет быстро выполнять полную серию операций предварительной обработки и моделирования.

Уменьшение размеров для визуализации

В машинном обучении существует ряд неконтролируемых методов для уменьшения размерности. Они делятся на две общие категории:

  • Алгоритмы разложения матриц: PCA и ICA.
  • Методы встраивания, которые отображают данные на многообразия низкой размерности: IsoMap, t-SNE

Как правило, PCA (анализ основных компонентов) и ICA (анализ независимых компонентов) используются как для визуализации, так и в качестве этапа предварительной обработки для машинного обучения, в то время как разнообразные методы, такие как t-SNE (t-распределенное встраивание стохастических соседей), используются только для визуализации. Потому что они сильно зависят от гиперпараметров и не сохраняют расстояния в данных. (В Scikit-Learn реализация t-SNE не имеет transform метода, что означает, что мы не можем использовать его для моделирования).

Новая запись на сцене уменьшения размерности - UMAP: Uniform Manifold Approximation and Projection. Он нацелен на отображение данных в низкоразмерное многообразие - так что это метод встраивания при одновременном сохранении глобальной структуры данных. Хотя математика, лежащая в основе этого метода, является строгой, его можно использовать как метод Scikit-Learn с вызовами fit и transform.

Я хотел попробовать эти методы как для уменьшения размеров для визуализации, так и для добавления сокращенных компонентов в качестве дополнительных функций . Хотя этот вариант использования может быть нетипичным, экспериментировать не помешает! Ниже показан код для использования UMAP для создания встраиваемых данных как поезда, так и данных тестирования.

Применение остальных трех методов точно такое же (за исключением TSNE, который нельзя использовать для transform данных тестирования). После завершения преобразований мы можем визуализировать уменьшенные обучающие функции в 3-х измерениях с точками, окрашенными в соответствии со значением цели:

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

В качестве последнего шага мы можем добавить уменьшенные элементы к набору функций после применения выбора функций, чтобы увидеть, полезны ли они для моделирования. (Обычно применяется уменьшение размеров, а затем модель обучается только по уменьшенным размерам). Характеристики каждой модели показаны ниже:

Модель, использующая функции уменьшения размерности, имеет суффикс DR, в то время как количество складок, следующих за GBM, относится к количеству складок перекрестной проверки. В целом, мы видим, что выбранный набор функций (SEL) работает немного лучше, а добавление функций уменьшения размеров ухудшает производительность модели! Сложно сделать слишком много выводов из этих результатов, учитывая большие стандартные отклонения, но мы можем сказать, что Gradient Boosting Machine значительно превосходит все другие модели, а процесс выбора функций улучшает эффективность перекрестной проверки.

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

Стремление постоянно совершенствоваться и получать новые знания - важнейший навык для специалиста по данным.

Следующие шаги

Несмотря на этот исчерпывающий охват инструментов машинного обучения, мы еще не достигли конца методов, применимых к этой проблеме!

Вот некоторые дополнительные шаги, которые мы могли бы предпринять:

  1. Автоматизированная разработка функций: подробности см. В этой записной книжке.
  2. Передискретизация класса меньшинства: метод для учета несбалансированных классов путем создания синтетических точек данных.
  3. Дальнейший выбор функций: особенно после автоматизированного проектирования функций, у нас есть функции, которые могут негативно повлиять на производительность модели.
  4. Объединение или группирование моделей: иногда объединение более слабых - менее эффективных - моделей с более сильными моделями может улучшить производительность.

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

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

В качестве одного из примеров способности соревнований к совершенствованию методов машинного обучения можно сказать, что ImageNet Large Scale Visual Recognition Challenge привел к значительным улучшениям в сверточных нейронных сетях.

Выводы

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

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

Наш подход основывался на последовательности процессов (1–4 были в части первой):

  1. Понять проблему и данные
  2. Выполняйте очистку данных наряду с исследовательским анализом данных
  3. Создавайте соответствующие функции автоматически и вручную
  4. Сравните модели машинного обучения
  5. Оптимизируйте наиболее эффективную модель
  6. Интерпретируйте результаты модели и узнайте, как она делает прогнозы

Наконец, если после всего этого вы все еще не в полной мере освоили науку о данных, вы можете перейти к исследовательским методам и узнать что-то новое!

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

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