K-Clustering per dati numerici e categorici misti


133

Il mio set di dati contiene un numero di attributi numerici e uno categoriale.

Di ' NumericAttr1, NumericAttr2, ..., NumericAttrN, CategoricalAttr,

dove CategoricalAttrassume uno dei tre valori possibili: CategoricalAttrValue1, CategoricalAttrValue2o CategoricalAttrValue3.

Sto usando l'implementazione predefinita dell'algoritmo di clustering k-means per Octave https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/ . Funziona solo con dati numerici.

Quindi la mia domanda: è corretto dividere l'attributo categoriale CategoricalAttrin tre variabili numeriche (binarie), come IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3?


7
Sì, anche l'uso della codifica 1-of-n è valido.
Sean Owen,

1
Forse questo approccio sarebbe utile: zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/…

Hai qualche idea sul mix di clustering "TIME SERIES" di dati categorici e numerici?
Leila Yousefi,

Risposte:


122

L'algoritmo k-mean standard non è direttamente applicabile ai dati categorici, per vari motivi. Lo spazio di esempio per i dati categorici è discreto e non ha un'origine naturale. Una funzione di distanza euclidea su tale spazio non è davvero significativa. Come qualcuno ha affermato: "Il fatto che un serpente non possieda né ruote né gambe non ci consente di dire nulla sul valore relativo di ruote e gambe". (da qui )

Esiste una variazione di k- media nota come k-mode, introdotta in questo articolo da Zhexue Huang, che è adatta per dati categorici. Si noti che le soluzioni ottenute sono sensibili alle condizioni iniziali, come discusso qui (PDF), ad esempio.

Il documento di Huang (linkato sopra) ha anche una sezione sui "prototipi k" che si applica ai dati con un mix di caratteristiche categoriche e numeriche. Usa una misura della distanza che mescola la distanza di Hamming per caratteristiche categoriche e la distanza euclidea per caratteristiche numeriche.

Una ricerca di Google per "mix k di mezzi categorici" presenta alcuni articoli più recenti su vari algoritmi per il clustering simile a k-mean con un mix di dati categorici e numerici. (Non li ho ancora letti, quindi non posso commentare i loro meriti.)


In realtà, ciò che suggerisci (convertire gli attributi categorici in valori binari e quindi fare k-significa come se si trattasse di valori numerici) è un altro approccio che è stato provato prima (che precede le k-mode). (Vedi Ralambondrainy, H. 1995. Una versione concettuale dell'algoritmo k-mean. Pattern Recognition Letters, 16: 1147-1157). Ma credo che l'approccio k-mode sia preferito per le ragioni che ho indicato sopra.


10
Se ridimensionate le vostre caratteristiche numeriche allo stesso intervallo delle caratteristiche categoriali binarizzate, la somiglianza del coseno tende a produrre risultati molto simili all'approccio di Hamming sopra. Non ho un modo affidabile per validare che funzioni in tutti i casi, quindi quando ho dati misti cat e num controllo sempre il clustering su un campione con il semplice metodo del coseno che ho citato e il mix più complicato con Hamming. Se la differenza è insignificante, preferisco il metodo più semplice.
cwharland,

1
Sembra un approccio sensato, @cwharland. A ulteriore considerazione, noto anche che uno dei vantaggi offerti da Huang per l'approccio k-mode rispetto a quello di Ralambondrainy - che non è necessario introdurre una funzione separata per ogni valore della variabile categoriale - in realtà non ha importanza nel Il caso di OP in cui ha una sola variabile categoriale con tre valori. Meglio andare con l'approccio più semplice che funziona.
Tim Goodman,

3
Buona risposta. Potenzialmente utile: ho implementato le modalità k e i prototipi k di Huang (e alcune varianti) in Python: github.com/nicodv/kmodes
Def_Os,

2
Non consiglio di convertire gli attributi categorici in valori numerici. Immagina di avere due nomi di città: NY e LA. Se si applica NY numero 3 e LA numero 8, la distanza è 5, ma quel 5 non ha nulla a che vedere con la differenza tra NY e LA.
adesantos,

@adesantos Sì, questo è un problema con la rappresentazione di più categorie con un'unica funzione numerica e l'utilizzo di una distanza euclidea. L'uso della distanza di Hamming è un approccio; in tal caso la distanza è 1 per ogni caratteristica che differisce (piuttosto che la differenza tra i valori numerici assegnati alle categorie). Rendere ciascuna categoria la propria caratteristica è un altro approccio (ad esempio, 0 o 1 per "is it NY" e 0 o 1 per "is it LA").
Tim Goodman,

24

A mio avviso, esistono soluzioni per gestire i dati categorici nel clustering. R viene fornito con una distanza specifica per i dati categorici. Questa distanza si chiama Gower ( http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist ) e funziona abbastanza bene.


2
Questo è l'approccio che sto usando per un set di dati misto: il partizionamento attorno ai medoidi applicati alla matrice della distanza di Gower (vedi r-bloggers.com/clustering-mixed-data-types-in-r ). Il problema è che il calcolo della matrice di distanza richiede molta memoria, proporzionale a O (n ^ 2), quindi per set di dati di dimensioni superiori a 10 o 20.000 record sto esaminando le varianti del clustering di k-media che richiedono meno memoria e sono in grado di gestire dati misti.
RobertF

@RobertF stesso qui. Le dimensioni dei dati possibili sono troppo basse per la maggior parte dei problemi, sfortunatamente.
salvadanaio

20

(Oltre all'ottima risposta di Tim Goodman)

La scelta delle k-mode è sicuramente la strada da percorrere per la stabilità dell'algoritmo di clustering utilizzato.

  1. L'algoritmo di clustering è libero di scegliere qualsiasi metrica di distanza / punteggio di somiglianza. Euclideo è il più popolare. Tuttavia, è possibile utilizzare qualsiasi altra metrica che si ridimensiona in base alla distribuzione dei dati in ciascuna dimensione / attributo, ad esempio la metrica Mahalanobis. Illustra la distanza dei punti dati dal centro in base alla metrica della distanza utilizzata.

  2. Per quanto riguarda il raggruppamento misto (numerico e categorico), un buon documento che potrebbe aiutare è: INCONCO: cluster interpretabile di oggetti numerici e categorici

  3. Al di là di k-mean: poiché il semplice k-mean alla vaniglia è già stato escluso come approccio appropriato a questo problema, mi avventurerò oltre l'idea di pensare al clustering come un problema di adattamento del modello. Misure diverse, come la metrica teorica dell'informazione: la divergenza di Kullback-Liebler funziona bene quando si tenta di convertire un modello parametrico verso la distribuzione dei dati. (Naturalmente le tecniche di clustering parametrico come GMM sono più lente di Kmeans, quindi ci sono degli svantaggi da considerare)

  4. Anche il clustering fuzzy-k suona suona attraente poiché sono state sviluppate tecniche di logica fuzzy per gestire qualcosa come i dati categorici. Vedere Raggruppamento fuzzy di dati categorici usando i centroidi fuzzy per ulteriori informazioni.

Dai un'occhiata anche a: ROCK: un algoritmo di clustering robusto per attributi categorici


17

Questa domanda sembra davvero sulla rappresentazione, e non tanto sul clustering.

I dati categorici sono un problema per la maggior parte degli algoritmi nell'apprendimento automatico. Supponiamo, ad esempio, di avere una variabile categorica chiamata "color" che potrebbe assumere i valori rosso, blu o giallo. Se li codifichiamo semplicemente numericamente rispettivamente come 1,2 e 3, il nostro algoritmo penserà che il rosso (1) sia effettivamente più vicino al blu (2) che al giallo (3). Dobbiamo usare una rappresentazione che permetta al computer di capire che queste cose sono effettivamente ugualmente diverse.

Un modo semplice è quello di usare quella che viene chiamata una rappresentazione one-hot ed è esattamente quello che pensavi di dover fare. Invece di avere una variabile come "color" che può assumere tre valori, la separiamo in tre variabili. Questi sarebbero "colore rosso", "colore blu" e "colore giallo", che tutti possono assumere solo sul valore 1 o 0.

Ciò aumenta la dimensionalità dello spazio, ma ora è possibile utilizzare qualsiasi algoritmo di clustering che ti piace. A volte ha senso zscore o sbiancare i dati dopo aver eseguito questo processo, ma la tua idea è decisamente ragionevole.


Sono d'accordo con la tua risposta. HotEncoding è molto utile.
Pramit,

4

Puoi anche provare l'algoritmo di clustering di ottimizzazione delle aspettative. Può funzionare su dati categorici e ti darà una probabilità statistica di quale valore (o valori) categorico è più probabile che un cluster assuma.


2
Può essere più preciso? EM si riferisce a un algoritmo di ottimizzazione che può essere utilizzato per il clustering. Ci sono molti modi per farlo e non è ovvio cosa intendi.
Bayer,

@bayer, penso che il clustering menzionato qui sia un modello di miscela gaussiana. GMM di solito usa EM.
Goh,

1
Non penso che sia ciò che intende, perché GMM non assume variabili categoriche.
Bayer,

3

Dipende dalla variabile categoriale utilizzata. Per le variabili ordinali, diciamo come cattivo, medio e buono, ha senso usare solo una variabile e avere valori 0,1,2 e le distanze hanno un senso qui (Avarage è più vicino a cattivo e buono). Tuttavia, se non vi è alcun ordine, è consigliabile utilizzare idealmente una codifica a caldo come indicato sopra.


3

Non si dovrebbe usare il clustering k-means su un set di dati contenente tipi di dati misti. Piuttosto, ci sono una serie di algoritmi di clustering in grado di gestire in modo appropriato tipi di dati misti. Alcune possibilità includono:

1) Algoritmi basati sul partizionamento: k-Prototypes, Squeezer
2) Algoritmi gerarchici: ROCK, Agglomerativo singolo, medio e collegamento completo
3) Algoritmi basati sulla densità: HIERDENC, MULIC, CLIQUE
4) Algoritmi basati su modello: SVM clustering, Self -organizzare mappe

Se desideri saperne di più su questi algoritmi, il manoscritto "Survey of Clustering Algorithms" scritto da Rui Xu offre un'introduzione completa all'analisi dei cluster.


2

L'obiettivo di K-Means è quello di ridurre la varianza all'interno del cluster e poiché calcola i centroidi come il punto medio di un cluster, è necessario utilizzare la distanza euclidea per convergere correttamente. Pertanto, se si desidera utilizzare assolutamente K-Means, è necessario assicurarsi che i dati funzionino bene con esso.

Rappresentazione

K-Means, e il clustering in generale, tenta di partizionare i dati in gruppi significativi assicurandosi che le istanze negli stessi cluster siano simili tra loro. Pertanto, è necessario un buon modo per rappresentare i dati in modo da poter calcolare facilmente una misura di somiglianza significativa.

L'uso della codifica one-hot su variabili categoriali è una buona idea quando le categorie sono equidistanti l'una dall'altra. Ad esempio, se hai il colore blu chiaro, blu scuro e giallo, l'uso della codifica a caldo potrebbe non darti i migliori risultati, dal momento che il blu scuro e il blu chiaro sono probabilmente "più vicini" di quanto non siano al giallo.

Nel caso in cui il valore categoriale non sia "equidistante" e possa essere ordinato, è possibile assegnare un valore numerico alle categorie. Ad esempio, un bambino, un adolescente o un adulto potrebbero potenzialmente essere rappresentati come 0, 1 e 2. Ciò avrebbe senso perché un adolescente è "più vicino" all'essere un bambino di quanto non lo sia un adulto.

K-medoids

Un approccio più generico a K-Means è K-Medoids. K-Medoids funziona in modo simile a K-Means, ma la differenza principale è che il centroide per ciascun cluster è definito come il punto che riduce la somma delle distanze all'interno del cluster. Applicare ciò consente di utilizzare qualsiasi misura di distanza desiderata e, pertanto, è possibile creare la propria misura personalizzata che terrà conto delle categorie da chiudere o meno.


1

Se consideriamo uno scenario in cui la variabile categoriale non può essere codificata a caldo poiché la variabile categoriale ha più di 200 categorie.

In tali casi è possibile utilizzare un pacchetto clustMixType

Può gestire dati misti (numerici e categorici), devi solo inserire i dati, separa automaticamente i dati categorici e numerici.

Se riscontri problemi come alcuni valori numerici in categorie, puoi as.factor () / vice-versa as.numeric (), su quel rispettivo campo e convertirlo in un fattore e inserire i nuovi dati nell'algoritmo.

Calcola lambda, in modo da poter inserire come input al momento del clustering.

possiamo anche ottenere un WSS (all'interno della somma dei quadrati), trama (diagramma a gomito) per trovare il numero ottimale di Cluster.

Spero che questa risposta ti aiuti a ottenere risultati più significativi.


1

Molti di questi hanno indicato che i k-media possono essere implementati su variabili categoriche e continue, il che è sbagliato e i risultati devono essere presi con un pizzico di sale.

Come accennato in precedenza da @Tim sopra, non ha senso calcolare la distanza euclidea tra i punti che non hanno né una scala né un ordine. Quando si esegue la codifica one-hot delle variabili categoriali, si genera una matrice sparsa di 0 e 1. Poiché l'intervallo di valori è fisso e tra 0 e 1, devono essere normalizzati allo stesso modo delle variabili continue. I punteggi Z sono usati per trovare la distanza tra i punti. Che è ancora, non perfettamente giusto. Spiegherò questo con un esempio. Poiché le categorie si escludono a vicenda, la distanza tra due punti rispetto alle variabili categoriali, assume uno dei due valori, alto o basso, ovvero i due punti appartengono alla stessa categoria oppure non lo sono. A causa di questi valori estremi, l'algoritmo finisce per dare più peso alle variabili continue nell'influenzare la formazione del cluster. Questo può essere verificato da un semplice controllo vedendo quali variabili stanno influenzando e rimarrai sorpreso nel vedere che la maggior parte di essi saranno variabili categoriali. (Modi per trovare le variabili più influenti [1])

Un esempio: considera un Paese variabile categoriale. Ora, come sappiamo, la distanza (dissomiglianza) tra le osservazioni di diversi paesi è uguale (supponendo che non vi siano altre somiglianze come paesi vicini o paesi dello stesso continente). Al contrario, se si calcolano le distanze tra le osservazioni dopo aver normalizzato i valori con una sola codifica a caldo, saranno incoerenti (sebbene la differenza sia minore) insieme al fatto che assumono valori alti o bassi.

In definitiva, la migliore opzione disponibile per Python sono i prototipi di k in grado di gestire variabili sia categoriche che continue.

[1]: ricerca delle variabili più influenti nella formazione dei cluster: https://stackoverflow.com/a/53081779/8224401


0

I modelli di miscele possono essere utilizzati per raggruppare un set di dati composto da variabili continue e categoriali.

È possibile utilizzare il pacchetto R VarSelLCM (disponibile su CRAN) che modella, all'interno di ciascun cluster, le variabili continue mediante distribuzioni gaussiane e le variabili ordinali / binarie. Assicurati di archiviare i tuoi dati in un data.frame in cui le variabili continue sono "numeriche" e le variabili categoriali sono "fattore".

Un tutorial è disponibile su: http://varsellcm.r-forge.r-project.org/

Inoltre, i valori mancanti possono essere gestiti dal modello a portata di mano.


0

Mi sono imbattuto nello stesso problema e ho cercato di aggirare la testa (senza sapere che esistevano i prototipi di k) la ricca letteratura con cui mi sono imbattuto è nata dall'idea di non misurare affatto le variabili con la stessa metrica di distanza. Inoltre possono esistere varie fonti di informazione, che possono implicare strutture o "viste" diverse dei dati. Questo è un problema naturale, ogni volta che si affrontano relazioni sociali come quelle su Twitter / siti Web ecc.

Una delle possibili soluzioni è quella di affrontare separatamente ciascun sottoinsieme di variabili (cioè numeriche e categoriche). È facilmente comprensibile cosa fa una misura di distanza su una scala numerica. I dati categorici da soli possono essere facilmente compresi: considera di avere vettori di osservazione binari: la tabella di contingenza su 0/1 tra due vettori di osservazione contiene molte informazioni sulla similitudine tra queste due osservazioni. Esiste una ricca letteratura sulle varie misure di somiglianza personalizzate su vettori binari, la maggior parte a partire dalla tabella di contingenza.

Date entrambe le matrici di distanza / somiglianza, che descrivono entrambe le stesse osservazioni, è possibile estrarre un grafico su ciascuna di esse (cluster di grafici multi-view) o estrarre un singolo grafico con più spigoli - ogni nodo (osservazione) con altrettanti spigoli da un altro nodo, in quanto vi sono matrici di informazioni (Multi-Edge-Clustering). A ciascun bordo viene assegnato il peso della misura di simmilarità / distanza corrispondente. Inizia qui: Elenco di Github degli algoritmi di clustering dei grafici e dei loro articoli. Poiché su una singola osservazione sono disponibili più insiemi di informazioni, questi devono essere intrecciati usando, ad esempio, i discendenti dell'analisi spettrale o la fattorizzazione a matrice collegata. L'analisi spettrale è il metodo predefinito per trovare parti altamente connesse o fortemente ponderate di singoli grafici. Avendo un incorporamento spettrale dei dati intrecciati, qualsiasi algoritmo di clustering su dati numerici può facilmente funzionare. Il default della letteratura è kmeano per la questione della semplicità, ma molto più avanzato - e non come algoritmi restrittivi ci sono là fuori che possono essere usati in modo intercambiabile in questo contesto.

Mi è piaciuta la bellezza e la generalità in questo approccio, in quanto è facilmente estendibile a più insiemi di informazioni piuttosto che a meri tipi e promuove ulteriormente il rispetto della "misura" specifica su ciascun sottoinsieme di dati. Questo non ti allevia dalla regolazione fine del modello con varie metriche di distanza e somiglianza o dal ridimensionamento delle tue variabili (mi sono trovato a ridimensionare le variabili numeriche a quelle di proporzioni nel contesto della mia analisi)

Dal punto di vista della scalabilità, consideriamo che ci sono principalmente due problemi:

  1. Approssimazione del problema di Eigen (dove esiste anche una ricca letteratura di algoritmi)
  2. Stima della matrice di distanza (un problema puramente combinatorio, che si ingrandisce molto rapidamente - non ho ancora trovato un modo efficace per aggirarlo)

Divertiti con esso!


0

Potresti voler esaminare l'ingegnerizzazione automatica delle caratteristiche: http://www.orges-leka.de/automatic_feature_engineering.html . Il metodo si basa sull'incorporamento di Bourgain e può essere utilizzato per derivare caratteristiche numeriche da frame di dati misti categorici e numerici o per qualsiasi set di dati che supporti le distanze tra due punti di dati. Dopo aver trasformato i dati in solo funzioni numeriche, è possibile utilizzare direttamente il clustering di K-points

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.