Кластеризация данных смешанного типа

Предлагаемый подход с использованием R

О

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

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

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

В этом посте я сосредоточусь на таких ситуациях в контексте неконтролируемого упражнения по классификации с использованием R.

  • Первая часть посвящена методологии: я обсуждаю проблему измерения сходства между людьми, используя математическую концепцию расстояния. Затем я представляю алгоритм кластеризации PAM (разбиение на медоиды), а также способ выбора оптимального количества кластеров (коэффициент силуэта). В заключение я хотел бы сказать пару слов о интерпретации.
  • Во второй части я иллюстрирую подход с использованием набора данных банковского маркетинга, доступного в репозитории машинного обучения uci, и некоторых полезных функций из пакетов cluster и Rtsne. Этот набор данных связан с кампаниями прямого маркетинга (телефонными звонками) португальского банковского учреждения и традиционно используется для обсуждения контролируемого обучения (цель классификации - предсказать, подпишется ли клиент на срочный депозит). Однако он содержит некоторую информацию о клиентах банка, которых мы попытаемся сгруппировать априори.

Давайте начнем!

ЧАСТЬ I: МЕТОДОЛОГИЯ

КАК ИЗМЕРИТЬ Сходство

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

Расстояние Гауэра вычисляется как среднее значение частичных различий между людьми. Каждое частичное несходство (и, следовательно, расстояние Гауэра) находится в диапазоне [0 1].

Частичное несходство (d_ij^f) вычисление зависит от типа оцениваемой переменной. Это означает, что к каждому объекту будет применяться определенная стандартизация, а расстояние между двумя людьми является средним для всех расстояний, характерных для конкретных объектов.

  • Для числового признака f частичное несходство - это соотношение между 1) абсолютной разницей наблюдений x_i и x_j и 2) максимальным диапазоном, наблюдаемым для всех индивидуумов: d_ij^f = |x_i — x_j| / |(max_N(x) — min_N(x))|, N - количество особей в наборе данных.

  • Для качественного признака f частичное несходство равно 1, только если наблюдения y_i и y_j имеют разные значения. В противном случае - ноль.

Примечание. Расстояние Гоуэра доступно в R с помощью daisy()функции из cluster пакета. Сначала функции автоматически стандартизируются (т. Е. Масштабируются до диапазона [0 1]).

Алгоритм кластеризации: РАЗДЕЛЕНИЕ НА МЕДОИДЫ (PAM)

Расстояние Гауэра хорошо согласуется с алгоритмом k-medoids. k-medoid - это классический метод разбиения на кластеры, который объединяет набор данных из n объектов в k кластеров, известных априори.

Очень похожий на алгоритм k-средних, PAM имеет следующие характеристики:

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

ОЦЕНИТЬ СООТВЕТСТВИЕ КЛАСТЕРАМ ДАННЫХ

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

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

ТОЛКОВАНИЕ

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

  • 1. Сводка по каждому кластеру с использованием функции summary() в R.
  • 2. Визуализация в пространстве меньшей размерности, с t-SNE, с использованием Rtsne() функции в R. t-Распределенное стохастическое соседнее вложение (t-SNE) - это метод уменьшения размерности, который особенно хорош подходит для визуализации многомерных наборов данных.

Мы рассмотрим оба случая в варианте использования (Часть II). Хватит теории, давайте применим и проиллюстрируем!

ЧАСТЬ II: ИСПОЛЬЗОВАНИЕ

В этом случае мы попытаемся сгруппировать клиентов банка по следующим характеристикам:

  • возраст (числовой)
  • тип работы (категориальный): «администратор», «синий воротничок», «предприниматель», «домработница», «менеджмент», «пенсионер», «самозанятый», «услуги», «студент», «техник», «безработный», «неизвестный»
  • семейное положение (категориальное): «разведен», «женат», «холост», «неизвестен»
  • образование (категориальное): «начальное», «среднее», «высшее», «неизвестное».
  • по умолчанию: есть кредит по умолчанию? (категорично): «нет», «да», «неизвестно»
  • баланс (числовой): средний годовой баланс в евро.
  • жилье: есть жилищная ссуда? (категорично): «нет», «да», «неизвестно»
#' Load useful packages
library(cluster)
library(dplyr)
library(ggplot2)
library(readr)
library(Rtsne)
#' Load data
df <- read_csv2("../data/001_unsupervised_mixed_types_data/bank.csv")

Наиболее похожие и непохожие клиенты согласно расстоянию Гауэра:

#' Compute Gower distance
gower_dist <- daisy(df, metric = "gower")
gower_mat <- as.matrix(gower_dist)
#' Print most similar clients
df[which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]), arr.ind = TRUE)[1, ], ]
# A tibble: 2 x 7
    age job        marital education default balance housing
  <int> <fct>      <fct>   <fct>     <fct>     <int> <fct>  
1    52 technician married secondary no          196 yes    
2    52 technician married secondary no          195 yes
#' Print most dissimilar clients
df[which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]), arr.ind = TRUE)[1, ], ]
# A tibble: 2 x 7
    age job     marital  education default balance housing
  <int> <fct>   <fct>    <fct>     <fct>     <int> <fct>  
1    60 retired married  primary   no        71188 no     
2    26 admin.  divorced secondary yes          -3 yes

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

sil_width <- c(NA)
for(i in 2:8){  
  pam_fit <- pam(gower_dist, diss = TRUE, k = i)  
  sil_width[i] <- pam_fit$silinfo$avg.width  
}
plot(1:8, sil_width,
     xlab = "Number of clusters",
     ylab = "Silhouette Width")
lines(1:8, sil_width)

Устный перевод

  • Резюме каждого кластера
k <- 5
pam_fit <- pam(gower_dist, diss = TRUE, k)
pam_results <- df %>%
  mutate(cluster = pam_fit$clustering) %>%
  group_by(cluster) %>%
  do(the_summary = summary(.))
pam_results$the_summary

Здесь можно попытаться вывести некоторые общие шаблоны для клиентов в кластере. Например, кластер 1 состоит из клиентов «менеджмент х третичный х нет по умолчанию х нет жилья», кластер 2 состоит из «синие воротнички х второстепенный х нет по умолчанию х корпус» клиенты и т. д.

  • Визуализация в пространстве меньшего измерения
tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
  data.frame() %>%
  setNames(c("X", "Y")) %>%
  mutate(cluster = factor(pam_fit$clustering))
ggplot(aes(x = X, y = Y), data = tsne_data) +
  geom_point(aes(color = cluster))

Хотя это и не идеально (особенно кластер 3), цвета в основном расположены в схожих областях, что подтверждает актуальность сегментации.

ЗАКЛЮЧЕНИЕ

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

Однако остается ряд проблем, в том числе:

  • Как работать с массивными наборами данных (интенсивность памяти cf)?
  • Одно «горячее» кодирование могло бы стать решением; каковы плюсы и минусы этих двух подходов?

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

ИСТОЧНИКИ