Hướng dẫn hierarchical in python - phân cấp trong python

Giới thiệu

Trong hướng dẫn này, chúng tôi sẽ tập trung vào việc thực hiện thuật toán phân cụm phân cấp với Scikit-learn để giải quyết vấn đề tiếp thị.Hierarchical Clustering Algorithm with Scikit-Learn to solve a marketing problem.Hierarchical Clustering Algorithm with Scikit-Learn to solve a marketing problem.

Nội dung chính ShowShow

  • Giới thiệu
  • Động lực
  • Phân tích dữ liệu khám phá ngắn gọn
  • Mã hóa các biến và kỹ thuật tính năng
  • Mã hóa một lần cũng thêm 0 vào dữ liệu của chúng tôi, làm cho nó trở nên thưa thớt hơn, đây có thể là một vấn đề đối với một số thuật toán nhạy cảm với sự thưa thớt dữ liệu.
  • Hình dung cấu trúc phân cấp với dendrograms
  • Thực hiện phân cụm phân cấp kết tụ
  • Đi xa hơn-Dự án đầu cuối cầm tay
  • Sự kết luận

Nội phân chính

  • Giới thiệu
  • Phân tích dữ liệu khám phá ngắn gọn
  • Mã hóa các biến và kỹ thuật tính năng
  • Mã hóa một lần cũng thêm 0 vào dữ liệu của chúng tôi, làm cho nó trở nên thưa thớt hơn, đây có thể là một vấn đề đối với một số thuật toán nhạy cảm với sự thưa thớt dữ liệu.
  • Hình dung cấu trúc phân cấp với dendrograms
  • Thực hiện phân cụm phân cấp kết tụ
  • Đi xa hơn-Dự án đầu cuối cầm tay

Sự kết luận

  • Nội phân chính
  • Cấu trúc cơ bản và giảm kích thước
  • Sau khi đọc hướng dẫn, bạn sẽ hiểu:
  • Khi nào nên áp dụng phân cụm phân cấp
  • Cách trực quan hóa bộ dữ liệu để hiểu nếu nó phù hợp để phân cụm
  • Cách xử lý trước các tính năng và kỹ sư các tính năng mới dựa trên bộ dữ liệu
  • Cách giảm chiều của bộ dữ liệu bằng PCA
  • Cách sử dụng và đọc một dendrogram để phân tách các nhóm
  • Các phương pháp liên kết và số liệu khoảng cách khác nhau được áp dụng cho dendrogram và thuật toán phân cụm

Các chiến lược phân cụm kết tụ và gây chia rẽ là gì và cách chúng hoạt động You can download the notebook containing all of the code in this guide here.

Động lực

Phân tích dữ liệu khám phá ngắn gọn

Mã hóa các biến và kỹ thuật tính năng

Mã hóa một lần cũng thêm 0 vào dữ liệu của chúng tôi, làm cho nó trở nên thưa thớt hơn, đây có thể là một vấn đề đối với một số thuật toán nhạy cảm với sự thưa thớt dữ liệu.clustering algorithm, such as K-Means, DBSCAN, Hierarchical Clustering, etc. In general terms, clustering algorithms find similarities between data points and group them.

Hình dung cấu trúc phân cấp với dendrograms

Thực hiện phân cụm phân cấp kết tụ, we can leverage Hierarchical Clustering to solve this problem. This process is also known as Hierarchical Clustering Analysis (HCA).

Đi xa hơn-Dự án đầu cuối cầm tay

Sự kết luậnunsupervised algorithm. When grouping data, we won't have a way to verify that we are correctly identifying that a user belongs to a specific group (we don't know the groups). There are no labels for us to compare our results to. If we identified the groups correctly, it will be later confirmed by the marketing department on a day-to-day basis (as measured by metrics such as ROI, conversion rates, etc.).

Nội phân chính

Phân tích dữ liệu khám phá ngắn gọn

Mã hóa các biến và kỹ thuật tính năng You can download the dataset used in this guide here.

Cấu trúc cơ bản và giảm kích thước

import pandas as pd

# Substitute the path_to_file content by the path to your shopping-data.csv file 
path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

Hình dung cấu trúc phân cấp với dendrograms

customer_data.shape

Thực hiện phân cụm phân cấp kết tụ

(200, 5)

Đi xa hơn-Dự án đầu cuối cầm tay

customer_data.columns

Sau khi đọc hướng dẫn, bạn sẽ hiểu:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Khi nào nên áp dụng phân cụm phân cấp

Chúng ta hãy xem nhanh phân phối điểm số này để kiểm tra thói quen chi tiêu của người dùng trong bộ dữ liệu của chúng tôi. Đó là nơi phương pháp gấu trúc

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
4 xuất hiện để giúp đỡ:
customer_data['Spending Score (1-100)'].hist()

Bằng cách nhìn vào biểu đồ, chúng tôi thấy rằng hơn 35 khách hàng có điểm từ

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
5 đến
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
6, sau đó ít hơn 25 có điểm từ
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
7 đến
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
8. Vì vậy, hầu hết khách hàng của chúng tôi là những người chi tiêu cân bằng, tiếp theo là những người chi tiêu từ trung bình đến cao. Chúng ta cũng có thể thấy rằng có một dòng sau
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9, ở bên trái của phân phối và một dòng khác trước 100, ở bên phải của phân phối. Những không gian trống này có thể có nghĩa là phân phối không chứa những người không phải là người chi tiêu, sẽ có điểm
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9 và cũng không có người chi tiêu cao với số điểm
customer_data['Spending Score (1-100)'].hist()
1.

Để xác minh xem điều đó có đúng không, chúng ta có thể xem xét các giá trị tối thiểu và tối đa của phân phối. Những giá trị đó có thể dễ dàng tìm thấy như là một phần của thống kê mô tả, vì vậy chúng ta có thể sử dụng phương pháp

customer_data['Spending Score (1-100)'].hist()
2 để hiểu về các phân phối giá trị số khác:
customer_data.shape
5

Điều này sẽ cung cấp cho chúng tôi một bảng từ nơi chúng tôi có thể đọc các phân phối của các giá trị khác của bộ dữ liệu của chúng tôi:

customer_data.shape
6

Giả thuyết của chúng tôi được xác nhận. Giá trị

customer_data['Spending Score (1-100)'].hist()
3 của
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
2 là
customer_data['Spending Score (1-100)'].hist()
5 và tối đa là
customer_data['Spending Score (1-100)'].hist()
6. Vì vậy, chúng tôi không có người chi tiêu
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9 hoặc
customer_data['Spending Score (1-100)'].hist()
1. Sau đó, hãy xem các cột khác của bảng
customer_data['Spending Score (1-100)'].hist()
9 được chuyển đổi. Khi nhìn vào các cột
customer_data.shape
50 và
customer_data.shape
51, chúng ta có thể thấy rằng với
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0
customer_data.shape
50 là
customer_data.shape
54 và
customer_data.shape
51 xấp xỉ
customer_data.shape
56. Điều tương tự cũng xảy ra đối với
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
1, với
customer_data.shape
50 là
customer_data.shape
59 và
customer_data.shape
51
customer_data.shape
61, và đối với
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
2 với
customer_data.shape
50 của
customer_data.shape
64 và
customer_data.shape
51 của
customer_data.shape
66. Đối với tất cả các tính năng,
customer_data.shape
50 khác xa với độ lệch chuẩn, cho thấy dữ liệu của chúng tôi có độ biến thiên cao.

Để hiểu rõ hơn về cách dữ liệu của chúng tôi thay đổi, hãy vẽ phân phối

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
1:
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
3

Điều này sẽ cung cấp cho chúng tôi:

Lưu ý trong Biểu đồ rằng hầu hết dữ liệu của chúng tôi, hơn 35 khách hàng, tập trung gần số

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
6, trên
customer_data.shape
50 của chúng tôi, trong trục ngang. Nhưng điều gì xảy ra khi chúng ta di chuyển về phía cuối của phân phối? Khi đi về phía bên trái, từ giá trị trung bình $ 60,560, giá trị tiếp theo chúng ta sẽ gặp là $ 34,300 - giá trị trung bình ($ 60.560) trừ đi biến thể tiêu chuẩn ($ 26,260). Nếu chúng tôi đi xa hơn bên trái phân phối dữ liệu của chúng tôi, một quy tắc tương tự được áp dụng, chúng tôi sẽ trừ biến thể tiêu chuẩn ($ 26,260) từ giá trị hiện tại ($ 34,300). Do đó, chúng tôi sẽ gặp phải giá trị $ 8,040. Lưu ý cách dữ liệu của chúng tôi đã đi từ $ 60k đến $ 8k một cách nhanh chóng. Đó là "nhảy" $ 26,260 mỗi lần - thay đổi rất nhiều, và đó là lý do tại sao chúng ta có sự thay đổi cao như vậy.

Sự biến đổi và kích thước của dữ liệu rất quan trọng trong phân tích phân cụm vì các phép đo khoảng cách của hầu hết các thuật toán phân cụm đều nhạy cảm với cường độ dữ liệu. Sự khác biệt về kích thước có thể thay đổi kết quả phân cụm bằng cách làm cho một điểm có vẻ gần hoặc xa hơn so với điểm khác so với thực tế, làm biến dạng nhóm dữ liệu thực tế.

Cho đến nay, chúng tôi đã thấy hình dạng của dữ liệu của chúng tôi, một số phân phối của nó và thống kê mô tả. Với gấu trúc, chúng tôi cũng có thể liệt kê các loại dữ liệu của mình và xem tất cả 200 hàng của chúng tôi được lấp đầy hoặc có một số giá trị

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
31:
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
7

Kết quả này trong:

customer_data.shape
0

Ở đây, chúng ta có thể thấy rằng không có giá trị

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
31 trong dữ liệu và chúng ta chỉ có một cột phân loại -
customer_data.columns
9. Ở giai đoạn này, điều quan trọng là chúng ta có trong tâm trí những tính năng có vẻ thú vị khi được thêm vào mô hình phân cụm. Nếu chúng tôi muốn thêm cột thể loại vào mô hình của chúng tôi, chúng tôi sẽ cần chuyển đổi các giá trị của nó từ phân loại sang số.

Hãy xem làm thế nào

customer_data.columns
9 được lấp đầy bằng cách xem nhanh ở 5 giá trị đầu tiên của dữ liệu của chúng tôi:
customer_data.shape
1

Kết quả này trong:

customer_data.shape
2

Ở đây, chúng ta có thể thấy rằng không có giá trị

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
31 trong dữ liệu và chúng ta chỉ có một cột phân loại -
customer_data.columns
9. Ở giai đoạn này, điều quan trọng là chúng ta có trong tâm trí những tính năng có vẻ thú vị khi được thêm vào mô hình phân cụm. Nếu chúng tôi muốn thêm cột thể loại vào mô hình của chúng tôi, chúng tôi sẽ cần chuyển đổi các giá trị của nó từ phân loại sang số.

Có vẻ như nó chỉ có các danh mục

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
35 và
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
36. Chúng ta có thể chắc chắn về điều đó bằng cách xem xét các giá trị độc đáo của nó với
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
37:
customer_data.shape
4
customer_data.shape
3
customer_data.shape
5

Điều này xác nhận giả định của chúng tôi:

customer_data.shape
6

Cho đến nay, chúng tôi biết rằng chúng tôi chỉ có hai thể loại, nếu chúng tôi dự định sử dụng tính năng này trên mô hình của chúng tôi,

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
36 có thể được chuyển đổi thành
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9 và
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
35 sang
customer_data['Spending Score (1-100)'].hist()
5. Nó cũng quan trọng để kiểm tra tỷ lệ giữa các thể loại, để xem chúng có cân bằng không. Chúng ta có thể làm điều đó với phương thức
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
72 và đối số của nó
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
73 để hiển thị tỷ lệ phần trăm giữa
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
36 và
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
35:

Cho đến bây giờ, tất cả các tính năng nhưng

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0, đã được khám phá ngắn gọn. Trong những gì mối quan tâm
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0, thường rất thú vị khi chia nó thành các thùng để có thể phân chia khách hàng dựa trên các nhóm tuổi của họ. Nếu chúng ta làm điều đó, chúng ta sẽ cần chuyển đổi các loại tuổi thành một số trước khi thêm chúng vào mô hình của chúng ta. Bằng cách đó, thay vì sử dụng danh mục 15-20 năm, chúng tôi sẽ đếm số lượng khách hàng trong danh mục
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
78 và đó sẽ là một số trong một cột mới có tên là
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
78.

Lời khuyên: Trong hướng dẫn này, chúng tôi chỉ trình bày phân tích dữ liệu khám phá ngắn gọn. Nhưng bạn có thể đi xa hơn và bạn nên đi xa hơn. Bạn có thể thấy nếu có sự khác biệt về thu nhập và sự khác biệt về điểm dựa trên thể loại và tuổi tác. Điều này không chỉ làm phong phú các phân tích mà còn dẫn đến kết quả mô hình tốt hơn. Để đi sâu hơn vào phân tích dữ liệu khám phá, hãy xem chương EDA trong dự án "dự đoán giá nhà thực hành - học máy trong dự án hướng dẫn Python". In this guide, we present only brief exploratory data analysis. But you can go further and you should go further. You can see if there are income differences and scoring differences based on genre and age. This not only enriches the analysis but leads to better model results. To go deeper into Exploratory Data Analysis, check out the EDA chapter in the "Hands-On House Price Prediction - Machine Learning in Python" Guided Project. In this guide, we present only brief exploratory data analysis. But you can go further and you should go further. You can see if there are income differences and scoring differences based on genre and age. This not only enriches the analysis but leads to better model results. To go deeper into Exploratory Data Analysis, check out the EDA chapter in the "Hands-On House Price Prediction - Machine Learning in Python" Guided Project.

Sau khi phỏng đoán về những gì có thể được thực hiện với cả hai cột phân loại - hoặc phân loại là -

customer_data.columns
9 và
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0, hãy áp dụng những gì đã được thảo luận.

Mã hóa các biến và kỹ thuật tính năng

Hãy bắt đầu bằng cách chia

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0 thành các nhóm thay đổi trong 10, để chúng tôi có 20-30, 30-40, 40-50, v.v. Vì khách hàng trẻ nhất của chúng tôi là 15, chúng tôi có thể bắt đầu ở tuổi 15 và kết thúc ở 70, đó là tuổi của khách hàng lâu đời nhất trong dữ liệu. Bắt đầu từ 15, và kết thúc ở 70, chúng tôi sẽ có các khoảng 15-20, 20-30, 30-40, 40-50, 50-60 và 60-70.

Để nhóm hoặc các giá trị

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0 vào các khoảng này, chúng ta có thể sử dụng phương thức PANDAS
customer_data.shape
04 để cắt chúng thành các thùng và sau đó gán các thùng cho cột ____105 mới:
customer_data.shape
7

Kết quả này trong:

customer_data.shape
8

Lưu ý rằng khi nhìn vào các giá trị cột, cũng có một dòng chỉ định chúng tôi có 6 loại và hiển thị tất cả các khoảng dữ liệu bị hỏng. Bằng cách này, chúng tôi đã phân loại dữ liệu số trước đây của chúng tôi và tạo một tính năng

customer_data.shape
05 mới.

Và chúng tôi có bao nhiêu khách hàng trong mỗi danh mục? Chúng ta có thể nhanh chóng biết rằng bằng cách nhóm cột và đếm các giá trị với

customer_data.shape
07 và
customer_data.shape
08:
customer_data.shape
9

Kết quả này trong:

(200, 5)
0

Lưu ý rằng khi nhìn vào các giá trị cột, cũng có một dòng chỉ định chúng tôi có 6 loại và hiển thị tất cả các khoảng dữ liệu bị hỏng. Bằng cách này, chúng tôi đã phân loại dữ liệu số trước đây của chúng tôi và tạo một tính năng

customer_data.shape
05 mới.

Và chúng tôi có bao nhiêu khách hàng trong mỗi danh mục? Chúng ta có thể nhanh chóng biết rằng bằng cách nhóm cột và đếm các giá trị với

customer_data.shape
07 và
customer_data.shape
08:
customer_data.shape
9

customer_data.shape
07 và
customer_data.shape
08:
(200, 5)
1

Thật dễ dàng để nhận ra rằng hầu hết khách hàng đều từ 30 đến 40 tuổi, tiếp theo là khách hàng từ 20 đến 30 đến sau đó là khách hàng từ 40 đến 50. Đây cũng là thông tin tốt cho bộ phận tiếp thị.

Hiện tại, chúng tôi có hai biến phân loại,

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0 và
customer_data.columns
9, mà chúng tôi cần chuyển đổi thành các số để có thể sử dụng trong mô hình của chúng tôi. Có nhiều cách khác nhau để tạo ra sự biến đổi đó- chúng tôi sẽ sử dụng phương pháp Pandas
customer_data.shape
11 tạo ra một cột mới cho mỗi khoảng và thể loại và sau đó điền vào các giá trị của nó bằng 0 và 1- loại hoạt động này được gọi là mã hóa một lần nóng. Hãy xem nó trông như thế nào:

Điều này sẽ cung cấp cho chúng tôi một cái nhìn trước của bảng kết quả:

customer_data.columns
9 được chia thành các cột -
customer_data.shape
13 và
customer_data.shape
14. Khi khách hàng là nữ,
customer_data.shape
13 bằng
customer_data['Spending Score (1-100)'].hist()
5 và khi khách hàng là nam, nó tương đương với
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9.

Ngoài ra, cột

customer_data.shape
0105 được chia thành 6 cột, một cột cho mỗi khoảng, chẳng hạn như
customer_data.shape
19,
customer_data.shape
20, v.v. Theo cách tương tự như
customer_data.columns
9, khi khách hàng 18 tuổi, giá trị
customer_data.shape
19 là
customer_data['Spending Score (1-100)'].hist()
5 và giá trị của tất cả các cột khác là
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9.
: If you have a dataset in which the number of one-hot encoded columns exceeds the number of rows, it is best to employ another encoding method to avoid data dimensionality issues.

Ưu điểm của mã hóa một lần là sự đơn giản trong việc thể hiện các giá trị cột, thật đơn giản để hiểu những gì đang xảy ra - trong khi nhược điểm là chúng tôi hiện đã tạo thêm 8 cột, để tổng hợp với các cột chúng tôi đã có.

CẢNH BÁO: Nếu bạn có một bộ dữ liệu trong đó số lượng các cột được mã hóa một lần nóng vượt quá số lượng hàng, tốt nhất là sử dụng một phương thức mã hóa khác để tránh các vấn đề về kích thước dữ liệu.

Mã hóa một lần cũng thêm 0 vào dữ liệu của chúng tôi, làm cho nó trở nên thưa thớt hơn, đây có thể là một vấn đề đối với một số thuật toán nhạy cảm với sự thưa thớt dữ liệu.

Đối với nhu cầu phân cụm của chúng tôi, mã hóa một lần nóng dường như hoạt động. Nhưng chúng ta có thể vẽ dữ liệu để xem liệu thực sự có các nhóm khác biệt để chúng ta phân cụm.

Cấu trúc cơ bản và giảm kích thước

Vì vẽ 10 chiều là một chút không thể, chúng tôi sẽ chọn cách tiếp cận thứ hai - chúng tôi sẽ vẽ đồ thị các tính năng ban đầu của chúng tôi. Chúng tôi có thể chọn hai trong số chúng cho phân tích phân cụm của chúng tôi. Một cách chúng ta có thể thấy tất cả các cặp dữ liệu của mình được kết hợp là với Seaborn

customer_data.shape
26:
(200, 5)
2

Hiển thị nào:

Trong nháy mắt, chúng ta có thể phát hiện ra các biểu đồ phân tán dường như có các nhóm dữ liệu. Một điều có vẻ thú vị là phân tán kết hợp

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
1 và
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
2. Lưu ý rằng không có sự tách biệt rõ ràng giữa các biểu đồ phân tán biến khác. Nhiều nhất, chúng ta có thể nói rằng có hai nồng độ điểm riêng biệt trong phân tán
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
2 so với
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0.

Cả hai biểu đồ phân tán bao gồm

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
1 và
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
2 về cơ bản là giống nhau. Chúng ta có thể thấy nó hai lần vì trục X và Y đã được trao đổi. Bằng cách xem xét bất kỳ ai trong số họ, chúng ta có thể thấy những gì dường như là năm nhóm khác nhau. Chúng ta hãy vẽ chỉ hai tính năng đó với Seaborn
customer_data.shape
33 để xem xét kỹ hơn:
(200, 5)
3

Bằng cách nhìn gần hơn, chúng tôi chắc chắn có thể phân biệt 5 nhóm dữ liệu khác nhau. Có vẻ như khách hàng của chúng tôi có thể được phân cụm dựa trên số tiền họ kiếm được trong một năm và họ chi bao nhiêu. Đây là một điểm liên quan khác trong phân tích của chúng tôi. Điều quan trọng là chúng tôi chỉ xem xét hai tính năng để nhóm khách hàng của chúng tôi. Bất kỳ thông tin nào khác chúng tôi có về chúng không phải vào phương trình. Điều này mang lại ý nghĩa phân tích - nếu chúng ta biết khách hàng kiếm được bao nhiêu và chi tiêu, chúng ta có thể dễ dàng tìm thấy những điểm tương đồng mà chúng ta cần.

Thật tuyệt! Cho đến nay, chúng tôi đã có hai biến để xây dựng mô hình của chúng tôi. Bên cạnh những gì điều này đại diện, nó cũng làm cho mô hình đơn giản hơn, không thể giải thích được hơn.

Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!

Lưu ý: Khoa học dữ liệu thường ủng hộ cách tiếp cận đơn giản nhất có thể. Không chỉ bởi vì nó dễ dàng hơn để giải thích cho doanh nghiệp, mà còn bởi vì nó trực tiếp hơn - với 2 tính năng và một mô hình có thể giải thích được, rõ ràng mô hình đang làm gì và nó hoạt động như thế nào. Data Science usually favors as simple approaches as possible. Not only because it is easier to explain for the business, but also because it is more direct - with 2 features and an explainable model, it is clear what the model is doing and how it is working.

Vẽ dữ liệu sau khi sử dụng PCA

Có vẻ như cách tiếp cận thứ hai của chúng tôi có lẽ là tốt nhất, nhưng chúng ta cũng hãy xem cách tiếp cận thứ ba của chúng tôi. Nó có thể hữu ích khi chúng ta không thể vẽ dữ liệu vì nó có quá nhiều kích thước hoặc khi không có nồng độ dữ liệu hoặc phân tách rõ ràng theo nhóm. Khi các tình huống đó xảy ra, nên thử giảm kích thước dữ liệu bằng một phương pháp gọi là phân tích thành phần chính (PCA).

Lưu ý: Hầu hết mọi người sử dụng PCA để giảm kích thước trước khi trực quan hóa. Có các phương pháp khác giúp trực quan hóa dữ liệu trước khi phân cụm, chẳng hạn như phân cụm không gian dựa trên mật độ của các ứng dụng với nhiễu (DBSCAN) và bản đồ tự tổ chức (SOM). Cả hai đều là thuật toán phân cụm, nhưng cũng có thể được sử dụng để trực quan hóa dữ liệu. Vì phân tích phân cụm không có tiêu chuẩn vàng, điều quan trọng là so sánh các hình ảnh trực quan khác nhau và các thuật toán khác nhau. Most people use PCA for dimensionality reduction before visualization. There are other methods that help in data visualization prior to clustering, such as Density-Based Spatial Clustering of Applications with Noise (DBSCAN) and Self-Organizing Maps (SOM) clustering. Both are clustering algorithms, but can also be used for data visualization. Since clustering analysis has no golden standard, it is important to compare different visualizations and different algorithms.

PCA sẽ giảm kích thước dữ liệu của chúng tôi trong khi cố gắng lưu giữ càng nhiều thông tin càng tốt. Trước tiên chúng ta hãy có ý tưởng về cách PCA hoạt động và sau đó chúng ta có thể chọn số lượng kích thước dữ liệu chúng ta sẽ giảm dữ liệu của mình.

Đối với mỗi cặp tính năng, PCA thấy nếu các giá trị lớn hơn của một biến tương ứng với các giá trị lớn hơn của biến khác và nó hoạt động tương tự cho các giá trị nhỏ hơn. Vì vậy, về cơ bản nó tính toán mức độ các giá trị tính năng thay đổi với nhau - chúng tôi gọi đó là hiệp phương sai của chúng. Những kết quả đó sau đó được tổ chức thành một ma trận, có được một ma trận hiệp phương sai.

Sau khi nhận được ma trận hiệp phương sai, PCA cố gắng tìm kết hợp tuyến tính các tính năng giải thích tốt nhất cho nó - nó phù hợp với các mô hình tuyến tính cho đến khi nó xác định được giải thích lượng phương sai tối đa.maximum amount of variance.maximum amount of variance.

Lưu ý: PCA là một chuyển đổi tuyến tính và tính tuyến tính rất nhạy cảm với quy mô của dữ liệu. Do đó, PCA hoạt động tốt nhất khi tất cả các giá trị dữ liệu ở cùng một tỷ lệ. Điều này có thể được thực hiện bằng cách trừ cột có nghĩa là từ các giá trị của nó và chia kết quả cho độ lệch chuẩn của nó. Đó được gọi là tiêu chuẩn hóa dữ liệu. Trước khi sử dụng PCA, hãy đảm bảo dữ liệu được chia tỷ lệ! Nếu bạn không chắc chắn làm thế nào, hãy đọc "Dữ liệu tỷ lệ tính năng của chúng tôi với Scikit-LEARN cho việc học máy ở Python"!: PCA is a linear transformation, and linearity is sensitive to the scale of data. Therefore, PCA works best when all data values are on the same scale. This can be done by subtracting the column mean from its values and dividing the result by its standard deviation. That is called data standardization. Prior to using PCA, make sure the data is scaled! If you're not sure how, read our "Feature Scaling Data with Scikit-Learn for Machine Learning in Python"!: PCA is a linear transformation, and linearity is sensitive to the scale of data. Therefore, PCA works best when all data values are on the same scale. This can be done by subtracting the column mean from its values and dividing the result by its standard deviation. That is called data standardization. Prior to using PCA, make sure the data is scaled! If you're not sure how, read our "Feature Scaling Data with Scikit-Learn for Machine Learning in Python"!

Với dòng tốt nhất (kết hợp tuyến tính) được tìm thấy, PCA có được hướng của các trục của nó, được gọi là hàm riêng và các hệ số tuyến tính của nó, các giá trị riêng. Sự kết hợp của các hàm riêng và giá trị riêng - hoặc các hướng và hệ số trục - là các thành phần chính của PCA. Và đó là khi chúng ta có thể chọn số lượng kích thước của mình dựa trên phương sai được giải thích của từng tính năng, bằng cách hiểu các thành phần chính nào chúng ta muốn giữ hoặc loại bỏ dựa trên mức độ phương sai mà chúng giải thích.

Sau khi có được các thành phần chính, PCA sử dụng các hàm riêng để tạo thành một vectơ các tính năng định hướng lại dữ liệu từ các trục gốc đến các phần được biểu thị bởi các thành phần chính - đó là cách giảm kích thước dữ liệu.

Lưu ý: Một chi tiết quan trọng cần xem xét ở đây là, do tính chất tuyến tính của nó, PCA sẽ tập trung hầu hết các phương sai được giải thích trong các thành phần chính đầu tiên. Vì vậy, khi nhìn vào phương sai được giải thích, thông thường hai thành phần đầu tiên của chúng tôi sẽ đủ. Nhưng điều đó có thể gây hiểu lầm trong một số trường hợp - vì vậy hãy cố gắng tiếp tục so sánh các ô và thuật toán khác nhau khi phân cụm để xem chúng có giữ kết quả tương tự không. One important detail to take into consideration here is that, due to its linear nature, PCA will concentrate most of the explained variance in the first principal components. So, when looking at the explained variance, usually our first two components will suffice. But that might be misleading in some cases - so try to keep comparing different plots and algorithms when clustering to see if they hold similar results. One important detail to take into consideration here is that, due to its linear nature, PCA will concentrate most of the explained variance in the first principal components. So, when looking at the explained variance, usually our first two components will suffice. But that might be misleading in some cases - so try to keep comparing different plots and algorithms when clustering to see if they hold similar results.

Trước khi áp dụng PCA, chúng tôi cần chọn giữa cột

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0 hoặc các cột
customer_data.shape
05 trong dữ liệu được mã hóa một lần nóng trước đây của chúng tôi. Vì cả hai cột đại diện cho cùng một thông tin, giới thiệu nó hai lần ảnh hưởng đến phương sai dữ liệu của chúng tôi. Nếu cột
customer_data.shape
05 được chọn, chỉ cần xóa cột
Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
0 bằng phương pháp Pandas
customer_data.shape
38 và gán lại nó thành biến
customer_data.shape
39:
(200, 5)
4

Bây giờ dữ liệu của chúng tôi có 10 cột, có nghĩa là chúng tôi có thể có được một thành phần chính theo cột và chọn số lượng chúng tôi sẽ sử dụng bằng cách đo số lượng giới thiệu một chiều mới giải thích nhiều hơn về phương sai dữ liệu của chúng tôi.

Hãy làm điều đó với Scikit-Learn

customer_data.shape
40. Chúng tôi sẽ tính toán phương sai được giải thích của từng chiều, được đưa ra bởi
customer_data.shape
41, và sau đó nhìn vào tổng tích lũy của chúng với
customer_data.shape
42:
(200, 5)
5

Phương sai được giải thích tích lũy của chúng tôi là:

(200, 5)
6

Chúng ta có thể thấy rằng kích thước đầu tiên giải thích 50% dữ liệu và khi kết hợp với chiều thứ hai, họ giải thích 99% phần trăm. Điều này có nghĩa là 2 chiều đầu tiên đã giải thích 99% dữ liệu của chúng tôi. Vì vậy, chúng tôi có thể áp dụng PCA với 2 thành phần, lấy các thành phần chính của chúng tôi và vẽ chúng:

(200, 5)
7

Biểu đồ dữ liệu sau PCA rất giống với biểu đồ chỉ sử dụng hai cột của dữ liệu không có PCA. Lưu ý rằng các điểm hình thành các nhóm gần hơn và tập trung hơn một chút sau PCA so với trước đây.

Hình dung cấu trúc phân cấp với dendrograms

Cho đến nay, chúng tôi đã khám phá dữ liệu, các cột phân loại được mã hóa một lần nóng, đã quyết định các cột nào phù hợp để phân cụm và giảm kích thước dữ liệu. Các sơ đồ cho thấy chúng tôi có 5 cụm trong dữ liệu của mình, nhưng cũng có một cách khác để hình dung mối quan hệ giữa các điểm của chúng tôi và giúp xác định số lượng cụm - bằng cách tạo một dendrogram (thường được viết sai là dendogram). Dendro có nghĩa là cây bằng tiếng Latin.dendrogram (commonly misspelled as dendogram). Dendro means tree in Latin.dendrogram (commonly misspelled as dendogram). Dendro means tree in Latin.

Dendrogram là kết quả của việc liên kết các điểm trong bộ dữ liệu. Nó là một đại diện trực quan của quá trình phân cụm phân cấp. Và quá trình phân cụm phân cấp hoạt động như thế nào? Chà ... nó phụ thuộc - có lẽ là một câu trả lời bạn đã nghe rất nhiều trong khoa học dữ liệu.

Hiểu phân cụm phân cấp

Khi thuật toán phân cụm phân cấp (HCA) bắt đầu liên kết các điểm và tìm cụm, trước tiên nó có thể chia các điểm thành 2 nhóm lớn, và sau đó chia mỗi nhóm trong hai nhóm nhỏ hơn, có tổng cộng 4 nhóm và cách tiếp cận từ trên xuống.Hierarchical Clustering Algorithm (HCA) starts to link the points and find clusters, it can first split points into 2 large groups, and then split each of those two groups into smaller 2 groups, having 4 groups in total, which is the divisive and top-down approach.Hierarchical Clustering Algorithm (HCA) starts to link the points and find clusters, it can first split points into 2 large groups, and then split each of those two groups into smaller 2 groups, having 4 groups in total, which is the divisive and top-down approach.

Ngoài ra, nó có thể làm ngược lại - nó có thể nhìn vào tất cả các điểm dữ liệu, tìm thấy 2 điểm gần nhau hơn, liên kết chúng và sau đó tìm các điểm khác là những điểm gần nhất với các điểm được liên kết đó và tiếp tục xây dựng 2 nhóm từ dưới lên. Đó là cách tiếp cận kết tụ mà chúng tôi sẽ phát triển.bottom-up. Which is the agglomerative approach we will develop.bottom-up. Which is the agglomerative approach we will develop.

Các bước để thực hiện phân cụm phân cấp kết tụ

Để làm cho phương pháp kết tụ thậm chí còn rõ ràng, có các bước của thuật toán phân cụm phân cấp (AHC) kết tụ: thuật toán:

  1. Khi bắt đầu, coi từng điểm dữ liệu là một cụm. Do đó, số lượng cụm khi bắt đầu sẽ là K - trong khi K là một số nguyên đại diện cho số lượng điểm dữ liệu.
  2. Tạo thành một cụm bằng cách tham gia hai điểm dữ liệu gần nhất dẫn đến các cụm K-1.
  3. Tạo thành nhiều cụm bằng cách tham gia hai cụm gần nhất dẫn đến các cụm K-2.
  4. Lặp lại ba bước trên cho đến khi một cụm lớn được hình thành.

Lưu ý: Để đơn giản hóa, chúng tôi đang nói "hai điểm dữ liệu gần nhất" trong các bước 2 và 3. Nhưng có nhiều cách liên kết hơn như chúng tôi sẽ thấy một chút.: For simplification, we are saying "two closest" data points in steps 2 and 3. But there are more ways of linking points as we will see in a bit.: For simplification, we are saying "two closest" data points in steps 2 and 3. But there are more ways of linking points as we will see in a bit.

Nếu bạn đảo ngược các bước của thuật toán ACH, đi từ 4 đến 1 - đó sẽ là các bước để *phân cụm phân cấp gây chia rẽ (DHC) *.

Lưu ý rằng HCA có thể gây chia rẽ và từ trên xuống, hoặc kết tụ và từ dưới lên. Cách tiếp cận DHC từ trên xuống hoạt động tốt nhất khi bạn có ít hơn, nhưng các cụm lớn hơn, do đó nó tốn kém hơn về mặt tính toán. Mặt khác, cách tiếp cận AHC từ dưới lên được trang bị khi bạn có nhiều cụm nhỏ hơn. Nó là tính toán đơn giản hơn, được sử dụng nhiều hơn và có sẵn hơn.

Lưu ý: Hoặc từ trên xuống hoặc từ dưới lên, biểu diễn dendrogram của quá trình phân cụm sẽ luôn bắt đầu với một phân chia thành hai và kết thúc với mỗi điểm riêng lẻ được phân biệt đối xử, một khi cấu trúc cơ bản của nó là của một cây nhị phân. Either top-down or bottom-up, the dendrogram representation of the clustering process will always start with a division in two and end up with each individual point discriminated, once its underlying structure is of a binary tree. Either top-down or bottom-up, the dendrogram representation of the clustering process will always start with a division in two and end up with each individual point discriminated, once its underlying structure is of a binary tree.

Chúng ta hãy vẽ bản đồ dữ liệu khách hàng của chúng tôi để trực quan hóa các mối quan hệ phân cấp của dữ liệu. Lần này, chúng tôi sẽ sử dụng thư viện

customer_data.shape
43 để tạo dendrogram cho bộ dữ liệu của chúng tôi:
(200, 5)
8

Đầu ra của tập lệnh trông như thế này:

Trong tập lệnh ở trên, chúng tôi đã tạo các cụm và trình phân phối theo điểm của chúng tôi, xác định cách các điểm của chúng tôi sẽ liên kết (bằng cách áp dụng phương pháp

customer_data.shape
44) và cách đo khoảng cách giữa các điểm (bằng cách sử dụng số liệu
customer_data.shape
45).

Với cốt truyện của dendrogram, các quá trình được mô tả của DHC và AHC có thể được hình dung. Để hình dung cách tiếp cận từ trên xuống bắt đầu từ đầu dendrogram và đi xuống, và làm điều ngược lại, bắt đầu xuống và di chuyển lên trên để hình dung cách tiếp cận từ dưới lên.

Phương pháp liên kết

Có nhiều phương pháp liên kết khác, bằng cách hiểu thêm về cách chúng hoạt động, bạn sẽ có thể chọn phương pháp thích hợp cho nhu cầu của bạn. Bên cạnh đó, mỗi người trong số họ sẽ mang lại kết quả khác nhau khi áp dụng. Không có một quy tắc cố định trong phân tích phân cụm, nếu có thể, nghiên cứu bản chất của vấn đề để xem cái nào phù hợp nhất, kiểm tra các phương pháp khác nhau và kiểm tra kết quả.

Một số phương thức liên kết là:

  • Liên kết đơn: còn được gọi là hàng xóm gần nhất (NN). Khoảng cách giữa các cụm được xác định bởi khoảng cách giữa các thành viên gần nhất của họ.: also referred to as Nearest Neighbor (NN). The distance between clusters is defined by the distance between their closest members.
  • Liên kết hoàn chỉnh: còn được gọi là người hàng xóm xa nhất (FN), thuật toán điểm xa nhất hoặc thuật toán Voor Hees. Khoảng cách giữa các cụm được xác định bởi khoảng cách giữa các thành viên xa nhất của họ. Phương pháp này là tính toán đắt tiền.: also referred to as Furthest Neighbor (FN), Farthest Point Algorithm, or Voor Hees Algorithm. The distance between clusters is defined by the distance between their furthest members. This method is computationally expensive.
  • Liên kết trung bình: còn được gọi là UPGMA (phương pháp nhóm cặp không trọng số với giá trị trung bình số học). Tỷ lệ phần trăm của số điểm của mỗi cụm được tính toán theo số lượng điểm của hai cụm nếu chúng được hợp nhất.: also known as UPGMA (Unweighted Pair Group Method with Arithmetic mean). The percentage of the number of points of each cluster is calculated with respect to the number of points of the two clusters if they were merged.
  • Liên kết có trọng số: còn được gọi là WPGMA (phương pháp nhóm cặp có trọng số với giá trị trung bình số học). Các điểm riêng lẻ của hai cụm đóng góp vào khoảng cách tổng hợp giữa một cụm nhỏ hơn và lớn hơn.: also known as WPGMA (Weighted Pair Group Method with Arithmetic mean). The individual points of the two clusters contribute to the aggregated distance between a smaller and a bigger cluster.
  • Liên kết Centroid: còn được gọi là UPGMC (phương pháp nhóm cặp không trọng số sử dụng Centroids). Một điểm được xác định bởi giá trị trung bình của tất cả các điểm (centroid) được tính toán cho mỗi cụm và khoảng cách giữa các cụm là khoảng cách giữa các tâm tương ứng của chúng.: also referred to as UPGMC (Unweighted Pair Group Method using Centroids). A point defined by the mean of all points (centroid) is calculated for each cluster and the distance between clusters is the distance between their respective centroids.
  • Liên kết Ward: còn được gọi là MissQ (tăng tối thiểu của các bình phương). Nó chỉ định khoảng cách giữa hai cụm, tính tổng lỗi hình vuông (ESS) và liên tiếp chọn các cụm tiếp theo dựa trên ESS nhỏ hơn. Phương pháp của Ward tìm cách giảm thiểu sự gia tăng của ESS ở mỗi bước. Do đó, giảm thiểu lỗi.: Also known as MISSQ (Minimal Increase of Sum-of-Squares). It specifies the distance between two clusters, computes the sum of squares error (ESS), and successively chooses the next clusters based on the smaller ESS. Ward's Method seeks to minimize the increase of ESS at each step. Therefore, minimizing error.

Số liệu khoảng cách

Bên cạnh liên kết, chúng tôi cũng có thể chỉ định một số số liệu khoảng cách được sử dụng nhiều nhất:

  • Euclide: còn được gọi là khoảng cách Pythagore hoặc đường thẳng. Nó tính khoảng cách giữa hai điểm trong không gian, bằng cách đo chiều dài của một đoạn đường đi qua giữa chúng. Nó sử dụng Định lý Pythagore và giá trị khoảng cách là kết quả (c) của phương trình:: also referred to as Pythagorean or straight-line distance. It computes the distance between two points in space, by measuring the length of a line segment that passes between them. It uses the Pythagorean theorem and the distance value is the result (c) of the equation:

$$ C^2 = A^2 + B^2 $$
c^2 = a^2 + b^2
$$

  • Manhattan: còn được gọi là khối thành phố, khoảng cách taxi. Đó là tổng của sự khác biệt tuyệt đối giữa các biện pháp trong tất cả các kích thước của hai điểm. Nếu các kích thước đó là hai, nó tương tự như phải làm một bên phải và sau đó phải khi đi bộ một khối.: also called City-block, Taxicab distance. It is the sum of absolute differences between the measures in all dimensions of two points. If those dimensions are two, it is analogous to making a right and then left when walking one block.
  • Minkowski: Đó là một khái quát của cả khoảng cách Euclide và Manhattan. Đó là một cách để tính toán khoảng cách dựa trên sự khác biệt tuyệt đối với thứ tự của số liệu Minkowski p. Mặc dù nó được xác định cho bất kỳ p> 0, nhưng nó hiếm khi được sử dụng cho các giá trị khác với 1, 2 và (vô hạn). Khoảng cách Minkowski giống như khoảng cách Manhattan khi p = 1 và giống như khoảng cách Euclide khi p = 2.: it is a generalization of both Euclidean and Manhattan distances. It is a way to calculate distances based on the absolute differences to the order of the Minkowski metric p. Although it is defined for any p > 0, it is rarely used for values other than 1, 2, and ∞ (infinite). Minkowski distance is the same as Manhattan distance when p=1, and the same as Euclidean distance when p=2.

$$ d \ left (x, y \ right) = \ left (\ sum_ {i = 1}^n | x_i-y_i |^p \ right)^{\ frac {1} {p}} $$ $$ D\left(X,Y\right) = \left(\sum_{i=1}^n |x_i-y_i|^p\right)^{\frac{1}{p}} $$
D\left(X,Y\right) = \left(\sum_{i=1}^n |x_i-y_i|^p\right)^{\frac{1}{p}}
$$

  • Chebyshev: Còn được gọi là khoảng cách bàn cờ. Đó là trường hợp cực đoan của khoảng cách Minkowski. Khi chúng ta sử dụng vô cực làm giá trị của tham số p (p = ∞), chúng ta sẽ kết thúc với một số liệu xác định khoảng cách là sự khác biệt tuyệt đối tối đa giữa các tọa độ.: also known as Chessboard distance. It is the extreme case of Minkowski distance. When we use infinity as the value of the parameter p (p = ∞), we end up with a metric that defines distance as the maximal absolute difference between coordinates.: also known as Chessboard distance. It is the extreme case of Minkowski distance. When we use infinity as the value of the parameter p (p = ∞), we end up with a metric that defines distance as the maximal absolute difference between coordinates.
  • COSINE: Đó là khoảng cách cosin góc giữa hai chuỗi điểm hoặc vectơ. Độ tương tự cosin là sản phẩm chấm của các vectơ chia cho sản phẩm của độ dài của chúng.: it is the angular cosine distance between two sequences of points, or vectors. The cosine similarity is the dot product of the vectors divided by the product of their lengths.: it is the angular cosine distance between two sequences of points, or vectors. The cosine similarity is the dot product of the vectors divided by the product of their lengths.
  • Jaccard: Đo lường sự giống nhau giữa các bộ điểm hữu hạn. Nó được định nghĩa là tổng số điểm (cardinality) trong các điểm chung trong mỗi bộ (giao lộ), chia cho tổng số điểm (cardinality) của tổng số điểm của cả hai tập hợp (liên minh).: measures the similarity between finite sets of points. It is defined as the total number of points (cardinality) in the common points in each set (intersection), divided by the total number of points (cardinality) of the total points of both sets (union).: measures the similarity between finite sets of points. It is defined as the total number of points (cardinality) in the common points in each set (intersection), divided by the total number of points (cardinality) of the total points of both sets (union).
  • Jensen-Shannon: Dựa trên sự khác biệt của Kullback-Leibler. Nó xem xét các phân phối xác suất của điểm và đo lường sự giống nhau giữa các phân phối đó. Đó là một phương pháp phổ biến của lý thuyết xác suất và thống kê.: based on the Kullback-Leibler divergence. It considers the points' probability distributions and measures the similarity between those distributions. It is a popular method of probability theory and statistics.: based on the Kullback-Leibler divergence. It considers the points' probability distributions and measures the similarity between those distributions. It is a popular method of probability theory and statistics.

Chúng tôi đã chọn Ward và Euclide cho dendrogram vì chúng là phương pháp và số liệu được sử dụng phổ biến nhất. Họ thường đưa ra kết quả tốt vì các điểm liên kết Ward dựa trên việc giảm thiểu các lỗi và Euclide hoạt động tốt ở các kích thước thấp hơn.

Trong ví dụ này, chúng tôi đang làm việc với hai tính năng (cột) của dữ liệu tiếp thị và 200 quan sát hoặc hàng. Vì số lượng quan sát lớn hơn số lượng tính năng (200> 2), chúng tôi đang làm việc trong một không gian chiều thấp.

Khi số lượng các tính năng (f) lớn hơn số lượng quan sát (n) - chủ yếu được viết là f >> n, điều đó có nghĩa là chúng ta có một không gian chiều cao.

Nếu chúng ta bao gồm nhiều thuộc tính hơn, vì vậy chúng ta có hơn 200 tính năng, khoảng cách Euclide có thể không hoạt động tốt, vì nó sẽ gặp khó khăn trong việc đo tất cả các khoảng cách nhỏ trong một không gian rất lớn chỉ lớn hơn. Nói cách khác, cách tiếp cận khoảng cách Euclide gặp khó khăn khi làm việc với độ thưa thớt dữ liệu. Đây là một vấn đề được gọi là lời nguyền của chiều. Các giá trị khoảng cách sẽ trở nên quá nhỏ, như thể chúng trở nên "pha loãng" trong không gian rộng hơn, bị biến dạng cho đến khi chúng trở thành 0.sparsity. This is an issue that is called the curse of dimensionality. The distance values would get so small, as if they became "diluted" in the larger space, distorted until they became 0.sparsity. This is an issue that is called the curse of dimensionality. The distance values would get so small, as if they became "diluted" in the larger space, distorted until they became 0.

Lưu ý: Nếu bạn từng gặp phải một bộ dữ liệu với f >> p, có lẽ bạn sẽ sử dụng các số liệu khoảng cách khác, chẳng hạn như khoảng cách Mahalanobis. Ngoài ra, bạn cũng có thể giảm kích thước bộ dữ liệu, bằng cách sử dụng phân tích thành phần chính (PCA). Vấn đề này là thường xuyên, đặc biệt là khi phân cụm dữ liệu giải trình tự sinh học. If you ever encounter a dataset with f >> p, you will probably use other distance metrics, such as the Mahalanobis distance. Alternatively, you can also reduce the dataset dimensions, by using Principal Component Analysis (PCA). This problem is frequent especially when clustering biological sequencing data. If you ever encounter a dataset with f >> p, you will probably use other distance metrics, such as the Mahalanobis distance. Alternatively, you can also reduce the dataset dimensions, by using Principal Component Analysis (PCA). This problem is frequent especially when clustering biological sequencing data.

Chúng tôi đã thảo luận về các số liệu, liên kết và cách mỗi người trong số chúng có thể tác động đến kết quả của chúng tôi. Bây giờ chúng ta hãy tiếp tục phân tích dendrogram và xem làm thế nào nó có thể cung cấp cho chúng ta một dấu hiệu về số lượng cụm trong bộ dữ liệu của chúng ta.

Tìm một số cụm thú vị trong dendrogram giống như tìm không gian ngang lớn nhất không có bất kỳ đường thẳng đứng nào (không gian có các đường thẳng đứng dài nhất). Điều này có nghĩa là có nhiều sự tách biệt hơn giữa các cụm.

Chúng ta có thể vẽ một đường ngang đi qua khoảng cách dài nhất đó:

(200, 5)
9

Sau khi định vị đường ngang, chúng tôi đếm số lần các đường thẳng đứng của chúng tôi đã bị vượt qua bởi nó - trong ví dụ này, 5 lần. Vì vậy, 5 có vẻ là một dấu hiệu tốt về số lượng cụm có khoảng cách nhiều nhất giữa chúng.

Lưu ý: Dendrogram chỉ nên được coi là một tham chiếu khi được sử dụng để chọn số lượng cụm. Nó có thể dễ dàng có được số đó tắt và bị ảnh hưởng hoàn toàn bởi loại liên kết và số liệu khoảng cách. Khi tiến hành phân tích cụm chuyên sâu, nên xem xét các dendrogram với các liên kết và số liệu khác nhau và xem xét kết quả được tạo ra với ba dòng đầu tiên trong đó các cụm có khoảng cách nhất giữa chúng.: The dendrogram should be considered only as a reference when used to choose the number of clusters. It can easily get that number way off and is completely influenced by the type of linkage and distance metrics. When conducting an in-depth cluster analysis, it is advised to look at dendrograms with different linkages and metrics and to look at the results generated with the first three lines in which the clusters have the most distance between them.: The dendrogram should be considered only as a reference when used to choose the number of clusters. It can easily get that number way off and is completely influenced by the type of linkage and distance metrics. When conducting an in-depth cluster analysis, it is advised to look at dendrograms with different linkages and metrics and to look at the results generated with the first three lines in which the clusters have the most distance between them.

Thực hiện phân cụm phân cấp kết tụ

Sử dụng dữ liệu gốc

Cho đến nay, chúng tôi đã tính toán số lượng cụm được đề xuất cho bộ dữ liệu của chúng tôi chứng thực bằng phân tích ban đầu và phân tích PCA của chúng tôi. Bây giờ chúng ta có thể tạo mô hình phân cụm phân cấp kết tụ của mình bằng cách sử dụng Scikit-Learn

customer_data.shape
46 và tìm hiểu các nhãn của các điểm tiếp thị với
customer_data.shape
47:
customer_data.columns
0

Kết quả này trong:

customer_data.columns
1

Chúng tôi đã điều tra rất nhiều để đi đến điểm này. Và những nhãn này có nghĩa là gì? Ở đây, chúng tôi có từng điểm dữ liệu của chúng tôi được gắn nhãn là một nhóm từ 0 đến 4:

customer_data.columns
2

Đây là dữ liệu phân cụm cuối cùng của chúng tôi. Bạn có thể thấy các điểm dữ liệu được mã hóa màu dưới dạng năm cụm.

Các điểm dữ liệu ở phía dưới bên phải (nhãn:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')
9, điểm dữ liệu màu tím) thuộc về khách hàng có mức lương cao nhưng chi tiêu thấp. Đây là những khách hàng tiêu tiền của họ một cách cẩn thận.

Tương tự, các khách hàng ở trên cùng bên phải (nhãn:

customer_data.shape
49, điểm dữ liệu xanh), là những khách hàng có mức lương cao và chi tiêu cao. Đây là loại khách hàng mà các công ty nhắm đến.

Các khách hàng ở giữa (nhãn:

customer_data['Spending Score (1-100)'].hist()
5, điểm dữ liệu màu xanh) là những khách hàng có thu nhập trung bình và chi tiêu trung bình. Số lượng khách hàng cao nhất thuộc loại này. Các công ty cũng có thể nhắm mục tiêu những khách hàng này với thực tế là họ có số lượng rất lớn.

Các khách hàng ở phía dưới bên trái (nhãn:

customer_data.shape
51, màu đỏ) là những khách hàng có mức lương thấp và chi tiêu thấp, họ có thể bị thu hút bằng cách cung cấp các chương trình khuyến mãi.

Và cuối cùng, các khách hàng ở phía trên bên trái (nhãn:

customer_data.shape
52, điểm dữ liệu màu cam) là những khách hàng có thu nhập cao và chi tiêu thấp, được nhắm mục tiêu lý tưởng bởi tiếp thị.

Sử dụng kết quả từ PCA

Nếu chúng ta ở trong một kịch bản khác, trong đó chúng ta phải giảm tính chiều của dữ liệu. Chúng tôi cũng có thể dễ dàng vẽ các kết quả PCA được phân cụm. Có thể được thực hiện bằng cách tạo một mô hình phân cụm kết tụ khác và lấy nhãn dữ liệu cho từng thành phần chính:

customer_data.columns
3

Quan sát rằng cả hai kết quả đều rất giống nhau. Sự khác biệt chính là kết quả đầu tiên với dữ liệu gốc dễ giải thích hơn nhiều. Rõ ràng để thấy rằng khách hàng có thể được chia thành năm nhóm theo thu nhập và điểm chi tiêu hàng năm của họ. Trong khi, theo cách tiếp cận PCA, chúng tôi đang xem xét tất cả các tính năng của mình, nhiều như chúng tôi có thể xem xét phương sai được giải thích bởi mỗi người trong số họ, đây là một khái niệm khó nắm bắt hơn, đặc biệt là khi báo cáo với một bộ phận tiếp thị.

Ít nhất chúng ta phải chuyển đổi dữ liệu của chúng ta, càng tốt.

Nếu bạn có một bộ dữ liệu rất lớn và phức tạp, trong đó bạn phải thực hiện giảm kích thước trước khi phân cụm - hãy cố gắng phân tích mối quan hệ tuyến tính giữa mỗi tính năng và phần dư của chúng để sao lưu việc sử dụng PCA và tăng cường khả năng khám phá của quy trình. Bằng cách tạo một mô hình tuyến tính cho mỗi cặp tính năng, bạn sẽ có thể hiểu cách các tính năng tương tác.

Nếu khối lượng dữ liệu quá lớn, không thể vẽ các cặp tính năng, chọn một mẫu dữ liệu của bạn, cân bằng và gần với phân phối bình thường càng tốt và thực hiện phân tích trên mẫu trước, hiểu nó, tinh chỉnh Nó - và áp dụng nó sau này cho toàn bộ tập dữ liệu.

Bạn luôn có thể chọn các kỹ thuật trực quan phân cụm khác nhau theo tính chất của dữ liệu của bạn (tuyến tính, phi tuyến tính) và kết hợp hoặc kiểm tra tất cả chúng nếu cần thiết.

Đi xa hơn-Dự án đầu cuối cầm tay

Bản chất tò mò của bạn khiến bạn muốn đi xa hơn? Chúng tôi khuyên bạn nên kiểm tra dự án có hướng dẫn của chúng tôi: "Dự đoán giá nhà - học máy ở Python".Guided Project: "Hands-On House Price Prediction - Machine Learning in Python".Guided Project: "Hands-On House Price Prediction - Machine Learning in Python".

Hướng dẫn hierarchical in python - phân cấp trong python

Trong dự án có hướng dẫn này-bạn sẽ học cách xây dựng các mô hình học máy truyền thống mạnh mẽ cũng như các mô hình học tập sâu, sử dụng học tập và học tập của người đi học để dự đoán giá nhà từ một túi các mô hình Scikit-Learn và Keras.

Sử dụng Keras, API học tập sâu được xây dựng trên Tensorflow, chúng tôi sẽ thử nghiệm các kiến ​​trúc, xây dựng một nhóm các mô hình xếp chồng lên nhau và đào tạo một mạng lưới thần kinh siêu nhân (mô hình cấp 1) để tìm ra giá của một ngôi nhà.

Học sâu là tuyệt vời - nhưng trước khi dùng đến nó, bạn nên cố gắng giải quyết vấn đề bằng các kỹ thuật đơn giản hơn, chẳng hạn như với các thuật toán học tập nông. Hiệu suất cơ bản của chúng tôi sẽ dựa trên thuật toán hồi quy rừng ngẫu nhiên. Ngoài ra - chúng tôi sẽ khám phá việc tạo ra các mô hình thông qua Scikit -Learn thông qua các kỹ thuật như đóng gói và bỏ phiếu.

Đây là một dự án từ đầu đến cuối và giống như tất cả các dự án học máy, chúng tôi sẽ bắt đầu-với phân tích dữ liệu khám phá, tiếp theo là tiền xử lý dữ liệu và cuối cùng xây dựng các mô hình học tập nông và sâu để phù hợp với dữ liệu chúng tôi đã khám phá và đã làm sạch trước đây.

Sự kết luận

Kỹ thuật phân cụm có thể rất tiện dụng khi nói đến dữ liệu không nhãn. Vì hầu hết các dữ liệu trong thế giới thực không được gắn nhãn và chú thích dữ liệu có chi phí cao hơn, nên các kỹ thuật phân cụm có thể được sử dụng để dán nhãn dữ liệu không nhãn.

Trong hướng dẫn này, chúng tôi đã mang đến một vấn đề khoa học dữ liệu thực sự, vì các kỹ thuật phân cụm phần lớn được sử dụng trong phân tích tiếp thị (và cả trong phân tích sinh học). Chúng tôi cũng đã giải thích nhiều bước điều tra để đi đến một mô hình phân cụm phân cấp tốt và cách đọc dendrogram và đặt câu hỏi liệu PCA có phải là một bước cần thiết không. Mục tiêu chính của chúng tôi là một số cạm bẫy và các kịch bản khác nhau trong đó chúng ta có thể tìm thấy phân cụm phân cấp được đề cập.

Happy Clustering!