Clustering untuk campuran data numerik dan nominal diskrit

10

Data saya mencakup respons survei yang bersifat biner (numerik) dan nominal / kategorikal. Semua tanggapan terpisah dan pada tingkat individu.Cuplikan data

Data berbentuk (n = 7219, p = 105).

Beberapa hal:

  • Saya mencoba mengidentifikasi teknik pengelompokan dengan ukuran kesamaan yang akan bekerja untuk data biner kategoris dan numerik. Ada teknik dalam R kmodes clustering dan kprototype yang dirancang untuk jenis masalah ini, tetapi saya menggunakan Python dan membutuhkan teknik dari sklearn clustering yang bekerja dengan baik dengan masalah jenis ini.

  • Saya ingin membuat profil segmen individu. artinya kelompok individu ini lebih peduli pada serangkaian fitur ini.

kms
sumber
Saya tidak berpikir pengelompokan apa pun akan mengembalikan hasil yang berarti pada data tersebut. Pastikan untuk memvalidasi temuan Anda. Juga pertimbangkan untuk mengimplementasikan algoritma sendiri, dan berkontribusi untuk sklearn. Tetapi Anda dapat mencoba menggunakan mis DBSCAN dengan koefisien dadu atau fungsi jarak lain untuk data biner / kategororial .
Memiliki QUIT - Anony-Mousse
1
Adalah umum untuk mengonversi kategorikal ke numerik dalam kasus ini. Lihat di sini scikit-learn.org/stable/modules/generated/… . Melakukan ini sekarang Anda hanya akan memiliki nilai biner dalam data Anda, jadi tidak akan memiliki masalah penskalaan dengan pengelompokan. Anda sekarang dapat mencoba k-means sederhana.
Mungkin pendekatan ini akan berguna: zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/…
Anda harus mulai dari solusi paling sederhana, dengan mencoba mengonversi representasi kategorikal menjadi satu-hot-encoding seperti yang disebutkan di atas.
geompalik
Ini adalah subjek dari tesis doktoral saya yang disiapkan pada tahun 1986 di IBM France Scientific Center dan Universitas Pierre et Marie Currie (Paris 6) yang berjudul teknik baru pengkodean dan asosiasi dalam klasifikasi otomatis. Dalam tesis ini saya mengusulkan teknik pengkodean data yang disebut Triordonnance untuk mengklasifikasikan satu set yang dijelaskan oleh variabel numerik, kualitatif dan ordinal.
Kata Chah slaoui

Jawaban:

9

Menikam:

Saya mencoba mengidentifikasi teknik pengelompokan dengan ukuran kesamaan yang akan bekerja untuk data biner kategoris dan numerik.

Gower Distance adalah metrik jarak yang berguna ketika data berisi variabel kontinu dan kategorikal.

Ada teknik dalam R kmodes clustering dan kprototype yang dirancang untuk jenis masalah ini, tetapi saya menggunakan Python dan membutuhkan teknik dari sklearn clustering yang bekerja dengan baik dengan masalah jenis ini.

Saya tidak dapat menemukan implementasi Gower Distance di Python ketika saya mencarinya sekitar 4-5 bulan yang lalu. Jadi saya datang dengan implementasi saya sendiri.

import pandas as pd
import numpy as np
from sklearn.neighbors import DistanceMetric


def gower_distance(X):
    """
    This function expects a pandas dataframe as input
    The data frame is to contain the features along the columns. Based on these features a
    distance matrix will be returned which will contain the pairwise gower distance between the rows
    All variables of object type will be treated as nominal variables and the others will be treated as 
    numeric variables.
    Distance metrics used for:
    Nominal variables: Dice distance (https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient)
    Numeric variables: Manhattan distance normalized by the range of the variable (https://en.wikipedia.org/wiki/Taxicab_geometry)
    """
    individual_variable_distances = []

    for i in range(X.shape[1]):
        feature = X.iloc[:,[i]]
        if feature.dtypes[0] == np.object:
            feature_dist = DistanceMetric.get_metric('dice').pairwise(pd.get_dummies(feature))
        else:
            feature_dist = DistanceMetric.get_metric('manhattan').pairwise(feature) / np.ptp(feature.values)

        individual_variable_distances.append(feature_dist)

    return np.array(individual_variable_distances).mean(0)

Tautan ke kode yang sama: https://github.com/matchado/Misc/blob/master/gower_dist.py

Berkenaan dengan teknik pengelompokan, saya belum menggunakan yang Anda sebutkan. Tapi saya telah menggunakan pengelompokan hierarkis dalam R bersama dengan jarak gower dengan kesuksesan di masa lalu.

Melihat ke dalam teknik pengelompokan yang tersedia dalam scikit belajar, Agglomerative Clustering tampaknya sesuai dengan tagihan. http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering

Saya ingin membuat profil segmen individu. artinya kelompok individu ini lebih peduli pada serangkaian fitur ini.

Setelah Anda menetapkan label kluster untuk setiap baris data Anda, untuk setiap kluster lihat distribusi fitur (statistik ringkasan untuk variabel kontinu & distribusi frekuensi untuk variabel kategori). Ini lebih mudah untuk dianalisis secara visual jika jumlah fitur Anda dapat dikelola (<20 mungkin?).

Tetapi karena Anda memiliki lebih dari 100 fitur, saya sarankan pendekatan yang lebih terorganisir. Buat matriks dengan label klaster di kolom dan ringkasan statistik fitur di baris (saya sarankan menggunakan median untuk variabel kontinu dan persentase kemunculan nilai paling sering di kluster untuk variabel kategori)

Mungkin terlihat seperti ini.

╔═══════════════════════╦═══════════╦═══════════╦════╦═══════════╗
║        Feature        ║ Cluster 1 ║ Cluster 2 ║ …  ║ Cluster N ║
╠═══════════════════════╬═══════════╬═══════════╬════╬═══════════╣
║ Numeric feature 1     ║ 15        ║ 37        ║ .. ║ 1         ║
║ Numeric feature 2     ║ 34        ║ 56        ║ …  ║ 56        ║
║ Categorical feature 1 ║ 47%       ║ 87%       ║ …  ║ 25%       ║
║ …                     ║ …         ║ …         ║ …  ║ …         ║
║ Categorical feature N ║ 25%       ║ 91%       ║ …  ║ 11%       ║
║ Numeric feature N     ║ 0.2       ║ 0.7       ║ …  ║ 0.5       ║
╚═══════════════════════╩═══════════╩═══════════╩════╩═══════════╝
gregorymatchado
sumber
1
Jawaban yang solid, bagus sekali.
Astrid
1
Luar biasa! terima kasih atas waktu Anda
Gonzalo Garcia
2

Saya menambahkan jawaban saya untuk pertanyaan ini di bawah - kalian pada dasarnya menanyakan hal yang sama.


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 menurut Anda harus 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
1

Metrik jarak yang diterapkan oleh @gregorymatchado memiliki satu bug. Untuk atribut Numerik, rentang akan memberikan NaN untuk nilai yang sama di seluruh. Untuk itu kita perlu menggunakan perubahan max(np.ptp(feature.values),1)daripada np.ptp(feature.values). Kode lengkap di bawah ini:

import pandas as pd
import numpy as np
from sklearn.neighbors import DistanceMetric


def gower_distance(X):
"""
This function expects a pandas dataframe as input
The data frame is to contain the features along the columns. Based on these features a
distance matrix will be returned which will contain the pairwise gower distance between the rows
All variables of object type will be treated as nominal variables and the others will be treated as 
numeric variables.
Distance metrics used for:
Nominal variables: Dice distance (https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient)
Numeric variables: Manhattan distance normalized by the range of the variable (https://en.wikipedia.org/wiki/Taxicab_geometry)
"""
individual_variable_distances = []

for i in range(X.shape[1]):
    feature = X.iloc[:,[i]]
    if feature.dtypes[0] == np.object:
        feature_dist = DistanceMetric.get_metric('dice').pairwise(pd.get_dummies(feature))
    else:
        feature_dist = DistanceMetric.get_metric('manhattan').pairwise(feature) / max(np.ptp(feature.values),1)

    individual_variable_distances.append(feature_dist)

return np.array(individual_variable_distances).mean(0)
Rana
sumber
0

Saya pikir Anda memiliki bug juga. Jika fitur vektor memiliki skala yang sangat kecil. maka jarakmu tidak berguna. Jadi, saya akan mengonversi seperti berikut:

epsilon = 10**(-8)
... / max(np.ptp(feature.values), epsilon)
Oseong Kwon
sumber