Кластеризация K-средних для смешанных числовых и категориальных данных

133

Мой набор данных содержит ряд числовых атрибутов и один категориальный.

Скажи NumericAttr1, NumericAttr2, ..., NumericAttrN, CategoricalAttr,

где CategoricalAttrпринимает один из трех возможных значений: CategoricalAttrValue1, CategoricalAttrValue2или CategoricalAttrValue3.

Я использую стандартную реализацию алгоритма кластеризации k-средних для Octave https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/ . Работает только с числовыми данными.

Поэтому мой вопрос: правильно ли разделить категориальный атрибут CategoricalAttrна три числовые (двоичные) переменные, как IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3?

IharS
источник
7
Да, использование кодировки 1-из-n также допустимо.
Шон Оуэн
1
Возможно , этот подход был бы полезен: zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/...
Есть ли у вас какие-либо идеи о кластеризованном сочетании категорийных и числовых данных «ВРЕМЯ СЕРИИ»?
Лейла Юсефи

Ответы:

122

Стандартный алгоритм k-средних напрямую не применим к категориальным данным по разным причинам. Образец пространства для категориальных данных дискретен и не имеет естественного происхождения. Евклидова функция расстояния в таком пространстве не имеет большого смысла. Как кто-то сказал: «Тот факт, что змея не имеет ни колес, ни ног, не позволяет нам ничего сказать об относительной ценности колес и ног». ( отсюда )

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

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

Поиски в Google по запросу «смесь категориальных данных по k-средним значениям» приводят довольно много недавних статей о различных алгоритмах кластеризации по типу k-средних со смесью категориальных и числовых данных. (Я еще не читал их, поэтому не могу комментировать их достоинства.)


На самом деле, то, что вы предлагаете (преобразование категориальных атрибутов в двоичные значения, а затем выполнение k-средних, как если бы они были числовыми значениями), является еще одним подходом, который был опробован ранее (предшествующий k-режимам). (См. Ralambondrainy, H. 1995. Концептуальная версия алгоритма k-средних. Буквы распознавания образов, 16: 1147–1157.) Но я полагаю, что подход k-режимов предпочтителен по причинам, которые я указал выше.

Тим Гудман
источник
10
Если вы масштабируете свои числовые характеристики до того же диапазона, что и бинаризованные категориальные признаки, то косинусное сходство, как правило, дает очень похожие результаты для подхода Хемминга, описанного выше. У меня нет надежного способа проверить, что это работает во всех случаях, поэтому, когда я смешал данные cat и num, я всегда проверяю кластеризацию на выборке с помощью простого косинусного метода, который я упомянул, и более сложного смешивания с Хэммингом. Если разница незначительна, я предпочитаю более простой метод.
cwharland
1
Это звучит как разумный подход, @cwharland. При дальнейшем рассмотрении я также отмечаю, что одно из преимуществ, которое Хуан дает для подхода k-mode по сравнению с подходом Раламбондрейни, - то, что вам не нужно вводить отдельную функцию для каждого значения вашей категориальной переменной - на самом деле не имеет значения в Случай OP, когда он имеет только одну категориальную переменную с тремя значениями. Лучше пойти с самым простым подходом, который работает.
Тим Гудман
3
Хороший ответ. Потенциально полезно: я реализовал k-режимы Хуанга и k-прототипы (и некоторые вариации) в Python: github.com/nicodv/kmodes
Def_Os
2
Я не рекомендую преобразовывать категориальные атрибуты в числовые значения. Представьте, что у вас есть два названия города: Нью-Йорк и Лос-Анджелес. Если вы подаете заявку на номер 3 в Нью-Йорке и в Лос-Анджелесе на 8, расстояние составляет 5, но это 5 не имеет никакого отношения к разнице между Нью-Йорком и Лос-Анджелесом.
adesantos
@adesantos Да, это проблема с представлением нескольких категорий с одной числовой функцией и использованием евклидова расстояния. Использование расстояния Хэмминга является одним из подходов; в этом случае расстояние равно 1 для каждого отличающегося объекта (а не разницы между числовыми значениями, присвоенными категориям). Присвоение каждой категории собственной функции - это другой подход (например, 0 или 1 для «is it NY» и 0 или 1 для «is it LA»).
Тим Гудман
24

На мой взгляд, есть решения для работы с категориальными данными при кластеризации. R приходит с определенным расстоянием для категориальных данных. Это расстояние называется Gower ( http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist ) и работает довольно хорошо.

adesantos
источник
2
Это подход, который я использую для смешанного набора данных - разбиение вокруг медоидов, примененных к матрице расстояний Гауэра (см. R-bloggers.com/clustering-mixed-data-types-in-r ). Проблема заключается в том, что для вычисления матрицы расстояний требуется много памяти, пропорциональной O (n ^ 2), поэтому для наборов данных размером более 10 или 20 000 записей я рассматриваю варианты кластеризации по k-средним, которые требуют меньше памяти и могут обрабатывать смешанные данные.
RobertF
@RobertF то же самое здесь. К сожалению, допустимый размер данных слишком мал для большинства проблем.
копилка
20

(В дополнение к отличному ответу Тима Гудмана)

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

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

  2. Что касается смешанной (числовой и категориальной) кластеризации, хорошим документом, который может помочь, является: INCONCO: интерпретируемая кластеризация числовых и категориальных объектов

  3. Помимо k-средних: поскольку простой ванильный k-средний уже исключен в качестве подходящего подхода к этой проблеме, я рискну выйти за рамки идеи думать о кластеризации как о проблеме подбора моделей. Различные меры, такие как теоретико-информационная метрика: расхождение Кульбака-Либлера хорошо работает при попытке приблизить параметрическую модель к распределению данных. (Конечно, методы параметрической кластеризации, такие как GMM, медленнее, чем Kmeans, поэтому есть недостатки, которые следует учитывать)

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

Также ознакомьтесь: ROCK: надежный алгоритм кластеризации для категориальных атрибутов

Динамическая Звездная пыль
источник
17

Этот вопрос кажется действительно о представлении, и не столько о кластеризации.

Категориальные данные являются проблемой для большинства алгоритмов машинного обучения. Предположим, например, что у вас есть некоторая категориальная переменная с именем «color», которая может принимать значения красного, синего или желтого цвета. Если мы просто закодируем их численно как 1,2 и 3 соответственно, наш алгоритм будет думать, что красный (1) на самом деле ближе к синему (2), чем к желтому (3). Нам нужно использовать представление, которое позволяет компьютеру понять, что все эти вещи на самом деле одинаково различны.

Один простой способ - использовать то, что называется « горячим представлением», и это именно то, что, как вы думали, вы должны делать. Вместо того, чтобы иметь одну переменную типа «цвет», которая может принимать три значения, мы разделяем ее на три переменные. Это могут быть «color-red», «color-blue» и «color-yellow», которые могут принимать только значение 1 или 0.

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

Джордан А
источник
Я согласен с вашим ответом. HotEncoding очень полезен.
Прамит
4

Вы также можете попробовать алгоритм кластеризации Expectation Maximization. Он может работать с категориальными данными и даст вам статистическую вероятность того, какое категоричное значение (или значения) кластер с наибольшей вероятностью примет.

user490
источник
2
Можете быть более конкретными? EM относится к алгоритму оптимизации, который можно использовать для кластеризации. Есть много способов сделать это, и не совсем понятно, что вы имеете в виду.
Байер
@Bayer, я думаю, что кластеризация, упомянутая здесь, является моделью гауссовой смеси. GMM обычно использует EM.
го
1
Я не думаю, что это то, что он имеет в виду, потому что GMM не принимает категориальные переменные.
Байер
3

Это зависит от используемой вами категориальной переменной. Для порядковых переменных, скажем, плохих, средних и хороших, имеет смысл просто использовать одну переменную и иметь значения 0,1,2, а расстояния здесь имеют смысл (Avarage ближе к плохим и хорошим). Однако, если нет порядка, в идеале вы должны использовать одну горячую кодировку, как указано выше.

Баран
источник
3

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

1) Алгоритмы на основе разбиения: k-Prototypes, Squeezer
2) Иерархические алгоритмы: ROCK, Агломеративное одиночное, среднее и полное связывание
3) Алгоритмы на основе плотности: HIERDENC, MULIC, CLIQUE
4) Алгоритмы на основе модели: кластеризация SVM, Self карты

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

SR_ml
источник
2

Цель K-Means состоит в том, чтобы уменьшить дисперсию внутри кластера, и поскольку он вычисляет центроиды как среднюю точку кластера, необходимо использовать евклидово расстояние , чтобы правильно сходиться. Поэтому, если вы хотите абсолютно использовать K-Means, вам нужно убедиться, что ваши данные хорошо с ним работают.

Представление

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

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

Если категориальные значения не являются «равноудаленными» и могут быть упорядочены, вы также можете присвоить категориям числовое значение. Например, ребенок, подросток, взрослый, потенциально могут быть представлены как 0, 1 и 2. Это имело бы смысл, потому что подросток "ближе" к тому, чтобы быть ребенком, чем взрослый.

K-Medoids

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

Валентин Каломм
источник
1

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

В таких случаях вы можете использовать пакет clustMixType

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

Если вы обнаружите, что какие-либо проблемы, например, числовое значение относится к категориальным категориям, вы можете использовать as.factor () / наоборот as.numeric () в соответствующем поле и преобразовать его в множитель и ввести эти новые данные в алгоритм.

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

мы даже можем получить WSS (в пределах суммы квадратов), график (коленчатый график), чтобы найти оптимальное количество кластеров.

Надеюсь, что этот ответ поможет вам получить более значимые результаты.

Toros91
источник
1

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

Как упомянуто выше @Tim выше, не имеет смысла вычислять евклидово расстояние между точками, которые не имеют ни масштаба, ни порядка. Когда вы кодируете однозначные переменные сразу, вы генерируете разреженную матрицу из 0 и 1. Поскольку диапазон значений фиксирован и находится в диапазоне от 0 до 1, их необходимо нормализовать так же, как и для непрерывных переменных. Z-шкалы используются для определения расстояния между точками. Что до сих пор не совсем верно. Я объясню это на примере. Поскольку категории являются взаимоисключающими, расстояние между двумя точками по отношению к категориальным переменным принимает одно из двух значений: высокое или низкое, т. Е. Либо две точки принадлежат к одной и той же категории, либо нет. Из-за этих экстремальных ценностей, алгоритм заканчивает тем, что придавал больший вес непрерывным переменным, влияющим на формирование кластера. Это можно проверить, просто проверив, какие переменные влияют, и вы будете удивлены, увидев, что большинство из них будут категориальными переменными. (Способы поиска наиболее влиятельных переменных [1])

Пример: рассмотрим категориальную переменную страну. Теперь, когда мы знаем, что расстояние (различие) между наблюдениями из разных стран одинаково (если не считать других сходств, таких как соседние страны или страны одного континента). Но в противоположность этому, если вы вычисляете расстояния между наблюдениями после нормализации одного горячо закодированного значения, они будут несовместимы (хотя разница незначительна) наряду с тем, что они принимают высокие или низкие значения.

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

[1]: Поиск наиболее влиятельных переменных в формировании кластера: https://stackoverflow.com/a/53081779/8224401

Тарун Кумар Йеллапу
источник
0

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

Вы можете использовать пакет R VarSelLCM (доступен на CRAN), который моделирует в каждом кластере непрерывные переменные по гауссовским распределениям и порядковые / двоичные переменные. Позаботьтесь о том, чтобы хранить ваши данные в data.frame, где непрерывные переменные являются «числовыми», а категориальные переменные являются «факторами».

Учебное пособие доступно по адресу: http://varsellcm.r-forge.r-project.org/

Кроме того, недостающие значения могут управляться имеющейся моделью.

user200668
источник
0

Я столкнулся с той же самой проблемой и попытался обдумать ее (не зная, что существуют k-прототипы), богатая литература, с которой я столкнулся, возникла из идеи вообще не измерять переменные с одинаковой метрикой расстояния. Кроме того, могут существовать различные источники информации, которые могут подразумевать различные структуры или «представления» данных. Это естественная проблема, когда вы сталкиваетесь с социальными отношениями, такими как на твиттере / веб-сайтах и ​​т. Д.

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

Учитывая обе матрицы расстояния / сходства, которые описывают одни и те же наблюдения, можно извлечь график для каждого из них (Multi-View-Graph-Clustering) или выделить один граф с несколькими ребрами - каждый узел (наблюдение) с таким количеством ребер, чтобы другой узел, так как существуют информационные матрицы (Multi-Edge-Clustering). Каждому ребру присваивается вес соответствующей меры схожести / расстояния. Начните здесь: Github список алгоритмов кластеризации графов и их статьи, Поскольку для одного наблюдения доступно несколько наборов информации, они должны быть переплетены с использованием, например, потомков спектрального анализа или факторизации связанной матрицы. Спектральный анализ является методом по умолчанию для нахождения сильно связанных или сильно взвешенных частей отдельных графиков. Имея спектральное встраивание переплетенных данных, любой алгоритм кластеризации на числовых данных может легко работать. Литературное значение по умолчанию - kmeans для простоты, но гораздо более продвинутое, а не ограничивающие алгоритмы, которые могут использоваться взаимозаменяемо в этом контексте.

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

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

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

Веселитесь с этим!

Тим Рухкопф
источник
0

Возможно, вы захотите взглянуть на автоматическое проектирование объектов: http://www.orges-leka.de/automatic_feature_engineering.html . Метод основан на Bourgain Embedding и может использоваться для получения числовых признаков из смешанных категориальных и числовых фреймов данных или для любого набора данных, который поддерживает расстояния между двумя точками данных. Преобразовав данные только в числовые функции, можно сразу использовать кластеризацию K-средних

orgesleka
источник