Menu
CoddyTech

Chuẩn hóa thang đo trước khi phân cụm

Thuộc phần Học không giám sát trong hành trình Machine Learning của Coddy. Bài học 9 trên 51.

K-means phân nhóm dựa trên khoảng cách, nên đơn vị lớn nhất sẽ chi phối. Dữ liệu mèo ở trạm cứu hộ gồm cân nặng tính bằng gam và tuổi tính bằng năm: chênh lệch 500 g lấn át chênh lệch 10 năm.

Hai biểu đồ về 120 con mèo ở trạm cứu hộ, trục ngang là tuổi tính bằng năm và trục dọc là cân nặng tính bằng gam. Bên trái, phân cụm dữ liệu thô: mèo trưởng thành được chia nhóm theo cân nặng, trộn lẫn mèo trẻ và mèo già. Bên phải, phân cụm sau khi chuẩn hóa: mèo con, mèo trưởng thành và mèo già được chia nhóm theo tuổi

Trước tiên, hãy chuẩn hóa như với k-NN để mỗi đặc trưng có trọng số như nhau:

X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X_scaled)

make_pipeline(StandardScaler(), KMeans(...)) thực hiện cả hai việc trong một mô hình. Sau đó, đọc từng nhóm theo đơn vị ban đầu: tính trung bình các hàng ban đầu của nhóm đó, X[km.labels_ == c].mean(axis=0).

challenge icon

Thử thách

Dễ

Ứng dụng tìm căn hộ cho thuê phân nhóm 100 tin đăng theo giá thuê và khoảng cách đến ga. Mã khởi đầu phân cụm các cột dữ liệu thô, khiến tất cả các nhóm đều cách ga khoảng 3 km: giá tính bằng đô la lấn át khoảng cách tính bằng ki-lô-mét.

  1. Chuẩn hóa hai cột bằng StandardScaler.
  2. Thay vào đó, hãy phân cụm các hàng đã chuẩn hóa. Giữ nguyên phần báo cáo: phần này đọc từng nhóm theo đơn vị thực tế.

Với một thành phố khác:

38 flats: $1820 a month, 0.9 km out
33 flats: $1130 a month, 4.2 km out
29 flats: $2760 a month, 1.5 km out

Tự làm thử

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Mỗi căn hộ một hàng: tiền thuê hằng tháng tính bằng đô la, khoảng cách đến ga tính bằng km
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# Đoạn này phân cụm các cột chưa chuẩn hóa: bạn hãy sửa lại
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# In ra thông tin từng nhóm bằng đơn vị thực tế, nhóm lớn nhất trước
sizes = pd.Series(km.labels_).value_counts()
for c in sizes.index:
    group = flats[km.labels_ == c]
    print(f"{sizes[c]} flats: ${round(group['rent'].mean())} a month, {group['station_km'].mean():.1f} km out")
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Học không giám sát

Tự luyện tập: Trình biên dịch Python online