返回目錄
A
資料驅動決策:從數據探索到模型部署 - 第 6 章
第六章 非監督式模型與降維
發布於 2026-02-27 16:56
# 第六章 非監督式模型與降維
非監督式學習是資料科學中最具「開放性」的分支之一,因為它不需要先前標籤,允許我們從無結構的數據中自動發掘潛在模式。這一章將以實務導向的方式,從基礎聚類、降維到視覺化,並結合真實案例說明如何在商業環境中落地。
---
## 6.1 K‑means 聚類
K‑means 是最常見、最直觀的聚類演算法,適用於大多數「球狀」分佈的資料。其核心思路是
1. 隨機選擇 K 個初始中心
2. 將每筆資料指派給最近的中心
3. 更新中心為其所屬點的均值
4. 重複 2–3 步,直到中心變動小於阈值或達到最大迭代次數。
python
from sklearn.cluster import KMeans
import numpy as np
# 假設 df 是預先標準化好的特徵矩陣
kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, max_iter=300, random_state=42)
clusters = kmeans.fit_predict(df)
# 將聚類結果加回 DataFrame
import pandas as pd
result = pd.DataFrame(df, columns=[f'x{i}' for i in range(df.shape[1])])
result['cluster'] = clusters
### 評估指標
- **輪廓係數 (Silhouette Score)**:衡量聚類內部緊密度與不同簇之間分離度。
- **Calinski‑Harabasz**:簇內平方和與簇間平方和的比例。
- **Davies‑Bouldin**:簇內平均距離與最相近簇之距離之比。
python
from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score
print('Silhouette:', silhouette_score(df, clusters))
print('Calinski-Harabasz:', calinski_harabasz_score(df, clusters))
print('Davies-Bouldin:', davies_bouldin_score(df, clusters))
> **小技巧**:在高維空間中,K‑means 可能表現不佳。此時可先使用 PCA 或 t‑SNE 降維,然後再進行聚類。
## 6.2 層次聚類(Hierarchical Clustering)
層次聚類不需要預先指定簇數,透過 **凝聚式**(自底向上)或 **分裂式**(自頂向下)方法構建樹狀圖(dendrogram)。
python
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
Z = linkage(df, method='ward') # Ward 最小化簇內變異
plt.figure(figsize=(10, 4))
dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12.)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index or (Cluster Size)')
plt.ylabel('Distance')
plt.show()
# 根據臨界距離切割
clusters_hier = fcluster(Z, t=1.5, criterion='distance')
層次聚類的優點在於能直觀顯示聚類結構,對於探索資料的多層次屬性特別有用。缺點是計算量隨樣本數平方成長,對極大資料集不太適合。
## 6.3 主成分分析(PCA)
PCA 是最早、最廣泛使用的線性降維方法,目標是保留最大方差。其核心公式為
1. 標準化特徵 → 均值為 0、標準差為 1
2. 計算協方差矩陣
3. 進行特徵分解 → 取得特徵值(variance)與特徵向量(loadings)
4. 取前 k 個特徵向量作為投影基底
python
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 保留 95% 變異
df_pca = pca.fit_transform(df)
print('選取主成分數:', pca.n_components_)
### 可視化
python
import seaborn as sns
sns.scatterplot(x=df_pca[:,0], y=df_pca[:,1], hue=clusters)
plt.title('PCA 投影 - 前兩個主成分')
plt.show()
## 6.4 t‑SNE(t‑Distributed Stochastic Neighbor Embedding)
t‑SNE 是非線性降維技術,適合於保留局部結構並可視化高維資料。它透過把高維距離轉換為低維相似度,並最小化兩者之間的 Kullback‑Leibler 散度。
python
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, n_iter=1000, random_state=42)
df_tsne = tsne.fit_transform(df)
sns.scatterplot(x=df_tsne[:,0], y=df_tsne[:,1], hue=clusters)
plt.title('t‑SNE 可視化')
plt.show()
> **提示**:t‑SNE 對於資料規模較大(>10k)時會非常慢,建議先使用 PCA 對維度做預降,再進行 t‑SNE。
## 6.5 UMAP(Uniform Manifold Approximation and Projection)
UMAP 是新興的降維方法,比 t‑SNE 在速度與可擴展性上更優。它以流形學與拓撲學為基礎,構建鄰域圖並保留全局結構。
python
import umap
umap_model = umap.UMAP(n_neighbors=15, min_dist=0.1, n_components=2, random_state=42)
df_umap = umap_model.fit_transform(df)
sns.scatterplot(x=df_umap[:,0], y=df_umap[:,1], hue=clusters)
plt.title('UMAP 降維')
plt.show()
## 6.6 真實案例:客戶細分與行銷策略
- **資料來源**:某線上零售商的客戶交易紀錄(年齡、性別、購買頻次、平均訂單價、瀏覽時間、產品類別等)。
- **目標**:依客戶消費行為自動分群,協助行銷團隊設計個性化促銷。
### 步驟
1. **資料前處理**:缺失值補齊、標準化。
2. **特徵選取**:挑選與購買行為高度相關的變數。
3. **降維**:先用 PCA 保留 90% 變異,再用 UMAP 轉為 2D,以利視覺化。
4. **聚類**:使用 K‑means 與 DBSCAN(密度基礎)交叉驗證,最終選擇 K‑means 的 5 個聚類。
5. **群組洞察**:利用 SHAP 與統計描述,發現
- **聚類 1**:高頻頻客,偏好實體商品,平均訂單價高。
- **聚類 2**:低頻客,偏好電子產品,瀏覽時間長。
6. **行銷落地**:針對聚類 1 推出會員積分提升,聚類 2 推出限時折扣與電子產品推薦。
### 評估
- **商業指標**:促銷後三個月 GMV 增長 12%(全體 4%)。
- **客戶反饋**:滿意度調查提升 9%(聚類 1 12%,聚類 2 6%)。
## 6.7 小結
1. **聚類**:K‑means 速度快、易實作;層次聚類能洞察多層次結構;DBSCAN 能處理雜訊與不規則形狀。
2. **降維**:PCA 適合線性結構;t‑SNE、UMAP 適合可視化與保留非線性關係,UMAP 在速度與可擴展性上更佳。
3. **實務應用**:非監督式方法往往作為資料探索與前處理的基石,協助決策者快速理解數據結構,並以此為基礎設計針對性策略。
4. **未來展望**:隨著大資料與雲端運算的普及,結合 **增量聚類** 與 **分散式降維**(如 H2O、Spark MLlib)將成為業界趨勢。
---
本章的核心在於「從無標籤到可操作」。透過聚類與降維,我們不僅能視覺化複雜資料,還能發掘隱含價值,進而為商業決策提供堅實的數據支持。下一章將進入 **模型部署** 的實務操作,讓我們把這些洞察轉化為可持續的服務。祝你在資料科學的旅程中不斷探索、實踐、創新!