1./ Введение
Сегментация клиентов является важной задачей для банков, поскольку позволяет им лучше понимать своих клиентов и предоставлять персонализированные услуги. Генеративные модели ИИ могут помочь в решении этой задачи, предлагая новый подход к сегментации клиентов. В этой статье мы рассмотрим процесс использования вариационного автокодировщика (VAE), типа генеративной модели, для проведения сегментации клиентов.
2./ Сегментация
a./ Создание синтетических данных
Во-первых, мы создадим некоторые синтетические данные, представляющие клиентскую базу банка. Эти данные будут включать в себя такую информацию, как возраст, доход, сумма кредита и кредитный рейтинг:
import pandas as pd import numpy as np # Set a seed for reproducibility np.random.seed(0) # Number of samples n_samples = 1000 # Generate synthetic data ages = np.random.randint(20, 70, size=n_samples) # Customer ages incomes = np.random.randint(30000, 120000, size=n_samples) # Annual incomes loan_amounts = np.random.randint(5000, 50000, size=n_samples) # Loan amounts credit_scores = np.random.randint(600, 850, size=n_samples) # Credit scores # Create DataFrame df = pd.DataFrame({ 'Age': ages, 'Income': incomes, 'Loan_Amount': loan_amounts, 'Credit_Score': credit_scores })
б./ Предварительная обработка данных
Прежде чем мы отправим данные в генеративную модель, нам нужно масштабировать наши функции:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
c./ Построение генеративной модели
Для этой задачи мы будем использовать вариационный автоматический кодировщик (VAE), тип генеративной модели, которая может научиться представлять многомерные данные в пространстве с меньшими измерениями. VAE работают, кодируя входные данные в пространство более низкой размерности, внося некоторую случайность в это пространство, а затем декодируя эту случайную точку обратно в исходное пространство.
import tensorflow as tf from tensorflow.keras.layers import Input, Dense from tensorflow.keras.models import Model # Define the size of the encoded representation encoding_dim = 2 # Define the encoder class Encoder(tf.keras.Model): def __init__(self, encoding_dim, **kwargs): super(Encoder, self).__init__(**kwargs) self.hidden = Dense(50, activation='relu') self.out_mean = Dense(encoding_dim) self.out_log_sigma = Dense(encoding_dim) def call(self, inputs): hidden = self.hidden(inputs) z_mean = self.out_mean(hidden) z_log_sigma = self.out_log_sigma(hidden) z = self.sampling((z_mean, z_log_sigma)) return z_mean, z_log_sigma, z def sampling(self, args): z_mean, z_log_sigma = args epsilon = tf.keras.backend.random_normal(shape=(tf.shape(z_mean)[0], encoding_dim), mean=0., stddev=0.1) return z_mean + tf.keras.backend.exp(z_log_sigma) * epsilon encoder = Encoder(encoding_dim=2) # Define the decoder class Decoder(tf.keras.Model): def __init__(self, **kwargs): super(Decoder, self).__init__(**kwargs) self.hidden = Dense(50, activation='relu') self.out = Dense(4, activation='sigmoid') def call(self, inputs): hidden = self.hidden(inputs) return self.out(hidden) decoder = Decoder()
d./ Определение модели VAE
Теперь мы определяем пользовательскую модель VAE, которая использует кодировщик и декодер:
class VAE(tf.keras.Model): def __init__(self, encoder, decoder, **kwargs): super(VAE, self).__init__(**kwargs) self.encoder = encoder self.decoder = decoder def train_step(self, data): if isinstance(data, tuple): data = data[0] with tf.GradientTape() as tape: z_mean, z_log_sigma, z = self.encoder(data) reconstruction = self.decoder(z) reconstruction_loss = tf.reduce_mean( tf.keras.losses.binary_crossentropy(data, reconstruction) ) reconstruction_loss *= 4 kl_loss = 1 + z_log_sigma - tf.square(z_mean) - tf.exp(z_log_sigma) kl_loss = tf.reduce_mean(kl_loss) kl_loss *= -0.5 total_loss = reconstruction_loss + kl_loss grads = tape.gradient(total_loss, self.trainable_weights) self.optimizer.apply_gradients(zip(grads, self.trainable_weights)) return { "loss": total_loss, "reconstruction_loss": reconstruction_loss, "kl_loss": kl_loss, } vae = VAE(encoder, decoder) vae.compile(optimizer='rmsprop')
e./ Обучение VAE
Теперь мы можем обучить наш VAE на данных клиента:
vae.fit(df_scaled, epochs=100, batch_size=32)
f./ Сегментация клиентов
С нашей обученной моделью VAE мы можем использовать кодирующую часть VAE для сопоставления наших многомерных данных о клиентах с двумерным скрытым пространством. Затем мы можем использовать алгоритм кластеризации, такой как K-Means, для определения отдельных сегментов клиентов в этом пространстве:
# Transform data to 2D df_2d = encoder.predict(df_scaled) # Convert to DataFrame df_2d = pd.DataFrame(df_2d[0], columns=['Dimension 1', 'Dimension 2']) # Plot the clusters import matplotlib.pyplot as plt plt.scatter(df_2d['Dimension 1'], df_2d['Dimension 2']) plt.xlabel('Dimension 1') plt.ylabel('Dimension 2') plt.show() from sklearn.cluster import KMeans # Create a KMeans model - let's start with 4 clusters kmeans = KMeans(n_clusters=4, random_state=0) # Fit the model to the data kmeans.fit(df_2d) # Get the cluster assignments for each data point labels = kmeans.labels_ # Plot the clusters with different colors plt.scatter(df_2d['Dimension 1'], df_2d['Dimension 2'], c=labels, cmap='viridis') plt.xlabel('Dimension 1') plt.ylabel('Dimension 2') plt.title('Customer Segmentation') plt.colorbar().set_label('Segment ID') plt.show()
Сначала мы подгоняем модель K-средних к 2D-данным, чтобы идентифицировать 4 отдельных кластера. Затем мы наносим 2D-данные, раскрашивая каждую точку в зависимости от ее кластерного назначения. Цветная полоса в правой части графика показывает, какой цвет соответствует какому кластеру (или сегменту).
Помните, что количество кластеров — это гиперпараметр, который вам нужно установить. Здесь мы установили его на 4 в качестве отправной точки, но вам может потребоваться настроить его в зависимости от конкретной структуры ваших данных. Такие методы, как метод локтя или анализ силуэта, могут помочь вам определить подходящее количество кластеров.
from sklearn.metrics import silhouette_score # Compute the silhouette scores for each sample silhouette_vals = silhouette_score(df_scaled, kmeans.labels_) print(f'Silhouette score: {silhouette_vals:.2f}')
Оценка силуэта — это мера того, насколько объект похож на свой собственный кластер по сравнению с другими кластерами. Значение силуэта находится в диапазоне от -1 до 1. Вот как вы можете интерпретировать это значение:
- Рядом с +1: образец находится далеко от соседних кластеров. Это говорит о том, что выборка хорошо кластеризована, то есть явно входит в назначенную ей группу.
- Около 0: выборка находится на границе решения между двумя соседними кластерами или очень близка к ней. Это могло указывать на перекрывающиеся кластеры, и образец мог быть отнесен к неправильному кластеру.
- Меньше 0: Образцы в одном кластере более непохожи, чем на образцы в других кластерах. Это предполагает, что выборка была бы лучше сгруппирована в соседнем кластере.
Более высокая средняя ширина силуэта указывает на лучшую кластеризацию. Итак, в общем, вы хотите, чтобы оценка силуэта была как можно ближе к 1 для всех кластеров. Общая средняя оценка силуэта, близкая к 1, указывает на хорошую кластеризацию, около 0 указывает на перекрывающиеся кластеры, а отрицательные значения обычно указывают на неправильную кластеризацию.
Чтобы предоставить описания каждого сегмента, нам нужно понять свойства клиентов в каждом кластере с точки зрения исходных характеристик: возраст, доход, сумма кредита и кредитный рейтинг. Мы можем использовать метки кластеров из нашей модели K-средних и вычислить среднее значение этих функций в каждом кластере.
Сначала добавьте метки кластера в исходный (предварительно масштабированный) кадр данных.
df['Segment'] = labels
Затем вычислите среднее значение каждой функции в каждом сегменте:
segment_characteristics = df.groupby('Segment').mean()
Это даст вам новый DataFrame segment_characteristics
, где индекс соответствует идентификатору сегмента (0, 1, 2, 3, если вы использовали 4 кластера), а столбцы — это средний возраст, доход, сумма кредита и кредитный рейтинг в каждом сегменте.
3./ Как работает VAE?
Вариационные автокодировщики (VAE) — это мощные модели, помогающие в сжатии и генерации данных. Это особый тип генеративной модели, в которой используются концепции глубокого обучения, вероятностных графических моделей и вариационного вывода.
В контексте сегментации клиентов VAE выполняют нелинейное отображение многомерных данных в низкоразмерное скрытое пространство. Это отображение является вероятностным, то есть вместо отображения входных данных в фиксированную точку оно отображает входные данные в распределение по скрытому пространству.
Вот пошаговое описание того, как VAE работают для сегментации:
- Кодировщик: входные данные (в нашем случае данные клиента) передаются через кодировщик, который представляет собой глубокую нейронную сеть. Работа кодировщика состоит в том, чтобы изучить параметры (среднее значение и дисперсию) распределения вероятностей, которое представляет данные в пространстве меньшей размерности. Это низкоразмерное пространство часто называют «скрытым пространством» или «узким местом», и именно здесь происходит сжатие данных.
- Скрытое пространство и выборка: для каждой точки данных кодировщик выводит среднее значение и дисперсию, которые определяют распределение в скрытом пространстве. Из этого распределения выбирается точка, чтобы сохранить порождающий характер модели. Этот шаг выборки вводит случайность, которая помогает модели генерировать новые, невидимые данные.
- Декодер: точка выборки из скрытого пространства затем передается через декодер, еще одну глубокую нейронную сеть. Декодер отображает выбранную точку обратно в исходное многомерное пространство. Целью декодера является восстановление исходных входных данных.
- Реконструкция и обучение: VAE обучается путем минимизации функции потерь, состоящей из двух частей: потери при реконструкции (насколько хорошо декодер восстанавливает исходный ввод после процесса кодирования и декодирования) и расхождения KL (мера того, насколько изучены распределение отклоняется от стандартного нормального распределения, гарантируя, что скрытое пространство имеет хорошие свойства).
В контексте сегментации клиентов после обучения VAE мы можем использовать кодировщик для сопоставления данных клиентов со скрытым пространством. Этот процесс эффективно уменьшает размерность данных, сохраняя при этом их структуру. Затем мы можем использовать традиционные алгоритмы кластеризации (например, K-средние) в этом низкоразмерном пространстве для формирования клиентских сегментов.
Таким образом, VAE позволяют нам представлять сложные многомерные данные о клиентах в упрощенном виде и могут выявить скрытую структуру данных, что способствует более эффективной сегментации клиентов.
4./ Сравнение VAE с традиционными моделями кластеризации
VAE предлагают явные преимущества и недостатки по сравнению с традиционными методами кластеризации:
Преимущества VAE:
- Сжатие данных. VAE сжимают многомерные данные в низкоразмерное пространство, выявляя скрытые структуры, которые могут быть упущены из виду традиционными методами кластеризации.
- Возможности генерации: VAE могут генерировать новые точки данных, аналогичные обучающему набору, что позволяет увеличивать данные и обнаруживать аномалии.
- Нелинейные сопоставления. VAE могут фиксировать сложные нелинейные отношения в данных, в отличие от PCA и других методов уменьшения линейной размерности.
Недостатки VAE:
- Сложность. VAE более сложны, чем традиционные алгоритмы кластеризации, и требуют значительных знаний в области глубокого обучения, вероятностных моделей и оптимизации.
- Вычислительные ресурсы. Для обучения VAE требуется больше вычислительных ресурсов и времени, что может стать проблемой для больших наборов данных или сред с ограниченными ресурсами.
- Отсутствие явной кластеризации. Сами VAE не выполняют кластеризацию, а проецируют данные в низкоразмерное пространство, которое можно кластеризовать традиционными методами.
- Требуется настройка. У VAE есть несколько гиперпараметров, которые необходимо настроить для обеспечения хорошей производительности.
5./ Заключение
Сегментация клиентов жизненно важна для банков, чтобы предоставлять более качественные, адаптированные услуги. В то время как традиционные методы кластеризации имеют свои достоинства, VAE предлагают более мощный, хотя и сложный инструмент для понимания поведения клиентов. Когда VAE сочетаются с традиционными методами кластеризации, они дают возможность выявить более тонкие сегменты клиентов, обеспечивая превосходный уровень персонализированного обслуживания. Тем не менее, выбор метода зависит от конкретных требований проекта, ограничений и имеющегося опыта.