数値と名義の混合離散データのクラスタリング


9

私のデータには、2進数(数値)および名目/カテゴリーの調査回答が含まれています。すべての応答は離散的で、個人レベルです。データのスナップショット

データは形状です(n = 7219、p = 105)。

カップルのもの:

  • カテゴリカルおよび数値のバイナリデータで機能する類似性の測度を使用して、クラスタリング手法を特定しようとしています。このタイプの問題のために設計されたR kmodesクラスタリングとkprototypeにはテクニックがありますが、私はPythonを使用していて、このタイプの問題にうまく機能するsklearnクラスタリングのテクニックが必要です。

  • 個人のセグメントのプロファイルを作成したい。つまり、この個人グループは、これらの機能のセットをより重視します。


クラスタリングがそのようなデータに対して意味のある結果を返すとは思いません。調査結果を必ず検証してください。アルゴリズムを自分で実装し、それをsklearnに提供することも検討してください。しかし、たとえば、バイナリ/カテゴリデータに対して、サイコロ係数または別の距離関数を使用したDBSCANを使用することを試みることができます
QUITあり-Anony-Mousse 2015年

1
これらの場合、カテゴリカルを数値に変換するのが一般的です。ここscikit-learn.org/stable/modules/generated/…を参照してください。これを行うと、データにバイナリ値のみが含まれるようになるため、クラスタリングに関するスケーリングの問題は発生しません。簡単なk-meansを試すことができます。

おそらく、このアプローチは有用であろう:zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/...

上記のようにカテゴリカルをワンホットエンコーディング表現に変換することにより、最も簡単なソリューションから開始する必要があります。
geompalik 2016

これは、1986年にIBMフランス科学センターとピエールエマリーカリー大学(パリ6)で作成された私の博士論文の主題であり、自動分類におけるコーディングと関連付けの新しい技法を与えられています。この論文では、数値、定性、順序変数によって記述されたセットを分類するためにTriordonnanceと呼ばれるデータコーディング手法を提案しました。
Chah slaouiが2016年

回答:


8

刺す:

カテゴリカルおよび数値のバイナリデータで機能する類似性の測度を使用して、クラスタリング手法を特定しようとしています。

ガワー距離は、データに連続変数とカテゴリ変数の両方が含まれている場合に役立つ距離メトリックです。

このタイプの問題のために設計されたR kmodesクラスタリングとkprototypeにはテクニックがありますが、私はPythonを使用していて、このタイプの問題にうまく機能するsklearnクラスタリングのテクニックが必要です。

約4〜5か月前に検索したところ、PythonでGower Distanceの実装を見つけることができませんでした。だから私は自分の実装を思いついた。

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)

同じコードへのリンク:https : //github.com/matchado/Misc/blob/master/gower_dist.py

クラスタリング手法に関しては、あなたが言及した手法は使用していません。しかし、私は過去に成功したガワー距離とともにRで階層的クラスタリングを使用しました。

scikit learnで利用可能なクラスタリング手法を検討すると、凝集クラスタリングはその目的に適合しているようです。http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering

個人のセグメントのプロファイルを作成したい。つまり、この個人グループは、これらの機能のセットをより重視します。

データの各行にクラスターラベルを割り当てたら、各クラスターについて、特徴の分布(連続変数の要約統計とカテゴリー変数の頻度分布)を調べます。これは、機能の数が管理可能であれば(おそらく20未満ですか?)、視覚的に分析する方が簡単です。

ただし、100以上の機能があるため、より体系的なアプローチをお勧めします。列にクラスターラベル、行に機能の要約統計量を含む行列を作成します(連続変数の中央値と、カテゴリー変数のクラスターで最も頻繁な値の発生率を使用することをお勧めします)

それはこのように見えるかもしれません。

╔═══════════════════════╦═══════════╦═══════════╦════╦═══════════╗
║        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       ║
╚═══════════════════════╩═══════════╩═══════════╩════╩═══════════╝

しっかりした答え、うまくやった。
アストリッド

優秀な!お時間をいただきありがとうございます
ゴンサロガルシア

2

私はこの質問に私の回答を以下に追加しました-あなたたちは本質的に同じことを尋ねました


この質問は実際には表現に関するものであり、クラスタリングについてはそうではありません。

カテゴリカルデータは、機械学習のほとんどのアルゴリズムの問​​題です。たとえば、赤、青、または黄色の値をとることができる「色」というカテゴリ変数があるとします。これらをそれぞれ1、2、3として単純にエンコードすると、アルゴリズムでは、赤(1)は実際には黄色(3)よりも青(2)に近いと見なされます。これらのものがすべて実際には等しく異なることをコンピューターに理解させる表現を使用する必要があります。

簡単な方法の1つは、ワンホット表現と呼ばれるものを使用することです。これは、まさにあなたがすべきだと思っていたものです。3つの値をとることができる「color」のような1つの変数を持つのではなく、3つの変数に分けます。これらは、「color-red」、「color-blue」、および「color-yellow」であり、すべて1または0の値のみを取ることができます。

これにより、空間の次元が増加しますが、これで任意のクラスタリングアルゴリズムを使用できます。このプロセスを実行した後、データをzscoreまたは白くすることは理にかなっていますが、あなたの考えは間違いなく合理的です。


1

@gregorymatchadoによって実装された距離メトリックには、1つのバグがあります。数値属性の場合、範囲は全体を通して同じ値に対してNaNを与えます。そのためには、のmax(np.ptp(feature.values),1)代わりに変更を使用する必要がありnp.ptp(feature.values)ます。以下の完全なコード:

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)

0

バグもあると思います。特徴ベクトルのスケールが非常に小さい場合。あなたの距離は役に立たない。だから、私は次のように変換します:

epsilon = 10**(-8)
... / max(np.ptp(feature.values), epsilon)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.