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

Прежде чем мы начнем…

Если вы предпочитаете использовать блокнот Jupyter: https://github.com/CoteDave/blog/blob/master/Made%20easy/MDN%20regression/Made%20easy%20-%20MDN%20regression .ipynb

Если вы хотите поиграть и поэкспериментировать с моей экспериментальной пользовательской моделью класса Python MDN: https://github.com/CoteDave/blog/blob/master/Made%20easy/MDN%20regression/mdn_model .py

Во-первых… регрессия сети плотности смеси… да что !??? Давайте начнем медленно и объясним отдельно и быстро все основные термины здесь:

1. Регрессия

2. Плотность

3. Плотность смеси

4. Сеть

5. Сеть регрессии

6. Сеть плотности

7. Регрессия сети плотности смеси

8. Развлекательная практика — одномерный набор данных с пользовательским классом MDN

9. Увлекательная практика — многомерный набор данных с пользовательским классом MDN

10. Заключение

1РЕГРЕССИЯ

Во-первых, термин «регрессия». Если вы нажали на эту статью, я предполагаю, что вы знаете, что такое регрессия, но если нет, вот действительно быстрое и простое объяснение от Джейсона Браунли из Мастерство машинного обучения (отличный парень от путь!):

Прогнозирующее регрессионное моделирование — это задача аппроксимации функции отображения (f) входных переменных (X) в непрерывную выходную переменную (y) […] Задача регрессии требует предсказания количества. Задачу с несколькими входными переменными часто называют задачей многомерной регрессии […] Например, можно предсказать, что дом будет продаваться по определенной цене в долларах, возможно, в диапазоне от 100 000 до 200 000 долларов […] (Источник: https://machinelearningmastery.com/classification-versus-regression-in-machine-learning/#:~:text=A%20regression%20problem%20requires%20, называемая%20a%20multivariate%20regression%20problem.)

Вот еще одно визуальное объяснение, которое отличает проблему классификации от проблемы регрессии:

Последний пример на удачу…

2ПЛОТНОСТЬ

Итак, что означает термин «плотность»? Вот краткий дебильныйпример:

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

Вот «плотность» распределения данных о времени доставки пиццы. Итак, в среднем на доставку у вас ушло 30 минут (пик на графике). В нем также говорится, что в 95% случаев (2 стандартных отклонения (СО)) ваша доставка занимала от 20 до 40 минут. Здесь плотность типа представляет собой «частоту» временных результатов. Разница между «частотой» и «плотностью» заключается в том, что:

· Частота: если вы нарисуете гистограмму под этой кривой и подсчитаете все интервалы, ее сумма будет равна любому целому числу (в зависимости от общего количества наблюдений, зафиксированных в вашем наборе данных).

· Плотность: если вы нарисуете гистограмму под этой кривой и подсчитаете все интервалы, она всегда будет равна 1. Мы также можем назвать эту кривую функцией плотности вероятности (PDF).

С точки зрения статистики это красивое нормальное/гауссово распределение. Это нормальное распределение имеет два параметра:

· среднее

· Стандартное отклонение (Согласно Википедии: «Стандартное отклонение — это число, используемое для того, чтобы показать, насколько измерения для группы отличаются от среднего (среднего) или ожидаемого значения. Низкий стандарт отклонение означает, что большинство чисел близки к среднему. Высокое стандартное отклонение означает, что числа более разбросаны".

Изменение среднего и стандартного отклонения повлияет на форму распределения. Например:

Конечно, существует множество различных типов распределений с различными параметрами. Например:

3ПЛОТНОСТЬ СМЕСИ

Хорошо, теперь давайте посмотрим на эти 3 дистрибутива:

Если мы возьмем это бимодальное распределение (также называемое общим распределением):

Сеть плотности смеси использует предположение, что любое общее распределение, подобное этому бимодальному распределению, может быть разбито на смесь нормальных распределений (смесь также может быть настроена с помощью других типов распределений, например, Лапласа):

Итак, если вы добавите эти 2 нормальных распределения (красный и синий), где каждое распределение имеет собственное среднее значение и стандартное отклонение, оно даст бимодальное общее распределение (фиолетовое).

4СЕТЬ

Сеть для искусственной нейронной сети. Так что да, сеть плотности смеси — это тип искусственной нейронной сети. Вот классический пример нейронной сети:

У вас есть входной слой (желтый), скрытый слой (зеленый) и выходной слой (красный). (Я предполагаю, что все знают, что такое искусственная нейронная сеть, если нет, зайдите в Google, чтобы узнать!).

5РЕГРЕСС-СЕТЬ

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

СЕТЬ 6DENSITY

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

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

7СМЕШАННАЯ ПЛОТНОСТЬ СЕТИ

Окончательно! Сеть смешанной плотности — это искусственная нейронная сеть, цель которой — научиться выводить все параметры (здесь — среднее значение, стандартное отклонение и Pi) всех распределений, смешанных в общем распределении, с учетом конкретных входных характеристик. Новый параметр «Pi» — это параметр смеси, который дает веса/вероятность данного распределения в конечной смеси.

Окончательный результат:

8ПРАКТИЧЕСКОЕ УДОВОЛЬСТВИЕ — ОДНОМЕРНЫЙ НАБОР ДАННЫХ С СОБСТВЕННЫМ КЛАСсом MDN

Ладно, хватит этой теоретической чепухи, давайте сделаем это!

Здесь у нас есть этот знаменитый набор данных «полумесяца»:

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

Если мы построим распределение плотности целевого значения (y):

У нас есть хорошее «призрачное» мультимодальное распределение (общее распространение). Если мы попробуем стандартную линейную регрессию для этого набора данных предсказать y с X:

Не очень хорошо получилось!

Давайте теперь попробуем нелинейную модель (регрессия радиальной базисной функции Kernel Ridge):

Лучше, но еще не совсем!

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

Давайте теперь попробуем модель MDN, чтобы увидеть, на что способен этот зверь! Для этого я реализовал для вас быстрый, приятный и простой в использовании настраиваемый класс Python MDN fit-predict, sklearn alike. Вот ссылка на мой код Python, если вы хотите использовать его самостоятельно (помните: этот класс MDN является экспериментальным и не был тщательно протестирован): https://github.com/CoteDave/blog /blob/master/Made%20easy/MDN%20regression/mdn_model.py

Чтобы иметь возможность использовать этот класс, вам понадобятся sklearn, вероятность тензорного потока, Tensorflow ‹ 2 (если вы хотите сделать этот класс модели MDN совместимым с TF2, не стесняйтесь вносить свой вклад!), umap и hdbscan (для пользовательского класса визуализации функция).

· n_mixtures: количество смесей распределения, используемых MDN. Если установлено значение -1, он «автоматически» найдет оптимальное количество смесей, используя модель смесей Гаусса (GMM) и модель HDBSCAN по X и y.

· dist: тип распределения для использования в смеси. На данный момент доступно два варианта; «нормальный» или «лапласов». (Основываясь на некоторых экспериментах, распределение Лапласа дало мне лучшие результаты, чем нормальное распределение).

· input_neurons: количество нейронов для использования во входном слое MDN.

· hidden_neurons: Архитектура скрытых слоев. Из МДН. Список нейронов на скрытый слой. Этот параметр дает вам возможность выбрать количество скрытых слоев и количество нейронов на скрытый слой.

· gmm_boost: логическое значение. Если установлено значение True, в набор данных будут добавлены функции кластера.

· Оптимизатор: используемый алгоритм оптимизации.

·learning_rate: скорость обучения алгоритма оптимизации.

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

·tf_mixture_family: логическое значение. Если установлено значение True, будет использоваться семейство tf_mixture (рекомендуется): объект Mixture реализует пакетное распределение смесей. Модель смеси определяется категориальным распределением (смесь) и списком объектов распределения Python.

· input_activation: функция активации слоя ввода.

· hidden_activation: функция активации скрытого слоя.

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

Ух ты! Наша модель MDN довольно хорошо соответствовала истинному общему распределению!

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

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

Опять же, довольно близко к реальности!

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

Теперь мы можем построить среднее значение каждого из изученных нами распределений с соответствующими весами смеси (pi):

Вау, MDN снова попал в точку!

Поскольку у нас есть среднее значение и стандартное отклонение от каждого распределения, мы также можем отобразить неопределенности с полным хвостом; скажем, мы наносим среднее значение с доверительным интервалом 95%:

Мы также можем смешивать распределения вместе, и, когда у нас есть несколько распределений y для одного и того же X, мы выбираем наиболее вероятную смесь, используя наибольшее значение параметра Pi:

· Y_preds = для каждого X выберите среднее значение Y распределения с максимальной вероятностью/весом (параметр Pi)

Если мы добавим 95% доверительный интервал:

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

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

· Y_preds = (mean_1 * Pi1) + (mean_2 * Pi2)

Который дает:

Если мы добавим доверительный интервал 95:

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

В этом конкретном случае моим любимым вариантом было бы предположить, что в какой-то области данных X имеют более одного Y, а в других областях; используется только одна смесь. Это дает использование чего-то вроде:

Например, когда X = 0, возможны два различных решения Y из каждой смеси. Когда X = -1,5, существует уникальное решение Y из смеси 1. В зависимости от варианта использования или бизнес-контекста действие или решение может быть инициировано, когда для одного и того же X существует более одного решения.

С этой опцией строки дублируются, когда есть перекрывающееся распределение (если обе смешанные вероятности ›= заданному порогу вероятности). Это дает что-то вроде:

С 95% доверительным интервалом:

Строки набора данных прошли от 2500 до 4063, и окончательный набор данных прогнозов выглядит так:

В этой таблице данных мы видим, что, например, когда X = -0,276839, Y может быть 1,43926 (с вероятностью 0,351525 смеси_0), но также может быть -0,840593 (с вероятностью 0,648475 смеси_1).

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

Другой пример: Прогнозирование дорожных сцен является хорошим кандидатом на то, где можно использовать сети смешанной плотности. В прогнозировании дорожных сцен нам нужно распределение по поведению, которое может демонстрировать агент — например, агент может повернуть налево, повернуть направо или пойти прямо. Таким образом, сети плотности смеси можно использовать для представления «поведений в каждой смеси, которую она изучает, где поведение состоит из вероятности и траектории (координаты (x, y) до некоторого временного горизонта в будущем). (источник: http://blog.adeel.io/tag/mixture-density-networks/

9ПРАКТИЧЕСКОЕ УДОВОЛЬСТВИЕ — МНОГОВАРИАТНЫЙ НАБОР ДАННЫХ С СОБСТВЕННЫМ КЛАССОМ MDN

Хорошо, наконец, хорошо ли работает MDN с задачами многомерной регрессии? Давай выясним !

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

· возраст: возраст основного бенефициара.

· пол: пол страхового агента, женщина, мужчина

· ИМТ: индекс массы тела, дающий представление о телосложении, весе, относительно высоком или низком по сравнению с ростом, объективный индекс массы тела (кг/м ^ 2) с использованием отношения роста к весу. , в идеале от 18,5 до 24,9

· детей: количество детей, охваченных медицинским страхованием, / количество иждивенцев.

· курильщик: курение

· регион: район проживания получателя в США, северо-восток, юго-восток, юго-запад, северо-запад.

· Сборы: индивидуальные медицинские расходы, оплачиваемые медицинской страховкой. Это цель, которую мы хотим прогнозировать

Я взял этот словарь данных с https://www.kaggle.com/mirichoi0218/insurance. Если вы перейдете по этой ссылке, вы также сможете получить интерактивную визуализацию набора данных.

Если вы хотите провести некоторые эксперименты, набор данных также доступен здесь: https://github.com/stedy/Machine-Learning-with-R-datasets.

Постановка задачи такова: можете ли вы точно предсказать страховые расходы (сборы)?

Чтобы увидеть быстрое исследование этого набора данных, вы можете прочитать одну из моих предыдущих статей здесь: https://www.linkedin.com/pulse/demonstrating-power-feature-engineering-part-ii-how-i- Дэйв-c%C3%B4t%C3%A9/

Теперь давайте импортируем набор данных:

… и подготовьте базовые данные!:

Данные готовы для модели MDN!

Теперь давайте предскажем набор тестовых данных, используя «стратегию вероятностей наилучшей смеси (параметр Pi)», и построим график результата (y_pred против y_test):

Об этой технике визуализации вы можете прочитать в одной из моих предыдущих статей: https://www.linkedin.com/pulse/visualization-trick-multivariate-regression-problems-dave-c%C3%B4t%C3%A9/

Ух ты! Это совершенно безумие! С R2 89,09 и MAE 882,54 MDN просто уничтожил его!

Давайте для развлечения построим график зависимости подгонки от истинного распределения:

Почти точно так же!

Если мы разберем смешанную модель:

В общем распределении смеси имеется шесть различных распределений.

Мы можем генерировать многомерные выборки из подобранной смешанной модели (PCA применяется для визуализации результата в 2D):

Сгенерированные образцы очень близки к реальным!

Мы можем предсказать по каждому распределению, если захотим:

Мы можем проверить, есть ли в наборе данных перекрывающиеся кластеры:

y_pred_overlaps имеет то же количество строк, что и набор данных X_test, поэтому перекрытия нет! (Мы можем настроить пороговое значение параметра пи для чувствительности)

10ЗАКЛЮЧЕНИЕ

· MDN отлично справился с набором данных одномерной регрессии, где два кластера перекрываются друг с другом и где X может иметь более одного выхода Y по сравнению с линейными или нелинейными классическими моделями машинного обучения.

· MDN также отлично справился с задачей многомерной регрессии и может конкурировать с популярной моделью, такой как XGBoost.

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

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

Я надеюсь, что эта статья помогла вам в вашем путешествии по машинному обучению!