Hướng dẫn clustering mixed data python - phân cụm dữ liệu hỗn hợp python

Hình ảnh của tác giả

Trong quá trình thực tập khoa học dữ liệu đầu tiên của tôi, tôi đã được giao một nhiệm vụ có vẻ đơn giản để tìm các cụm trong bộ dữ liệu. Với kiến ​​thức cơ bản của tôi về các thuật toán phân cụm như K-Means, DBSCAN và GMM, tôi nghĩ rằng tôi có thể dễ dàng hoàn thành nhiệm vụ này. Tuy nhiên, khi tôi xem xét kỹ hơn về bộ dữ liệu, tôi nhận ra dữ liệu chứa hỗn hợp dữ liệu phân loại và liên tục, và nhiều phương pháp phân cụm phổ biến mà tôi biết sẽ không dễ dàng hoạt động.categorical and continuous data, and many common methods of clustering I knew would not easily work.

Dữ liệu phân loại bao gồm nhiều loại riêng biệt thường không có bất kỳ thứ tự hoặc mối quan hệ rõ ràng nào với nhau. Dữ liệu này có thể trông giống như Andro Android, hoặc IOS IOS.consists of multiple discrete categories that commonly do not have any clear order or relationship to each-other. This data might look like “Android” or “iOS”.

Dữ liệu liên tục bao gồm các số thực có thể lấy bất kỳ giá trị nào. Dữ liệu này có thể trông giống như 3.14159, hoặc 43 ".consists of real numbers that can take any value. This data might look like “3.14159” or “43".

Nhiều bộ dữ liệu chứa hỗn hợp dữ liệu phân loại và liên tục. Tuy nhiên, nó không đơn giản làm thế nào để phân cụm các bộ dữ liệu với các loại dữ liệu hỗn hợp. Vậy làm thế nào để chúng ta phân cụm trên dữ liệu có cả tính năng phân loại và liên tục? Hãy xem hai cách đơn giản để tiếp cận vấn đề này bằng Python.

Bộ dữ liệu

Trong bài đăng này, tôi sẽ phân cụm một bộ dữ liệu nhỏ mà tôi tạo ra có hỗn hợp các tính năng phân loại và liên tục. Dữ liệu giả của tôi đại diện cho dữ liệu khách hàng có thể được sử dụng để hiểu khách hàng của một trang web/ứng dụng thương mại điện tử. Bộ dữ liệu giả của chúng tôi sẽ có 4 tính năng:

  • HĐH - Hệ điều hành của khách hàng giả của chúng tôi (Phân loại) — operating system of our fake customer (Categorical)
  • ISP - Nhà cung cấp dịch vụ Internet của khách hàng giả của chúng tôi (Phân loại)— internet service provider of our fake customer (Categorical)
  • Tuổi - Tuổi khách hàng (liên tục) — customer age (Continuous)
  • Thời gian dành - thời gian mà người dùng giả mạo của chúng tôi dành cho trang web của chúng tôi (liên tục) — time that our fake users spent on our website (Continuous)

Dưới đây là mã được sử dụng để tạo dữ liệu giả của chúng tôi.

#create dataset
import numpy as np
import pandas as pd

operating_systems = ["Android","iOS"]
isp_names = ["Cox","HughesNet","Xfinity","AT&T"]

data = []
for i in range(100):
row = []
row.append(np.random.choice(operating_systems)) #OS
row.append(np.random.choice(isp_names)) #ISP
row.append(np.random.poisson(lam=25)) #Age
row.append(np.random.uniform(low=0.5, high=1000)) #Time Spent
data.append(row)

customers = pd.DataFrame(data, columns = ['OS', 'ISP','Age','Time Spent'])

Đây là những gì bộ dữ liệu giả của chúng tôi trông như thế nào. Bây giờ chúng ta hãy làm cho tay của chúng ta bẩn và làm một số cụm!

Phương pháp 1: KPOTOTOTES

Phương pháp phân cụm đầu tiên chúng tôi sẽ thử được gọi là K-Prototypes. Thuật toán này về cơ bản là sự giao thoa giữa thuật toán K-MEANS và thuật toán K-Modes.K-means algorithm and the K-modes algorithm.

Để làm mới bộ nhớ của chúng tôi, K-MEANS cụm dữ liệu bằng cách sử dụng khoảng cách Euclide. Trong khi đó, các cụm K-Modes Dữ liệu phân loại dựa trên số lượng danh mục phù hợp giữa các điểm dữ liệu. Một hỗn hợp của cả hai điều này: thuật toán kiểu mẫu K, chỉ là những gì chúng ta cần để phân cụm khách hàng giả mạo của mình!K-means clusters data using euclidean distance. Meanwhile, K-modes clusters categorical data based off the number of matching categories between data points. A mixture of both of these: the K-prototype algorithm, is just what we need to cluster our fake customers!

Đầu tiên, hãy bình thường hóa các tính năng liên tục trong dữ liệu của chúng tôi để đảm bảo rằng một tính năng không được hiểu là quan trọng hơn so với các tính năng khác.

from sklearn import preprocessingcustomers_norm = customers.copy()
scaler = preprocessing.MinMaxScaler()
customers_norm[['Age','Time Spent']] = scaler.fit_transform(customers_norm[['Age','Time Spent']])

Bây giờ, hãy sử dụng thuật toán K-Prototypes để phân cụm dữ liệu của chúng tôi. Việc thực hiện thuật toán của tôi rất đơn giản, với 3 cụm và khởi tạo CAO. Khi đào tạo mô hình, chúng tôi chỉ định cột nào trong dữ liệu là phân loại (cột 0 và 1). Thông tin thêm về việc thực hiện và tinh chỉnh thuật toán này có thể được tìm thấy ở đây: https://github.com/nicodv/kmodes.

from kmodes.kprototypes import KPrototypeskproto = KPrototypes(n_clusters=3, init='Cao')clusters = kproto.fit_predict(customers_norm, categorical=[0, 1])#join data with labels 
labels = pd.DataFrame(clusters)
labeledCustomers = pd.concat((customers,labels),axis=1)
labeledCustomers = labeledCustomers.rename({0:'labels'},axis=1)

Cuối cùng, hãy thực hiện một số lô bầy để xem cách phân cụm của chúng tôi thực hiện.

Nó đã làm việc! Có vẻ như chúng ta có 3 cụm khá khác biệt. Cụm đầu tiên của chúng tôi dường như đại diện cho người dùng đã dành nhiều thời gian trên trang web. Cụm thứ hai của chúng tôi có chủ yếu là người dùng Android có thời gian trung bình/ thấp. Cuối cùng, cụm thứ ba của chúng tôi có chủ yếu là người dùng iOS, những người cũng có thời gian trung bình/ thấp.

Phương pháp 2: K-MEANS với một mã hóa nóng

Một giải pháp thay thế cho việc sử dụng thuật toán K-Prototypes đang sử dụng thuật toán K-MEANS và một biến phân loại mã hóa nóng. Một mã hóa nóng liên quan đến việc tạo một cột mới cho mỗi giá trị phân loại trong tập dữ liệu. Sau đó, 1 hoặc 0 được gán tùy thuộc vào việc giá trị phân loại đó có trong dữ liệu hay không. Cho phép một mã hóa nóng mã hóa các giá trị phân loại trong bộ dữ liệu của chúng tôi bằng cách sử dụng hàm gấu trúc GET_Dummies.One hot encoding involves creating a new column for each categorical value in the dataset. Then a 1 or 0 is assigned depending on if that categorical value is in the data or not. Lets one hot encode the categorical values in our dataset using the pandas “get_dummies” function.

customers_norm = pd.get_dummies(customers_norm, columns=["OS","ISP"])

Bây giờ, dữ liệu của chúng tôi trông như thế này. MÁT MẺ! Thời gian để làm phân cụm nhiều hơn.

Cho phép phân cụm dữ liệu này bằng cách sử dụng một triển khai cơ bản của K-MEAN và tạo thêm một số lô bầy để xem phương pháp này hoạt động như thế nào.

from sklearn.cluster import KMeanskmeans = KMeans(3)
clusters = kmeans.fit_predict(customers_norm)
labels = pd.DataFrame(clusters)
labeledCustomers = pd.concat((customers,labels),axis=1)
labeledCustomers = labeledCustomers.rename({0:'labels'},axis=1)

Được chứ! Thật thú vị khi thấy các cụm này khác nhau như thế nào từ các cụm mẫu K được hiển thị trước đó. Thoạt nhìn, có vẻ như các tính năng phân loại trong dữ liệu của chúng tôi đã đóng góp nhiều hơn cho các cụm của chúng tôi và các tính năng liên tục của chúng tôi không đóng góp nhiều. Cụm đầu tiên chứa người dùng iOS không sử dụng AT & T. Cụm thứ hai của chúng tôi chứa người dùng iOS sử dụng AT & T. Cuối cùng, cụm thứ ba của chúng tôi chứa tất cả người dùng Android. Trong khi đó, tuổi tác và thời gian có một phân phối lớn trong tất cả các cụm.

Sự kết luận

Trong bài đăng này, chúng tôi đã xem xét hai phương pháp khác nhau để phân cụm dữ liệu phân loại/liên tục trong Python. Để bắt đầu, chúng tôi đã triển khai thuật toán K-prototypes, một thuật toán được thiết kế đặc biệt để phân cụm dữ liệu hỗn hợp bằng cách sử dụng kết hợp các phương thức K-mean/K. Thay vào đó, chúng tôi đã thử sử dụng thuật toán K-MEAN với một mã hóa nóng.K-prototypes algorithm, an algorithm specifically designed to cluster mixed data using a combination of the K-means/K-modes. As an alternative, we tried using the K-means algorithm with one hot encoding.

Sử dụng bộ dữ liệu giả của chúng tôi, có sự khác biệt đáng kể trong các cụm được xác định bởi hai phương pháp này.K-prototypes dường như xem xét đồng đều các tính năng phân loại và liên tục.Trong khi đó, K-Means dường như cân nhắc các tính năng phân loại nhiều hơn nhiều, điều này có thể sẽ không mong muốn.

Làm thế nào để các phương pháp này hoạt động với bộ dữ liệu hỗn hợp của bạn?Hãy thảo luận!

Github repo với tất cả mã/hình ảnh tại đây: https://github.com/ryankemmer/clusteringmixeddata

Người giới thiệu

[1] De Vos, Nelis J. Kmodes Thư viện phân cụm phân loại.2015

.