Как упростить работу с моделями машинного обучения

с помощью Shapash

Для корректного обучения любой модели необходим оптимизатор. Именно он позволяет минимизировать потери и коэффициенты ошибок. Самый распространенный оптимизатор Gradient Descent и иногда с ним бывает очень трудно. В этой статьей мы рассмотрим две самые частые проблемы, способы их решения и альтернативный вариант.
Shapash - это инструмент, который облегчает понимание моделей машинного обучения и анализа данных на Python.

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

Так ли Shapash хорош на самом деле? Сейчас разберемся с его функционалом и проверим на конкретном примере.

Ключевые особенности Shapash

Искусственные нейронные сети (ИНС) вдохновлены биологическими или естественными нейронными сетями. Цель, стоящая перед специалистами по машинному обучению, - заставить эти сети функционировать так, функционирует наш мозг. Благодаря такому образцу, строение ИНС имеет практически такие компоненты, что и биологическая нейронная сеть.
  • Легко читаемые визуализации (не зависимо от уровня владение наукой о данных .
  • Веб-приложение: позволяет покопаться в данных, просматривать графики, оценивать важность функций и глобальный вклад функции в модель.
  • Препроцессинг, обратная обработка, постобработка - Вы можете легко добавить свои словари данных, объект category-encoders или трансформатор столбцов sklearn для более явных выходов.
  • Функции для простого сохранения файлов Pickle и экспорта результатов в таблицы.
  • Настраиваемая сводка отчета: можно выбрать, какие именно параметры учитывать. Удобно при детальном рассмотрении статистики и бизнес-процессов на разных уровнях производства.
  • Возможность простого развертывания в производственной среде и завершения каждого прогноза / рекомендации с локальной сводкой объяснимости для каждого рабочего приложения (пакетного или API)
  • Shapash подходит для нескольких способов применения: его можно использовать для легкого доступа к результатам или для работы над лучшей формулировкой.

Shapash работает с задачами регрессии, двоичной классификации или мультикласса. Он совместим со многими моделями:

  • Catboost
  • Xgboost
  • LightGBM
  • Sklearn Ensemble
  • Linear models
  • SVM

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




Установка и начало работы

Вы можете установить пакет через pip:

$ pip install shapash


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

Далее нужно закодировать категориальные признаки:

Обучаем, тестируем разделение и подгоняем модель:






И спрогнозируем тестовые данные:
y_pred = pd.DataFrame (reg.predict (Xtest), columns = ['pred'], index = Xtest.index)

Работа с Shapash SmartExplainer

Шаг 1 - Импорт
from shapash.explainer.smart_explainer import SmartExplainer

Шаг 2 - Инициализация SmartExplainer
xpl = SmartExplainer(features_dict=house_dict) # Optional parameter

*features_dict: dict, который определяет значение каждого имени столбца x pd.DataFrame.

Шаг 3 - Компиляция

Зачем нужны оптимизаторы для нейронной сети?

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

Чтобы свести к минимуму потери, возникающие при использовании любой модели, нам нужны две вещи:

  1. Величина, на которую следует уменьшить или увеличить
  2. Направление движения
Gradient Descent неплохо справляется с этими двумя потребностями.

Скорость обучения и dL / dw помогают нам выполнить два требования для минимизации функции потерь:

Скорость обучения: отвечает на размерную часть. Он управляет обновлением весов, сообщая, на какую величину увеличить или уменьшить.
dL / dw: указывает, насколько параметр должен увеличиваться или уменьшаться. Он указывает направление своим знаком.
Это итеративный процесс поиска параметров (или весов), которые сходятся с оптимальным решением. Оптимальное решение - минимизация функции потерь.

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

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

Что делать, если градиентный спуск застревает на локальных минимумах

Проблема

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

Указатель с синей стрелкой - это глобальный минимум, то есть точка, в которой функция стоимости является самой низкой во всей функции стоимости.

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

Причина

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

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


Решение

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

Теперь скорость V определенно будет больше, чем скорость U, поскольку шар движется в нисходящем направлении.

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

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

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

Что делать, если скорость обучения не меняется при градиентном спуске

Проблема

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

Причина

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

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

Решение

В процессе тренировки наклон или градиент dL / dw меняется. Это скорость изменения функции потерь относительно веса параметра, и, применяя ее, мы можем обновить скорость обучения.

Мы можем взять сумму квадратов прошлых градиентов, то есть квадрат суммы частных производных dL / dw, как показано ниже:

Так как некоторые градиенты могут быть положительными, а другие отрицательными, мы и берем квадраты этих градиентов. Это, как правило, сводит на нет результат. Следовательно, мы берем квадрат градиентов и добавляем его к предыдущим квадратным склонам, которые представлены η.

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

Мы используем η в уравнении взвешенной суммы градиентов, которое мы использовали для решения первой задачи градиентного спуска по выходу из локальных минимумов:
Как мы только что видели, мы будем использовать квадрат наклонов, поэтому подставив его в это уравнение, мы получим:
Теперь, используя взвешенную сумму квадратов прошлых градиентов, уравнение для обновления новых весов принимает следующий вид:

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

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

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

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

Придется ли нам выбирать между ними или есть способ объединить оба этих оптимизатора?

Мы хотим поговорить о еще одном оптимизаторе с символическим названием - Adam.

Adaptive Moment Estimation (или Adam) - то смесь стохастического градиентного спуска с моментумом и RMSProp. Это самый популярный и самый эффективный из оптимизаторов. Он в буквальном смысле вобрал в себя лучшее от своих конкурентов.

Уравнение обновления веса для Adam выглядит следующим образом:

Заключение

Итак, у нас было две проблемы:

  1. Градиентный спуск застревает на локальных минимумах. Решением для этого является использование стохастического градиента с импульсом, который использует взвешенную сумму градиентов, чтобы помочь выйти из локальных минимумов.
  2. Скорость обучения при градиентном спуске постоянна на протяжении всего процесса обучения по всем параметрам. Это может замедлить сближение. В качестве средства для этого мы меняем оптимизатор с градиентного спуска на RMSProp.
Избежать их и добиться наибольшей стабильности и производительность поможет Adaptive Moment Estimation.

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

https://gist.github.com/RustamSSS/cbe299c12762c552558d1de48cc355ff

https://gist.github.com/cbe299c12762c552558d1de48cc355ff.git





Html code will be here