Мой набор данных содержит ряд числовых атрибутов и один категориальный.
Скажи 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
?
Ответы:
Стандартный алгоритм k-средних напрямую не применим к категориальным данным по разным причинам. Образец пространства для категориальных данных дискретен и не имеет естественного происхождения. Евклидова функция расстояния в таком пространстве не имеет большого смысла. Как кто-то сказал: «Тот факт, что змея не имеет ни колес, ни ног, не позволяет нам ничего сказать об относительной ценности колес и ног». ( отсюда )
Существует вариация k-средних, известных как k-моды, представленная в этой статье Жексю Хуанг, которая подходит для категориальных данных. Обратите внимание, что решения, которые вы получаете, чувствительны к начальным условиям, как описано здесь (PDF), например.
В статье Хуанга (ссылка выше) также есть раздел о «k-прототипах», который применяется к данным со смесью категориальных и числовых характеристик. Он использует меру расстояния, которая смешивает расстояние Хемминга для категориальных объектов и евклидово расстояние для числовых объектов.
Поиски в Google по запросу «смесь категориальных данных по k-средним значениям» приводят довольно много недавних статей о различных алгоритмах кластеризации по типу k-средних со смесью категориальных и числовых данных. (Я еще не читал их, поэтому не могу комментировать их достоинства.)
На самом деле, то, что вы предлагаете (преобразование категориальных атрибутов в двоичные значения, а затем выполнение k-средних, как если бы они были числовыми значениями), является еще одним подходом, который был опробован ранее (предшествующий k-режимам). (См. Ralambondrainy, H. 1995. Концептуальная версия алгоритма k-средних. Буквы распознавания образов, 16: 1147–1157.) Но я полагаю, что подход k-режимов предпочтителен по причинам, которые я указал выше.
источник
На мой взгляд, есть решения для работы с категориальными данными при кластеризации. R приходит с определенным расстоянием для категориальных данных. Это расстояние называется Gower ( http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist ) и работает довольно хорошо.
источник
(В дополнение к отличному ответу Тима Гудмана)
Выбор k-режимов определенно является способом обеспечения стабильности используемого алгоритма кластеризации.
Алгоритм кластеризации может выбирать любую метрику расстояния / оценку сходства. Евклидова самая популярная. Но можно использовать любую другую метрику, которая масштабируется в соответствии с распределением данных в каждом измерении / атрибуте, например метрика Махаланобиса.
Что касается смешанной (числовой и категориальной) кластеризации, хорошим документом, который может помочь, является: INCONCO: интерпретируемая кластеризация числовых и категориальных объектов
Помимо k-средних: поскольку простой ванильный k-средний уже исключен в качестве подходящего подхода к этой проблеме, я рискну выйти за рамки идеи думать о кластеризации как о проблеме подбора моделей. Различные меры, такие как теоретико-информационная метрика: расхождение Кульбака-Либлера хорошо работает при попытке приблизить параметрическую модель к распределению данных. (Конечно, методы параметрической кластеризации, такие как GMM, медленнее, чем Kmeans, поэтому есть недостатки, которые следует учитывать)
Кластеризация нечетких k-мод также звучит привлекательно, поскольку методы нечеткой логики были разработаны для работы с чем-то вроде категориальных данных. См. Нечеткую кластеризацию категориальных данных с использованием нечетких центроидов для получения дополнительной информации.
Также ознакомьтесь: ROCK: надежный алгоритм кластеризации для категориальных атрибутов
источник
Этот вопрос кажется действительно о представлении, и не столько о кластеризации.
Категориальные данные являются проблемой для большинства алгоритмов машинного обучения. Предположим, например, что у вас есть некоторая категориальная переменная с именем «color», которая может принимать значения красного, синего или желтого цвета. Если мы просто закодируем их численно как 1,2 и 3 соответственно, наш алгоритм будет думать, что красный (1) на самом деле ближе к синему (2), чем к желтому (3). Нам нужно использовать представление, которое позволяет компьютеру понять, что все эти вещи на самом деле одинаково различны.
Один простой способ - использовать то, что называется « горячим представлением», и это именно то, что, как вы думали, вы должны делать. Вместо того, чтобы иметь одну переменную типа «цвет», которая может принимать три значения, мы разделяем ее на три переменные. Это могут быть «color-red», «color-blue» и «color-yellow», которые могут принимать только значение 1 или 0.
Это увеличивает размерность пространства, но теперь вы можете использовать любой алгоритм кластеризации, который вам нравится. Иногда имеет смысл zscore или отбеливать данные после выполнения этого процесса, но ваша идея определенно разумна.
источник
Вы также можете попробовать алгоритм кластеризации Expectation Maximization. Он может работать с категориальными данными и даст вам статистическую вероятность того, какое категоричное значение (или значения) кластер с наибольшей вероятностью примет.
источник
Это зависит от используемой вами категориальной переменной. Для порядковых переменных, скажем, плохих, средних и хороших, имеет смысл просто использовать одну переменную и иметь значения 0,1,2, а расстояния здесь имеют смысл (Avarage ближе к плохим и хорошим). Однако, если нет порядка, в идеале вы должны использовать одну горячую кодировку, как указано выше.
источник
Вы не должны использовать кластеризацию k-средних для набора данных, содержащего смешанные типы данных. Скорее, существует ряд алгоритмов кластеризации, которые могут соответствующим образом обрабатывать смешанные типы данных. Некоторые возможности включают следующее:
1) Алгоритмы на основе разбиения: k-Prototypes, Squeezer
2) Иерархические алгоритмы: ROCK, Агломеративное одиночное, среднее и полное связывание
3) Алгоритмы на основе плотности: HIERDENC, MULIC, CLIQUE
4) Алгоритмы на основе модели: кластеризация SVM, Self карты
Если вы хотите узнать больше об этих алгоритмах, рукопись «Обзора алгоритмов кластеризации», написанная Rui Xu, предлагает исчерпывающее введение в кластерный анализ.
источник
Цель K-Means состоит в том, чтобы уменьшить дисперсию внутри кластера, и поскольку он вычисляет центроиды как среднюю точку кластера, необходимо использовать евклидово расстояние , чтобы правильно сходиться. Поэтому, если вы хотите абсолютно использовать K-Means, вам нужно убедиться, что ваши данные хорошо с ним работают.
Представление
K-Means и кластеризация в целом пытаются разделить данные на значимые группы, убедившись, что экземпляры в тех же кластерах похожи друг на друга. Следовательно, вам нужен хороший способ представления ваших данных, чтобы вы могли легко вычислить значимую меру сходства.
Использование горячего кодирования для категориальных переменных - хорошая идея, когда категории равноудалены друг от друга. Например, если у вас есть светло-синий, темно-синий и желтый цвета, использование однократного кодирования может не дать вам наилучших результатов, поскольку темно-синий и светло-синий скорее всего «ближе» друг к другу, чем к желтому.
Если категориальные значения не являются «равноудаленными» и могут быть упорядочены, вы также можете присвоить категориям числовое значение. Например, ребенок, подросток, взрослый, потенциально могут быть представлены как 0, 1 и 2. Это имело бы смысл, потому что подросток "ближе" к тому, чтобы быть ребенком, чем взрослый.
K-Medoids
Более общий подход к K-Means - это K-Medoids. K-Medoids работает аналогично K-Means, но главное отличие состоит в том, что центроид для каждого кластера определяется как точка, которая уменьшает сумму расстояний внутри кластера. Применение этого позволяет вам использовать любую меру расстояния, которую вы хотите, и, следовательно, вы можете создать свою собственную пользовательскую меру, которая будет учитывать, какие категории должны быть близкими или нет.
источник
Если мы рассмотрим сценарий, в котором категориальная переменная не может быть закодирована в горячем виде, как у категориальной переменной более 200 категорий.
В таких случаях вы можете использовать пакет clustMixType
Он может обрабатывать смешанные данные (числовые и категориальные), вам просто нужно ввести данные, он автоматически разделяет категориальные и числовые данные.
Если вы обнаружите, что какие-либо проблемы, например, числовое значение относится к категориальным категориям, вы можете использовать as.factor () / наоборот as.numeric () в соответствующем поле и преобразовать его в множитель и ввести эти новые данные в алгоритм.
Рассчитайте лямбду, чтобы можно было вводить данные как входные данные во время кластеризации.
мы даже можем получить WSS (в пределах суммы квадратов), график (коленчатый график), чтобы найти оптимальное количество кластеров.
Надеюсь, что этот ответ поможет вам получить более значимые результаты.
источник
Многие из вышеупомянутых указали, что k-средства могут быть реализованы на переменных, которые являются категориальными и непрерывными, что является неправильным, и результаты должны быть взяты с щепоткой соли.
Как упомянуто выше @Tim выше, не имеет смысла вычислять евклидово расстояние между точками, которые не имеют ни масштаба, ни порядка. Когда вы кодируете однозначные переменные сразу, вы генерируете разреженную матрицу из 0 и 1. Поскольку диапазон значений фиксирован и находится в диапазоне от 0 до 1, их необходимо нормализовать так же, как и для непрерывных переменных. Z-шкалы используются для определения расстояния между точками. Что до сих пор не совсем верно. Я объясню это на примере. Поскольку категории являются взаимоисключающими, расстояние между двумя точками по отношению к категориальным переменным принимает одно из двух значений: высокое или низкое, т. Е. Либо две точки принадлежат к одной и той же категории, либо нет. Из-за этих экстремальных ценностей, алгоритм заканчивает тем, что придавал больший вес непрерывным переменным, влияющим на формирование кластера. Это можно проверить, просто проверив, какие переменные влияют, и вы будете удивлены, увидев, что большинство из них будут категориальными переменными. (Способы поиска наиболее влиятельных переменных [1])
Пример: рассмотрим категориальную переменную страну. Теперь, когда мы знаем, что расстояние (различие) между наблюдениями из разных стран одинаково (если не считать других сходств, таких как соседние страны или страны одного континента). Но в противоположность этому, если вы вычисляете расстояния между наблюдениями после нормализации одного горячо закодированного значения, они будут несовместимы (хотя разница незначительна) наряду с тем, что они принимают высокие или низкие значения.
В конечном счете, лучший вариант для Python - это k-прототипы, которые могут обрабатывать как категориальные, так и непрерывные переменные.
[1]: Поиск наиболее влиятельных переменных в формировании кластера: https://stackoverflow.com/a/53081779/8224401
источник
Модели смесей могут использоваться для кластеризации набора данных, состоящего из непрерывных и категориальных переменных.
Вы можете использовать пакет R VarSelLCM (доступен на CRAN), который моделирует в каждом кластере непрерывные переменные по гауссовским распределениям и порядковые / двоичные переменные. Позаботьтесь о том, чтобы хранить ваши данные в data.frame, где непрерывные переменные являются «числовыми», а категориальные переменные являются «факторами».
Учебное пособие доступно по адресу: http://varsellcm.r-forge.r-project.org/
Кроме того, недостающие значения могут управляться имеющейся моделью.
источник
Я столкнулся с той же самой проблемой и попытался обдумать ее (не зная, что существуют k-прототипы), богатая литература, с которой я столкнулся, возникла из идеи вообще не измерять переменные с одинаковой метрикой расстояния. Кроме того, могут существовать различные источники информации, которые могут подразумевать различные структуры или «представления» данных. Это естественная проблема, когда вы сталкиваетесь с социальными отношениями, такими как на твиттере / веб-сайтах и т. Д.
Одним из возможных решений является рассмотрение каждого подмножества переменных (то есть числовых и категориальных) отдельно. Легко понять, что делает мера расстояния в числовом масштабе. Сами по себе категориальные данные можно также легко понять: рассмотрите возможность наличия бинарных векторов наблюдений: таблица сопряженности 0/1 между двумя векторами наблюдений содержит много информации о схожести между этими двумя наблюдениями. Существует обширная литература по различным индивидуальным мерам подобия двоичных векторов - большинство из которых начинается с таблицы сопряженности.
Учитывая обе матрицы расстояния / сходства, которые описывают одни и те же наблюдения, можно извлечь график для каждого из них (Multi-View-Graph-Clustering) или выделить один граф с несколькими ребрами - каждый узел (наблюдение) с таким количеством ребер, чтобы другой узел, так как существуют информационные матрицы (Multi-Edge-Clustering). Каждому ребру присваивается вес соответствующей меры схожести / расстояния. Начните здесь: Github список алгоритмов кластеризации графов и их статьи, Поскольку для одного наблюдения доступно несколько наборов информации, они должны быть переплетены с использованием, например, потомков спектрального анализа или факторизации связанной матрицы. Спектральный анализ является методом по умолчанию для нахождения сильно связанных или сильно взвешенных частей отдельных графиков. Имея спектральное встраивание переплетенных данных, любой алгоритм кластеризации на числовых данных может легко работать. Литературное значение по умолчанию - kmeans для простоты, но гораздо более продвинутое, а не ограничивающие алгоритмы, которые могут использоваться взаимозаменяемо в этом контексте.
Мне понравилась красота и универсальность этого подхода, так как он легко расширяется на несколько информационных наборов, а не просто на dtypes, и способствует его уважению к конкретной «мере» в каждом подмножестве данных. Это не освобождает вас от тонкой настройки модели с различными метриками расстояния и сходства или масштабирования ваших переменных (я обнаружил, что масштабирую числовые переменные до масштабных в контексте моего анализа)
С точки зрения масштабируемости учитывать, что в основном есть две проблемы:
Веселитесь с этим!
источник
Возможно, вы захотите взглянуть на автоматическое проектирование объектов: http://www.orges-leka.de/automatic_feature_engineering.html . Метод основан на Bourgain Embedding и может использоваться для получения числовых признаков из смешанных категориальных и числовых фреймов данных или для любого набора данных, который поддерживает расстояния между двумя точками данных. Преобразовав данные только в числовые функции, можно сразу использовать кластеризацию K-средних
источник