K-Means clustering para dados numéricos e categóricos mistos


133

Meu conjunto de dados contém vários atributos numéricos e um categórico.

Dizer, NumericAttr1, NumericAttr2, ..., NumericAttrN, CategoricalAttr,

onde CategoricalAttrleva um dos três valores possíveis: CategoricalAttrValue1, CategoricalAttrValue2ou CategoricalAttrValue3.

Estou usando a implementação padrão do algoritmo de agrupamento k-means para o Octave https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/ . Funciona apenas com dados numéricos.

Então, minha pergunta: é correto dividir o atributo categórico CategoricalAttrem três variáveis ​​numéricas (binárias), como IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3?


7
Sim, o uso da codificação 1-de-n também é válido.
Sean Owen

1
Talvez essa abordagem seja útil: zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/…

Você tem alguma idéia sobre a mistura de cluster 'TIME SERIES' de dados categóricos e numéricos?
Leila Yousefi

Respostas:


122

O algoritmo k-means padrão não é diretamente aplicável aos dados categóricos, por vários motivos. O espaço de amostra para dados categóricos é discreto e não tem uma origem natural. Uma função de distância euclidiana em tal espaço não é realmente significativa. Como alguém disse: "O fato de uma cobra não possuir rodas nem pernas nos permite dizer nada sobre o valor relativo das rodas e pernas". ( daqui )

Há uma variação dos meios k conhecidos como modos k, introduzidos neste artigo por Zhexue Huang, que é adequado para dados categóricos. Observe que as soluções obtidas são sensíveis às condições iniciais, conforme discutido aqui (PDF), por exemplo.

O artigo de Huang (link acima) também possui uma seção sobre "protótipos-k", que se aplica a dados com uma mistura de recursos categóricos e numéricos. Ele usa uma medida de distância que combina a distância de Hamming para recursos categóricos e a distância euclidiana para recursos numéricos.

Uma pesquisa no Google por "combinação de dados categóricos por meio de k" mostra alguns artigos mais recentes sobre vários algoritmos para agrupamentos semelhantes a meios com k com uma mistura de dados categóricos e numéricos. (Ainda não os li, não posso comentar seus méritos.)


Na verdade, o que você sugere (converter atributos categóricos em valores binários e, em seguida, executar k-means como se fossem valores numéricos) é outra abordagem já tentada anteriormente (anteriores aos modos k). (Ver Ralambondrainy, H. 1995. Uma versão conceitual do algoritmo k-means. Pattern Recognition Letters, 16: 1147-1157.) Mas acredito que a abordagem dos modos k é preferida pelas razões indicadas acima.


10
Se você dimensionar seus recursos numéricos para o mesmo intervalo que os recursos categóricos binários, a similaridade do cosseno tende a produzir resultados muito semelhantes à abordagem de Hamming acima. Não tenho uma maneira robusta de validar que isso funcione em todos os casos; portanto, quando misturo dados cat e num, sempre verifico o agrupamento em uma amostra com o método simples de cosseno que mencionei e a mistura mais complicada com Hamming. Se a diferença for insignificante, prefiro o método mais simples.
Cwharland

1
Parece uma abordagem sensata, @cwharland. Em considerações adicionais, também observo que uma das vantagens que Huang oferece para a abordagem dos modos-k em relação à Ralambondrainy - que você não precisa introduzir um recurso separado para cada valor de sua variável categórica - realmente não importa no O caso do OP em que ele possui apenas uma única variável categórica com três valores. Melhor ir com a abordagem mais simples que funciona.
Tim Goodman

3
Boa resposta. Potencialmente útil: implementei os modos-k e os protótipos-k de Huang (e algumas variações) no Python: github.com/nicodv/kmodes
Def_Os

2
Não recomendo converter atributos categóricos em valores numéricos. Imagine que você tem dois nomes de cidades: NY e LA. Se você aplicar o número 3 de NY e o número 8 de LA, a distância é 5, mas esse 5 não tem nada a ver com a diferença entre NY e LA.
Adesivas

@adesantos Sim, é um problema representar várias categorias com um único recurso numérico e usar uma distância euclidiana. Usar a distância de Hamming é uma abordagem; nesse caso, a distância é 1 para cada recurso diferente (em vez da diferença entre os valores numéricos atribuídos às categorias). Tornar cada categoria sua própria característica é outra abordagem (por exemplo, 0 ou 1 para "é NY" e 0 ou 1 para "é LA").
Tim Goodman

24

Na minha opinião, existem soluções para lidar com dados categóricos em cluster. R vem com uma distância específica para dados categóricos. Essa distância é chamada Gower ( http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist ) e funciona muito bem.


2
Esta é a abordagem que estou usando para um conjunto de dados misto - particionando em torno de medoids aplicados à matriz de distância de Gower (consulte r-bloggers.com/clustering-mixed-data-types-in-r ). O problema é que o cálculo da matriz de distância requer muita memória, proporcional a O (n ^ 2), portanto, para conjuntos de dados maiores que 10 ou 20.000 registros, estou procurando variantes no cluster k-means que exigem menos memória e podem lidar com dados mistos.
precisa saber é o seguinte

@RobertF mesmo aqui. Infelizmente, o tamanho dos dados viáveis ​​é muito baixo para a maioria dos problemas.
piggybox

20

(Além da excelente resposta de Tim Goodman)

A escolha dos modos k é definitivamente o caminho a seguir para a estabilidade do algoritmo de agrupamento usado.

  1. O algoritmo de agrupamento é livre para escolher qualquer pontuação de métrica / similaridade à distância. Euclidiano é o mais popular. Mas qualquer outra métrica pode ser usada de acordo com a distribuição de dados em cada dimensão / atributo, por exemplo, a métrica de Mahalanobis. Ilustrando a distância dos pontos de dados do centro com base na métrica da distância usada.

  2. Com relação ao agrupamento misto (numérico e categórico), um bom artigo que pode ajudar é: INCONCO: agrupamento interpretável de objetos numéricos e categóricos

  3. Além do k-means: como o k-means simples da baunilha já foi descartado como uma abordagem apropriada para esse problema, vou me aventurar além da idéia de pensar em agrupar como um problema de ajuste de modelo. Medidas diferentes, como a métrica teórica da informação: a divergência Kullback-Liebler funciona bem ao tentar convergir um modelo paramétrico para a distribuição de dados. (É claro que técnicas paramétricas de agrupamento como o GMM são mais lentas que o Kmeans, portanto, há desvantagens a serem consideradas)

  4. O agrupamento de modos k difusos também parece atraente, pois foram desenvolvidas técnicas de lógica difusa para lidar com algo como dados categóricos. Consulte Cluster difuso de dados categóricos usando centróides difusos para obter mais informações.

Confira também: ROCK: Um algoritmo de cluster robusto para atributos categóricos


17

Essa pergunta parece realmente sobre representação, e não tanto sobre agrupamento.

Os dados categóricos são um problema para a maioria dos algoritmos no aprendizado de máquina. Suponha, por exemplo, que você tenha alguma variável categórica chamada "cor" que possa assumir os valores vermelho, azul ou amarelo. Se simplesmente os codificarmos numericamente como 1,2 e 3, respectivamente, nosso algoritmo pensará que vermelho (1) está mais próximo do azul (2) do que amarelo (3). Precisamos usar uma representação que permita ao computador entender que essas coisas são todas igualmente diferentes.

Uma maneira simples é usar o que é chamado de representação quente , e é exatamente o que você pensou que deveria fazer. Em vez de ter uma variável como "cor" que pode assumir três valores, separamos-a em três variáveis. Eles seriam "cor vermelha", "cor azul" e "cor amarela", que só podem assumir o valor 1 ou 0.

Isso aumenta a dimensionalidade do espaço, mas agora você pode usar qualquer algoritmo de cluster que desejar. Às vezes, faz sentido zscore ou embranquecer os dados depois de executar esse processo, mas a sua ideia é definitivamente razoável.


Eu concordo com a sua resposta. HotEncoding é muito útil.
Pramit 20/09

4

Você também pode experimentar o algoritmo de cluster de Expectation Maximization. Ele pode trabalhar com dados categóricos e fornecerá uma probabilidade estatística de qual valor categórico (ou valores) um cluster tem maior probabilidade de assumir.


2
Você pode ser mais específico? EM refere-se a um algoritmo de otimização que pode ser usado para cluster. Há muitas maneiras de fazer isso e não é óbvio o que você quer dizer.
Bayer

@bayer, acho que o agrupamento mencionado aqui é um modelo de mistura gaussiana. O GMM geralmente usa EM.
goh 29/10

1
Eu não acho que é isso que ele quer dizer, porque o GMM não assume variáveis ​​categóricas.
Bayer

3

Depende da sua variável categórica sendo usada. Para variáveis ​​ordinais, como ruim, média e boa, faz sentido usar apenas uma variável e ter valores 0,1,2 e as distâncias fazem sentido aqui (o Avarage está mais próximo do ruim e do bom). No entanto, se não houver ordem, use idealmente uma codificação quente, conforme mencionado acima.


3

Você não deve usar o cluster de k-means em um conjunto de dados contendo tipos de dados mistos. Em vez disso, existem vários algoritmos de cluster que podem lidar adequadamente com tipos de dados mistos. Algumas possibilidades incluem o seguinte:

1) Algoritmos baseados em particionamento: protótipos k, Squeezer
2) Algoritmos hierárquicos: ROCK, ligação única, média e completa aglomerativa
3) Algoritmos baseados em densidade: HIERDENC, MULIC, CLIQUE
4) Algoritmos baseados em modelo: SVM clustering, Self mapas de organização

Se você quiser saber mais sobre esses algoritmos, o manuscrito 'Survey of Clustering Algorithms', escrito por Rui Xu, oferece uma introdução abrangente à análise de cluster.


2

O objetivo da K-Means é reduzir a variação dentro do cluster e, como calcula os centróides como o ponto médio de um cluster, é necessário usar a distância euclidiana para convergir adequadamente. Portanto, se você quiser usar absolutamente o K-Means, precisará garantir que seus dados funcionem bem com eles.

Representação

O K-Means e o clustering em geral tentam particionar os dados em grupos significativos, garantindo que as instâncias nos mesmos clusters sejam semelhantes entre si. Portanto, você precisa de uma boa maneira de representar seus dados para poder calcular facilmente uma medida de similaridade significativa.

Usar a codificação one-hot em variáveis ​​categóricas é uma boa idéia quando as categorias são equidistantes uma da outra. Por exemplo, se você tiver a cor azul claro, azul escuro e amarelo, o uso da codificação de um ponto quente poderá não fornecer os melhores resultados, pois o azul escuro e o azul claro provavelmente estarão "mais próximos" do que o amarelo.

Caso o valor categórico não seja "equidistante" e possa ser ordenado, você também poderá atribuir às categorias um valor numérico. Por exemplo, criança, adolescente, adulto, poderia ser representada como 0, 1 e 2. Isso faria sentido porque um adolescente está "mais próximo" de ser criança do que um adulto.

K-Medoids

Uma abordagem mais genérica para o K-Means é o K-Medoids. O K-Medoids funciona da mesma forma que o K-Means, mas a principal diferença é que o centróide de cada cluster é definido como o ponto que reduz a soma das distâncias dentro do cluster. A imposição disso permite que você use qualquer medida de distância desejada e, portanto, você pode criar sua própria medida personalizada que levará em conta quais categorias devem ser próximas ou não.


1

Se considerarmos um cenário em que a variável categórica não pode ser codificada a quente, a variável categórica tem mais de 200 categorias.

Nesses casos, você pode usar um pacote clustMixType

Ele pode manipular dados mistos (numéricos e categóricos), basta alimentar os dados, segregar automaticamente dados categóricos e numéricos.

Se você encontrar algum problema, como um número numérico, está em categórico, pode-se como.factor () / vice-versa como.numeric (), nesse campo respectivo, convertê-lo em um fator e alimentar esses novos dados no algoritmo.

Calcule lambda, para que você possa alimentar como entrada no momento do armazenamento em cluster.

podemos até obter um WSS (dentro da soma dos quadrados), plotagem (gráfico de cotovelo) para encontrar o número ideal de Clusters.

Espero que esta resposta ajude você a obter resultados mais significativos.


1

Muitos dos itens acima apontaram que os meios k podem ser implementados em variáveis ​​que são categóricas e contínuas, o que está errado e os resultados precisam ser tomados com uma pitada de sal.

Como mencionado acima por @Tim acima, não faz sentido calcular a distância euclidiana entre os pontos que não têm escala nem ordem. Quando você codifica as variáveis ​​categóricas diretamente, você gera uma matriz esparsa de 0 e 1. Como o intervalo dos valores é fixo e entre 0 e 1, eles precisam ser normalizados da mesma maneira que as variáveis ​​contínuas. Os escores Z são usados ​​para encontrar a distância entre os pontos. O que ainda não está perfeitamente certo. Vou explicar isso com um exemplo. Como as categorias são mutuamente exclusivas, a distância entre dois pontos em relação às variáveis ​​categóricas assume um dos dois valores, alto ou baixo, ou seja, os dois pontos pertencem à mesma categoria ou não. Devido a esses valores extremos, o algoritmo acaba dando mais peso às variáveis ​​contínuas, influenciando a formação do cluster. Isso pode ser verificado por uma verificação simples, ver quais variáveis ​​estão influenciando e você ficará surpreso ao ver que a maioria delas será variável categórica. (Maneiras de encontrar as variáveis ​​mais influentes [1])

Um exemplo: considere um país variável categórico. Agora, como sabemos, a distância (dissimilaridade) entre observações de diferentes países é igual (assumindo que não há outras semelhanças como países vizinhos ou países do mesmo continente). Mas, ao contrário disso, se você calcular as distâncias entre as observações após normalizar os valores codificados a quente, elas serão inconsistentes (embora a diferença seja menor), juntamente com o fato de que elas assumem valores altos ou baixos.

Por fim, a melhor opção disponível para python são os protótipos-k que podem lidar com variáveis ​​categóricas e contínuas.

[1]: Encontrando variáveis ​​mais influentes na formação de cluster: https://stackoverflow.com/a/53081779/8224401


0

Modelos de mistura podem ser usados ​​para agrupar um conjunto de dados composto por variáveis ​​contínuas e categóricas.

Você pode usar o pacote R VarSelLCM (disponível no CRAN) que modela, dentro de cada cluster, as variáveis ​​contínuas pelas distribuições gaussianas e as variáveis ​​ordinais / binárias. Tome cuidado para armazenar seus dados em um data.frame em que variáveis ​​contínuas são "numéricas" e variáveis ​​categóricas são "fator".

Um tutorial está disponível em: http://varsellcm.r-forge.r-project.org/

Além disso, os valores ausentes podem ser gerenciados pelo modelo em questão.


0

Me deparei com o mesmo problema e tentei trabalhar com ele (sem saber que existiam protótipos-k) a rica literatura com a qual me encontrei se originou da ideia de não medir as variáveis ​​com a mesma métrica de distância. Além disso, podem existir várias fontes de informação, que podem implicar estruturas diferentes ou "visualizações" dos dados. Esse é um problema natural, sempre que você se deparar com relações sociais como as do twitter / sites etc.

Uma das soluções possíveis é abordar cada subconjunto de variáveis ​​(ou seja, numérico e categórico) separadamente. É facilmente compreensível o que uma medida de distância faz em uma escala numérica. Os dados categóricos por si só podem ser facilmente compreendidos: considere ter vetores de observação binários: A tabela de contingência em 0/1 entre dois vetores de observação contém muitas informações sobre a semelhança entre essas duas observações. Existe uma rica literatura sobre as várias medidas personalizadas de similaridade em vetores binários - a maioria começando na tabela de contingência.

Dadas as matrizes de distância / semelhança, ambas descrevendo as mesmas observações, é possível extrair um gráfico em cada uma delas (Multi-View-Graph-Clustering) ou extrair um único gráfico com várias arestas - cada nó (observação) com tantas arestas para outro nó, pois existem matrizes de informações (clustering multi-borda). Cada aresta recebe o peso da medida de semelhança / distância correspondente. Começa aqui: Listagem de algoritmos de agrupamento de grafos no Github e seus papéis. Como existem vários conjuntos de informações disponíveis em uma única observação, eles devem ser entrelaçados usando, por exemplo, descendentes de análises espectrais ou fatoração matricial ligada. A análise espectral é o método padrão para encontrar partes altamente conectadas ou fortemente ponderadas de gráficos únicos. Tendo uma incorporação espectral dos dados entrelaçados, qualquer algoritmo de agrupamento em dados numéricos pode funcionar facilmente. O padrão da literatura é kmeans por questão de simplicidade, mas muito mais avançado - e não como algoritmos restritivos, que podem ser usados ​​de forma intercambiável nesse contexto.

Gostei da beleza e da generalidade dessa abordagem, pois ela é facilmente extensível a vários conjuntos de informações em vez de meros tipos e aumenta ainda mais o respeito pela "medida" específica em cada subconjunto de dados. Isso não o isenta de ajustar o modelo com várias métricas de distância e semelhança ou de dimensionar suas variáveis ​​(eu me encontrei dimensionando as variáveis ​​numéricas para dimensionar as proporções no contexto da minha análise)

De uma perspectiva de escalabilidade, há principalmente dois problemas:

  1. Aproximação do problema de Eigen (onde também existe uma rica literatura de algoritmos)
  2. Estimativa da matriz de distâncias (um problema puramente combinatório, que cresce muito rapidamente - ainda não encontrei uma maneira eficiente de contornar isso)

Divirta-se com isso!


0

Você pode querer consultar a engenharia automática de recursos: http://www.orges-leka.de/automatic_feature_engineering.html . O método é baseado na incorporação da Bourgain e pode ser usado para derivar recursos numéricos de quadros de dados categóricos e numéricos mistos ou para qualquer conjunto de dados que suporte distâncias entre dois pontos de dados. Depois de transformar os dados em apenas recursos numéricos, é possível usar o cluster K-means diretamente

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.