Как найти клиентов с помощью нейронных сетей??

Всем добрый день! Хочу в этой статье с вами поделиться на тему решения проблемы поиска клиентов с помощью нейронных сетей.

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

Итак, допустим вы банк и у вас есть N-ое количество продуктов, например такое, как показано на рис. 1.

<p><i>Рис. 1. Распределение количества клиентов по продуктам</i></p>

Рис. 1. Распределение количества клиентов по продуктам

Вы вот смотрите на ваших клиентов (рис. 1) и думаете, блин, как то мы маловато Страховок продаём, надо бы продать их больше. Но продать кому?? Разумеется в первую очередь вашим действующим клиентам, пользующимся другими услугами компании.

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

Некоторые начальные вводные

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

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

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

<p><i>Рис. 2. Распределение клиентов по результатам расчёта</i></p>

Рис. 2. Распределение клиентов по результатам расчёта

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

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

Как решается подобная задача?

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

Что такое профиль клиента??

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

То есть, у клиента есть некие параметры, на основании анализа которых вы и делаете соответствующие выводы. Это могут быть:

1. Пол.

2. Возраст.

3. Семейное положение.

4. Образование.

5. Достаток/уровень заработка.

6. Географические признаки.

7. Физиологические признаки.

8. Поведенческие признаки.

9. Любые другие признаки, какие вы только можете придумать.

При этом здесь вы должны понимать одну СУПЕР ВАЖНУЮ ВЕЩЬ. Вы должны знать вашего клиента! Чем больше и лучше вы знаете вашего клиента, чем лучше и точнее вы можете выстроить ваши модели.

Обратите в ваших компаниях самое пристальное внимание на данные которые вы собираете о клиентах. Обратите внимание на то, в каком виде вы их собираете. Чистота, полнота, единообразие данные.

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

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

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

У вас есть данные о клиентах, что дальше??

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

Делается это с применением автоэнкодера (рис. 3)

<i>Рис. 3. Схематическое представление автоэнкодера</i>
Рис. 3. Схематическое представление автоэнкодера

Пример кода на python|keras:

inputs = tf.keras.layers.Input(shape=(data_train_close_train.shape[1], data_train_close_train.shape[2])) L1 = LSTM(16, activation='relu', return_sequences=True, kernel_regularizer=regularizers.l2(0.00))(inputs) L2 = LSTM(4, activation='relu', return_sequences=False)(L1) L3 = RepeatVector(data_train_close_train.shape[1])(L2) L4 = LSTM(4, activation='relu', return_sequences=True)(L3) L5 = LSTM(16, activation='relu', return_sequences=True)(L4) outputs = TimeDistributed(Dense(data_train_close_train.shape[2]))(L5) model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

Как это работает?? На вход и выход подаётся набор признаков в виде массива, который в python называется вектор.

<p><i>Рис. 4. Представление профиля клиента в многомерном пространстве</i></p>

Рис. 4. Представление профиля клиента в многомерном пространстве

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

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

<p><i>Рис. 5. Схема работы автоэнкодера на примере фондового рынка</i></p>

Рис. 5. Схема работы автоэнкодера на примере фондового рынка

В основе работы автоэнкодера лежит расчёт отклонения. Посмотрите на график снизу. В примере на рисунке 3 показано среднеквадратическое отклонение.

Если объяснять на пальцах, то если какая-то группа данных подобна тому, чему обучали автоэнкодер, то отклонение будет маленькое. Если данные будут сильно отличаться, то отклонение будет большое.

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

Теперь другой важный нюанс.

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

В нашем случае в качестве отклонения нужно использовать расстояние между профилями точек в многомерном пространстве. В данном случае Евклидово расстояние (рис. 6).

<p><i>Рис. 6. Евклидово расстояние</i></p>

Рис. 6. Евклидово расстояние

В данном случае рассчитывается Евклидово расстояние между действительным профилем анализируемого клиента и расчётным по нейронным сетям.

В качестве примера для расчёта Евклидова расстояния между векторами в python|keras можно использовать следующий код:

import keras.backend as K def euclidean_distance_loss(y_true, y_pred): """ Euclidean distance loss https://en.wikipedia.org/wiki/Euclidean_distance :param y_true: TensorFlow/Theano tensor :param y_pred: TensorFlow/Theano tensor of the same shape as y_true :return: float """ return K.sqrt(K.sum(K.square(y_pred - y_true), axis=-1)) Use it: model.compile(loss=euclidean_distance_loss, optimizer='rmsprop')

Теперь, как работает автоэнкодер в данном случае??

<i>Рис. 7. Работа автоэнкодера</i>
Рис. 7. Работа автоэнкодера

Когда работает нейронная сеть, то она пытается восстановить профиль клиента так, как она была обучена. Для каждой аналитизуемой точки (профиля клиента) мы получаем отклонение (Евклидово расстояние).

Чем ближе к нулю это отклонение, тем более подобен клиент профилю нужного нам клиента. Чем отклонение больше, тем клиент похож меньше.

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

<p><i>Рис. 8. Результаты расчёта отклонений</i></p>

Рис. 8. Результаты расчёта отклонений

Соответственно, исходя из распределения отклонений вы уже можете найти клиентов, которые имеют целевой профиль (рис. 9).

<p><i>Рис. 9. Клиенты с наиболее похожим профилем относительно клиентов открывших кредит </i></p>

Рис. 9. Клиенты с наиболее похожим профилем относительно клиентов открывших кредит

<p><i>Рис. 10. Разбиение клиентов на выборки</i></p>

Рис. 10. Разбиение клиентов на выборки

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

Вместо заключения

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

2. Я бы рекомендовал при формировании признаков профиля клиента приводить признаки к вещественным (то есть, максимально отказаться от категориальных). Это связано с трудностью восстановления категориальных признаков.

Контакты:

Всех благ, побед и

успехов!

66
3 комментария

Только обсуждали это недавно, спасибо за статью

1
Ответить

Чел, норм!

Ответить

Очень круто, спасибо! И рисунки годные )

Ответить