K-Means clustering untuk data numerik dan kategorik campuran

133

Kumpulan data saya berisi sejumlah atribut numerik dan satu kategori.

Katakan NumericAttr1, NumericAttr2, ..., NumericAttrN, CategoricalAttr,

di mana CategoricalAttrmengambil salah satu dari tiga kemungkinan nilai: CategoricalAttrValue1, CategoricalAttrValue2atau CategoricalAttrValue3.

Saya menggunakan implementasi default algoritma k-means clustering untuk Octave https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/ . Ini bekerja dengan data numerik saja.

Jadi pertanyaan saya: apakah benar untuk membagi atribut kategorikal CategoricalAttrmenjadi tiga variabel numerik (biner), seperti IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3?

IharS
sumber
7
Ya, menggunakan pengodean 1-of-n juga berlaku.
Sean Owen
1
Mungkin pendekatan ini akan berguna: zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/…
Apakah Anda memiliki gagasan tentang campuran pengelompokan 'TIME SERIES' dari data kategorikal dan numerik?
Leila Yousefi

Jawaban:

122

Algoritma k-means standar tidak langsung berlaku untuk data kategorikal, karena berbagai alasan. Ruang sampel untuk data kategorikal bersifat diskrit, dan tidak memiliki asal yang alami. Fungsi jarak Euclidean pada ruang seperti itu tidak terlalu berarti. Seperti seseorang katakan, "Fakta bahwa seekor ular tidak memiliki roda atau kaki memungkinkan kita untuk tidak mengatakan apa pun tentang nilai relatif roda dan kaki." (dari sini )

Ada variasi k-means yang dikenal sebagai k-mode, diperkenalkan dalam makalah ini oleh Zhexue Huang, yang cocok untuk data kategorikal. Perhatikan bahwa solusi yang Anda dapatkan sensitif terhadap kondisi awal, seperti yang dibahas di sini (PDF), misalnya.

Makalah Huang (ditautkan di atas) juga memiliki bagian tentang "k-prototipe" yang berlaku untuk data dengan campuran fitur kategorikal dan numerik. Ini menggunakan ukuran jarak yang mencampur jarak Hamming untuk fitur kategorikal dan jarak Euclidean untuk fitur numerik.

Pencarian Google untuk "k-means campuran data kategorikal" muncul beberapa makalah baru-baru ini tentang berbagai algoritma untuk pengelompokan seperti k-means dengan campuran data kategorik dan numerik. (Saya belum membacanya, jadi saya tidak bisa mengomentari kelebihan mereka.)


Sebenarnya, apa yang Anda sarankan (mengubah atribut kategorikal ke nilai biner, dan kemudian melakukan k-berarti seolah-olah ini adalah nilai numerik) adalah pendekatan lain yang telah dicoba sebelumnya (predating k-mode). (Lihat Ralambondrainy, H. 1995. Versi konseptual dari algoritma k-means. Pattern Recognition Letters, 16: 1147-1157). Tetapi saya percaya pendekatan k-mode lebih disukai karena alasan yang saya sebutkan di atas.

Tim Goodman
sumber
10
Jika skala Anda fitur numerik Anda ke kisaran yang sama dengan fitur kategorikal biner maka kesamaan cosinus cenderung menghasilkan hasil yang sangat mirip dengan pendekatan Hamming di atas. Saya tidak memiliki cara yang kuat untuk memvalidasi bahwa ini berfungsi dalam semua kasus sehingga ketika saya memiliki data campuran kucing dan angka, saya selalu memeriksa pengelompokan sampel dengan metode kosinus sederhana yang saya sebutkan dan campuran yang lebih rumit dengan Hamming. Jika perbedaannya tidak signifikan saya lebih suka metode yang lebih sederhana.
cwharland
1
Kedengarannya seperti pendekatan yang masuk akal, @cwharland. Pada pertimbangan lebih lanjut saya juga mencatat bahwa salah satu kelebihan yang Huang berikan untuk pendekatan k-mode atas Ralambondrainy - bahwa Anda tidak harus memperkenalkan fitur terpisah untuk setiap nilai variabel kategorikal Anda - benar-benar tidak masalah dalam Kasus OP di mana ia hanya memiliki variabel kategori tunggal dengan tiga nilai. Lebih baik pergi dengan pendekatan paling sederhana yang berhasil.
Tim Goodman
3
Jawaban yang bagus. Berpotensi membantu: Saya telah mengimplementasikan k-mode Huang dan k-prototypes (dan beberapa variasi) dengan Python: github.com/nicodv/kmodes
Def_Os
2
Saya tidak merekomendasikan konversi atribut kategorikal ke nilai numerik. Bayangkan Anda memiliki dua nama kota: NY dan LA. Jika Anda menerapkan NY nomor 3 dan LA nomor 8, jaraknya 5, tetapi 5 itu tidak ada hubungannya dengan perbedaan antara NY dan LA.
adesantos
@adesantos Ya, itu masalah dengan merepresentasikan beberapa kategori dengan fitur numerik tunggal dan menggunakan jarak Euclidean. Menggunakan jarak Hamming adalah satu pendekatan; dalam hal ini jaraknya adalah 1 untuk setiap fitur yang berbeda (bukan perbedaan antara nilai numerik yang ditetapkan untuk kategori). Membuat setiap kategori fitur sendiri adalah pendekatan lain (misalnya, 0 atau 1 untuk "apakah itu NY", dan 0 atau 1 untuk "apakah itu LA").
Tim Goodman
24

Menurut pendapat saya, ada solusi untuk menangani data kategorikal dalam pengelompokan. R hadir dengan jarak tertentu untuk data kategorikal. Jarak ini disebut Gower ( http://www.rdocumentation.org/packages/StatMatch/versions/1.2.0/topics/gower.dist ) dan berfungsi dengan baik.

adesantos
sumber
2
Ini adalah pendekatan yang saya gunakan untuk dataset campuran - partisi sekitar medoids diterapkan pada matriks jarak Gower (lihat r-bloggers.com/clustering-mixed-data-types-in-r ). Masalahnya adalah bahwa menghitung matriks jarak memerlukan banyak memori, sebanding dengan O (n ^ 2), maka untuk kumpulan data yang lebih besar dari 10 atau 20.000 catatan, saya melihat varian pada k-means clustering yang membutuhkan lebih sedikit memori dan dapat menangani data campuran.
RobertF
@ RoberttF sama di sini. Ukuran data yang layak terlalu rendah untuk sebagian besar masalah sayangnya.
piggybox
20

(Selain jawaban yang sangat baik dari Tim Goodman)

Pilihan k-mode jelas merupakan cara terbaik untuk stabilitas algoritma clustering yang digunakan.

  1. Algoritma pengelompokan bebas memilih jarak metrik / skor kesamaan. Euclidean adalah yang paling populer. Tetapi metrik lainnya dapat digunakan yang menskala menurut distribusi data di setiap dimensi / atribut, misalnya metrik Mahalanobis. Menggambarkan jarak titik data dari pusat berdasarkan metrik jarak yang digunakan.

  2. Berkenaan dengan campuran (numerik dan kategorikal) pengelompokan makalah yang baik yang mungkin membantu adalah: INCONCO: Clustering yang Dapat Diinterpretasikan atas Objek Numerik dan Kategorikal

  3. Di luar k-means: Karena vanilla k-means sudah dikesampingkan sebagai pendekatan yang tepat untuk masalah ini, saya akan menjelajah lebih jauh ke gagasan memikirkan pengelompokan sebagai model masalah pas. Ukuran yang berbeda, seperti metrik informasi-teoretik: Kullback-Liebler divergence bekerja dengan baik ketika mencoba menyatukan model parametrik ke arah distribusi data. (Tentu saja teknik pengelompokan parametrik seperti GMM lebih lambat daripada Kmeans, jadi ada beberapa kelemahan yang perlu dipertimbangkan)

  4. Fuzzy k-mode clustering juga terdengar menarik karena teknik logika fuzzy dikembangkan untuk menangani sesuatu seperti data kategorikal. Lihat pengelompokan fuzzy data kategorikal menggunakan fuzzy centroid untuk informasi lebih lanjut.

Lihat juga: ROCK: Algoritma Clustering yang Kuat untuk Atribut Kategorikal

Stardust dinamis
sumber
17

Pertanyaan ini tampaknya benar-benar tentang representasi, dan bukan tentang pengelompokan.

Data kategorikal merupakan masalah bagi sebagian besar algoritma dalam pembelajaran mesin. Misalkan, misalnya, Anda memiliki beberapa variabel kategori yang disebut "warna" yang dapat mengambil nilai merah, biru, atau kuning. Jika kita hanya menyandikan angka-angka ini sebagai 1,2, dan 3 masing-masing, algoritma kita akan berpikir bahwa merah (1) sebenarnya lebih dekat dengan biru (2) daripada kuning (3). Kita perlu menggunakan representasi yang memungkinkan komputer memahami bahwa semua hal ini sebenarnya sama-sama berbeda.

Salah satu cara sederhana adalah dengan menggunakan apa yang disebut representasi satu-panas , dan itulah yang seharusnya Anda lakukan. Daripada memiliki satu variabel seperti "warna" yang dapat mengambil tiga nilai, kami memisahkannya menjadi tiga variabel. Ini akan menjadi "warna-merah," "warna-biru," dan "warna-kuning," yang semuanya hanya dapat mengambil nilai 1 atau 0.

Ini meningkatkan dimensi ruang, tetapi sekarang Anda bisa menggunakan algoritma pengelompokan apa pun yang Anda suka. Terkadang masuk akal untuk zscore atau memutihkan data setelah melakukan proses ini, tetapi ide Anda jelas masuk akal.

Jordan A
sumber
Saya setuju dengan jawaban Anda. HotEncoding sangat berguna.
Pramit
4

Anda juga dapat mencoba algoritma pengelompokan Ekspektasi Maximisasi. Ini dapat bekerja pada data kategorikal dan akan memberi Anda kemungkinan statistik yang mana nilai kategorikal (atau nilai) yang paling mungkin diambil oleh sebuah cluster.

pengguna490
sumber
2
Bisakah Anda lebih spesifik? EM mengacu pada algoritma pengoptimalan yang dapat digunakan untuk pengelompokan. Ada banyak cara untuk melakukan ini dan tidak jelas apa yang Anda maksud.
bayer
@ Bayer, saya pikir pengelompokan yang disebutkan di sini adalah model campuran gaussian. GMM biasanya menggunakan EM.
goh
1
Saya tidak berpikir itu yang dia maksud, karena GMM tidak menganggap variabel kategori.
bayer
3

Itu tergantung pada variabel kategori Anda yang digunakan. Untuk variabel ordinal, katakanlah seperti buruk, rata-rata dan baik, masuk akal hanya menggunakan satu variabel dan memiliki nilai 0,1,2 dan jarak masuk akal di sini (Rata-rata lebih dekat dengan buruk dan baik). Namun, jika tidak ada pesanan, idealnya Anda harus menggunakan satu pengkodean panas seperti yang disebutkan di atas.

Ram
sumber
3

Anda tidak boleh menggunakan k-means clustering pada dataset yang berisi tipe data campuran. Sebaliknya, ada sejumlah algoritma pengelompokan yang dapat secara tepat menangani tipe data campuran. Beberapa kemungkinan termasuk yang berikut:

1) Algoritme berbasis partisi: k-Prototipe, Pemeras
2) Algoritme hierarki: ROCK, aglomeratif tunggal, rata-rata, dan keterkaitan lengkap
3) Algoritma berbasis kepadatan: HIERDENC, MULIC, CLIQUE
4) Algoritma berbasis model: pengelompokan SVM, Self -Mengorganisir peta

Jika Anda ingin mempelajari lebih lanjut tentang algoritma ini, manuskrip 'Survey of Clustering Algorithms' yang ditulis oleh Rui Xu menawarkan pengantar komprehensif untuk analisis cluster.

SR_ml
sumber
2

Tujuan K-Means adalah untuk mengurangi varians dalam-cluster, dan karena menghitung centroids sebagai titik rata-rata sebuah cluster, maka diperlukan untuk menggunakan jarak Euclidean agar dapat menyatu dengan benar. Karena itu, jika Anda ingin benar-benar menggunakan K-Means, Anda perlu memastikan data Anda berfungsi dengan baik dengannya.

Perwakilan

K-Means, dan pengelompokan secara umum, mencoba untuk mempartisi data dalam kelompok-kelompok yang bermakna dengan memastikan bahwa instance dalam kelompok yang sama mirip satu sama lain. Oleh karena itu, Anda memerlukan cara yang baik untuk merepresentasikan data Anda sehingga Anda dapat dengan mudah menghitung ukuran kesamaan yang berarti.

Menggunakan pengkodean satu-panas pada variabel kategori adalah ide yang baik ketika kategori tersebut berjarak sama satu sama lain. Misalnya, jika Anda memiliki warna biru muda, biru tua, dan kuning, menggunakan enkode satu panas mungkin tidak memberi Anda hasil terbaik, karena biru tua dan biru muda cenderung "lebih dekat" satu sama lain daripada warna kuning.

Jika nilai kategorikal tidak "sama" dan dapat dipesan, Anda juga bisa memberikan kategori nilai numerik. Misalnya, anak-anak, remaja, dewasa, berpotensi direpresentasikan sebagai 0, 1, dan 2. Ini masuk akal karena seorang remaja "lebih dekat" dengan anak-anak daripada orang dewasa.

K-Medoids

Pendekatan yang lebih umum untuk K-Means adalah K-Medoids. K-Medoids bekerja dengan cara yang sama seperti K-Means, tetapi perbedaan utamanya adalah bahwa centroid untuk setiap cluster didefinisikan sebagai titik yang mengurangi jumlah jarak dalam-cluster. Menegakkan ini memungkinkan Anda untuk menggunakan ukuran jarak apa pun yang Anda inginkan, dan karena itu, Anda dapat membuat ukuran kustom Anda sendiri yang akan mempertimbangkan kategori apa yang harus ditutup atau tidak.

Valentin Calomme
sumber
1

Jika kami mempertimbangkan skenario di mana variabel kategori tidak dapat dikodekan panas seperti variabel kategori memiliki 200+ kategori.

Dalam kasus seperti itu, Anda dapat menggunakan paket clustMixType

Itu dapat menangani data campuran (numerik dan kategorikal), Anda hanya perlu memberi makan dalam data, secara otomatis memisahkan data Kategorikal dan Numerik.

Jika Anda menemukan masalah seperti beberapa numerik berada di bawah kategori maka Anda dapat Anda as.factor () / sebaliknya as.numeric (), pada bidang masing-masing dan mengonversinya menjadi faktor dan memasukkan data baru ke algoritma.

Hitung lambda, sehingga Anda bisa memberi makan sebagai input pada saat pengelompokan.

kita bahkan bisa mendapatkan WSS (dalam jumlah kuadrat), plot (grafik siku) untuk menemukan jumlah Cluster yang optimal.

Semoga jawaban ini membantu Anda mendapatkan hasil yang lebih bermakna.

Toros91
sumber
1

Banyak hal di atas menunjukkan bahwa k-means dapat diimplementasikan pada variabel yang kategorikal dan kontinu, yang salah dan hasilnya perlu diambil dengan sejumput garam.

Seperti disebutkan di atas oleh @Tim di atas, tidak masuk akal untuk menghitung jarak euclidian antara titik-titik yang tidak memiliki skala maupun urutan. Ketika Anda melakukan satu-panas menyandikan variabel kategori Anda menghasilkan matriks jarang dari 0 dan 1. Karena rentang nilai-nilai ini tetap dan antara 0 dan 1 mereka perlu dinormalisasi dengan cara yang sama seperti variabel kontinu. Z-score digunakan untuk mencari jarak antar titik. Yang masih, tidak sepenuhnya benar. Saya akan menjelaskan ini dengan sebuah contoh. Karena kategori saling eksklusif, jarak antara dua titik sehubungan dengan variabel kategori, mengambil salah satu dari dua nilai, yaitu tinggi atau rendah, yaitu, kedua titik tersebut termasuk dalam kategori yang sama atau tidak. Karena nilai-nilai ekstrem ini, Algoritme akhirnya memberikan bobot lebih dari variabel kontinu dalam mempengaruhi pembentukan cluster. Ini dapat diverifikasi dengan pemeriksaan sederhana dengan melihat variabel mana yang memengaruhi dan Anda akan terkejut melihat bahwa sebagian besar dari mereka akan menjadi variabel kategori. (Cara menemukan variabel yang paling berpengaruh [1])

Contoh: Pertimbangkan negara variabel kategorikal. Sekarang seperti yang kita ketahui jarak (perbedaan) antara pengamatan dari negara yang berbeda adalah sama (dengan asumsi tidak ada kesamaan lain seperti negara tetangga atau negara dari benua yang sama). Tetapi bertentangan dengan ini jika Anda menghitung jarak antara pengamatan setelah menormalkan satu nilai panas yang dikodekan mereka akan tidak konsisten (meskipun perbedaannya kecil) bersama dengan fakta bahwa mereka mengambil nilai tinggi atau rendah.

Pada akhirnya pilihan terbaik yang tersedia untuk python adalah k-prototypes yang dapat menangani variabel kategorikal dan kontinu.

[1]: Menemukan variabel yang paling berpengaruh dalam pembentukan kluster: https://stackoverflow.com/a/53081779/8224401

Tarun Kumar Yellapu
sumber
0

Model campuran dapat digunakan untuk mengelompokkan kumpulan data yang terdiri dari variabel kontinu dan kategorikal.

Anda dapat menggunakan paket R VarSelLCM (tersedia pada CRAN) yang memodelkan, dalam setiap cluster, variabel kontinu oleh distribusi Gaussian dan variabel ordinal / biner. Berhati-hatilah untuk menyimpan data Anda dalam bingkai data. Di mana variabel kontinu adalah "numerik" dan variabel kategorikal adalah "faktor".

Tutorial tersedia di: http://varsellcm.r-forge.r-project.org/

Selain itu, nilai yang hilang dapat dikelola oleh model yang ada.

pengguna200668
sumber
0

Saya menemukan masalah yang sama dan mencoba mengatasinya (tanpa mengetahui k-prototipe ada) literatur kaya yang saya temukan sendiri berasal dari ide tidak mengukur variabel dengan metrik jarak yang sama sama sekali. Lebih jauh lagi mungkin terdapat berbagai sumber informasi, yang mungkin menyiratkan struktur atau "pandangan" data yang berbeda. Ini adalah masalah alami, setiap kali Anda menghadapi hubungan sosial seperti yang ada di twitter / situs web dll.

Salah satu solusi yang mungkin adalah untuk mengatasi setiap subset variabel (yaitu numerik & kategorikal) secara terpisah. Mudah dipahami apa yang dilakukan oleh pengukuran jarak pada skala numerik. Data kategorikal sendiri dapat dengan mudah dipahami: Pertimbangkan memiliki vektor pengamatan biner: Tabel kontingensi pada 0/1 antara dua vektor pengamatan berisi banyak informasi tentang kesamaan antara kedua pengamatan. Ada banyak literatur tentang berbagai ukuran kesamaan yang disesuaikan pada vektor biner - kebanyakan dimulai dari tabel kontingensi.

Diberikan matriks jarak / kemiripan, yang keduanya menggambarkan pengamatan yang sama, seseorang dapat mengekstraksi grafik pada masing-masingnya (Multi-View-Graph-Clustering) atau mengekstraksi grafik tunggal dengan banyak sisi - setiap node (pengamatan) dengan sebanyak mungkin sisi untuk simpul lain, karena ada matriks informasi (Multi-Edge-Clustering). Setiap sisi diberi bobot pengukuran simmilaritas / jarak yang sesuai. Mulai di sini: Daftar Github dari Graph Clustering Algorithms & makalah mereka. Karena ada beberapa set informasi yang tersedia pada pengamatan tunggal, ini harus disatukan menggunakan misalnya keturunan analisis spektral atau faktorisasi matriks terkait. Analisis spektral menjadi metode standar untuk menemukan bagian grafik yang sangat terhubung atau sangat berbobot. Memiliki embedding spektral data yang dijalin, algoritma pengelompokan apa pun pada data numerik dapat dengan mudah bekerja. Default sastra adalah kman untuk masalah kesederhanaan, tetapi jauh lebih maju - dan bukan sebagai algoritma ketat di luar sana yang dapat digunakan secara bergantian dalam konteks ini.

Saya menyukai keindahan dan generalitas dalam pendekatan ini, karena mudah diperluas ke beberapa set informasi daripada sekadar tipe dan lebih lanjut penghormatannya untuk "ukuran" spesifik pada setiap subset data. Ini tidak mengurangi Anda dari fine tuning model dengan berbagai metrik jarak & kesamaan atau penskalaan variabel Anda (saya menemukan diri saya penskalaan variabel numerik untuk yang skala-skala dalam konteks analisis saya)

Dari sudut pandang skalabilitas, ada dua masalah utama:

  1. Perkiraan masalah eigen (di mana literatur yang kaya tentang algoritma juga ada)
  2. Estimasi matriks jarak (masalah murni kombinatorik, yang tumbuh besar dengan sangat cepat - saya belum menemukan cara yang efisien untuk mengatasinya)

Bersenang-senanglah dengan itu!

Tim Ruhkopf
sumber
0

Anda mungkin ingin melihat rekayasa fitur otomatis: http://www.orges-leka.de/automatic_feature_engineering.html . Metode ini didasarkan pada Bourgain Embedding dan dapat digunakan untuk memperoleh fitur numerik dari frame data kategorikal dan numerik campuran atau untuk setiap set data yang mendukung jarak antara dua titik data. Setelah mengubah data menjadi hanya fitur numerik, orang dapat menggunakan pengelompokan K-means secara langsung

orgesleka
sumber