Phân cụm cho dữ liệu rời rạc số và danh nghĩa hỗn hợp


9

Dữ liệu của tôi bao gồm các câu trả lời khảo sát là nhị phân (số) và danh nghĩa / phân loại. Tất cả các câu trả lời là rời rạc và ở cấp độ cá nhân.Ảnh chụp dữ liệu

Dữ liệu có hình dạng (n = 7219, p = 105).

Vài điều

  • Tôi đang cố gắng xác định một kỹ thuật phân cụm với một thước đo tương tự sẽ hoạt động đối với dữ liệu nhị phân phân loại và số. Có các kỹ thuật trong phân cụm R kmodes và kprototype được thiết kế cho loại vấn đề này, nhưng tôi đang sử dụng Python và cần một kỹ thuật từ phân cụm sklearn hoạt động tốt với loại vấn đề này.

  • Tôi muốn xây dựng hồ sơ của các phân khúc của cá nhân. có nghĩa là nhóm các cá nhân quan tâm nhiều hơn về các tính năng này.


Tôi không nghĩ rằng bất kỳ phân cụm sẽ trả về kết quả có ý nghĩa trên dữ liệu đó. Hãy chắc chắn để xác nhận những phát hiện của bạn. Cũng xem xét việc tự thực hiện một thuật toán và đóng góp cho sklearn. Nhưng bạn có thể thử sử dụng ví dụ DBSCAN với hệ số xúc xắc hoặc hàm khoảng cách khác cho dữ liệu nhị phân / phân loại .
Có QUIT - Anony-Mousse

1
Nó là phổ biến để chuyển đổi phân loại thành số trong những trường hợp này. Xem ở đây scikit-learn.org/urdy/modules/generated/ . Làm điều này bây giờ bạn sẽ chỉ có các giá trị nhị phân trong dữ liệu của mình, vì vậy sẽ không có vấn đề mở rộng với phân cụm. Bây giờ bạn có thể thử một phương tiện k đơn giản.

Có lẽ cách tiếp cận này sẽ hữu ích: zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt12/ Kẻ

Bạn nên bắt đầu từ giải pháp đơn giản nhất, bằng cách thử chuyển đổi các biểu diễn phân loại thành mã hóa nóng như đã lưu ý ở trên.
geompalik

Đây là đề tài của luận án tiến sĩ của tôi được chuẩn bị vào năm 1986 tại Trung tâm khoa học IBM France và Đại học Pierre et Marie Currie (Paris 6) có các kỹ thuật mới về mã hóa và liên kết trong phân loại tự động. Trong luận án này, tôi đã đề xuất các kỹ thuật mã hóa dữ liệu được gọi là Triordonnance để phân loại một tập hợp được mô tả bởi các biến số, định tính và thứ tự.
Chah slaoui cho biết

Câu trả lời:


8

Đâm

Tôi đang cố gắng xác định một kỹ thuật phân cụm với một thước đo tương tự sẽ hoạt động đối với dữ liệu nhị phân phân loại và số.

Khoảng cách Gower là một thước đo khoảng cách hữu ích khi dữ liệu chứa cả biến liên tục và biến phân loại.

Có các kỹ thuật trong phân cụm R kmodes và kprototype được thiết kế cho loại vấn đề này, nhưng tôi đang sử dụng Python và cần một kỹ thuật từ phân cụm sklearn hoạt động tốt với loại vấn đề này.

Tôi đã không thể tìm thấy triển khai Gower Khoảng cách trong Python khi tôi tìm kiếm nó khoảng 4-5 tháng trước. Vì vậy, tôi đã đưa ra thực hiện của riêng tôi.

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)

Liên kết đến cùng một đoạn mã: https://github.com/matchado/Misc/blob/master/gower_dist.py

Liên quan đến kỹ thuật phân cụm, tôi đã không sử dụng những cái bạn đã đề cập. Nhưng tôi đã sử dụng phân cụm theo thứ bậc trong R cùng với khoảng cách gower với thành công trong quá khứ.

Nhìn vào các kỹ thuật phân cụm có sẵn trong scikit learn, Agglomerative Clustering dường như phù hợp với dự luật. http://scikit-learn.org/urdy/modules/clustering.html#hierarchical-clustering

Tôi muốn xây dựng hồ sơ của các phân khúc của cá nhân. có nghĩa là nhóm các cá nhân quan tâm nhiều hơn về các tính năng này.

Khi bạn đã gán nhãn cụm cho từng hàng dữ liệu của mình, cho mỗi cụm xem xét phân phối các tính năng (thống kê tóm tắt cho các biến liên tục & phân phối tần suất cho các biến phân loại). Điều này dễ dàng hơn để phân tích trực quan nếu số lượng tính năng của bạn có thể quản lý được (<20 có thể?).

Nhưng vì bạn có hơn 100 tính năng, tôi đề xuất một cách tiếp cận có tổ chức hơn. Tạo một ma trận với các nhãn cụm trong các cột và chỉ số tóm tắt của các tính năng trong các hàng (Tôi đề nghị sử dụng trung bình cho biến liên tục và tỷ lệ phần trăm xuất hiện của giá trị thường xuyên nhất trong cụm cho biến phân loại)

Nó có thể trông giống như thế này.

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

Câu trả lời chắc chắn, được thực hiện độc đáo.
Astrid

Thông minh! cảm ơn bạn đã dành thời gian
Gonzalo Garcia

2

Tôi đã nối câu trả lời của mình cho câu hỏi này dưới đây - về cơ bản các bạn đã hỏi điều tương tự.


Câu hỏi này có vẻ thực sự về đại diện, và không quá nhiều về phân cụm.

Dữ liệu phân loại là một vấn đề đối với hầu hết các thuật toán trong học máy. Giả sử, ví dụ, bạn có một số biến phân loại được gọi là "màu" có thể mang các giá trị đỏ, xanh hoặc vàng. Nếu chúng ta chỉ đơn giản mã hóa các số này lần lượt là 1,2 và 3, thuật toán của chúng ta sẽ nghĩ rằng màu đỏ (1) thực sự gần với màu xanh lam (2) hơn là màu vàng (3). Chúng ta cần sử dụng một đại diện cho phép máy tính hiểu rằng những thứ này thực sự khác nhau như nhau.

Một cách đơn giản là sử dụng cái được gọi là đại diện một nóng, và đó chính xác là những gì bạn nghĩ bạn nên làm. Thay vì có một biến như "màu" có thể nhận ba giá trị, chúng tôi tách nó thành ba biến. Chúng sẽ là "màu đỏ," "màu xanh lam" và "màu vàng-vàng", tất cả chỉ có thể nhận giá trị 1 hoặc 0.

Điều này làm tăng tính chiều của không gian, nhưng bây giờ bạn có thể sử dụng bất kỳ thuật toán phân cụm nào bạn muốn. Đôi khi nó có ý nghĩa để zscore hoặc làm trắng dữ liệu sau khi thực hiện quá trình này, nhưng ý tưởng của bạn chắc chắn là hợp lý.


1

Số liệu khoảng cách được thực hiện bởi @gregorymatchado có một lỗi. Đối với các thuộc tính Số, phạm vi sẽ cung cấp NaN cho cùng các giá trị trong suốt. Cho rằng chúng ta cần sử dụng thay đổi max(np.ptp(feature.values),1)thay vì np.ptp(feature.values). Hoàn thành mã dưới đây:

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

Tôi nghĩ bạn cũng có lỗi. Nếu vector tính năng có quy mô rất nhỏ. sau đó khoảng cách của bạn là vô ích. Vì vậy, tôi sẽ chuyển đổi như sau:

epsilon = 10**(-8)
... / max(np.ptp(feature.values), epsilon)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.