歡迎來到Scikit-learn教學系列的第六篇文章!在前幾篇中,我們學習了監督學習的分類與回歸模型,以及模型選擇與超參數調優。這一篇將進入非監督學習的領域,聚焦於聚類與降維。我們將介紹非監督學習的基本概念、使用Scikit-learn實現常見的聚類與降維演算法,並通過實作範例展示如何應用這些技術分析無標籤資料。準備好探索資料的隱藏結構吧!
非監督學習概述
非監督學習(Unsupervised Learning)處理沒有標籤的資料,目標是從資料中發現模式或結構。常見應用包括:- 聚類(Clustering):將資料分為相似群組,例如客戶分群或圖像分割。
- 降維(Dimensionality Reduction):將高維資料壓縮到低維,保留重要資訊,方便視覺化或加速模型訓練。
Scikit-learn提供了簡單且強大的工具來實現這些任務。
聚類演算法
聚類演算法將資料點分為若干群組,同一群組內的資料點相似。以下是兩種常見演算法:
- K均值聚類(K-Means Clustering):將資料分為K個群組,通過最小化群內方差進行分群。
- DBSCAN(Density-Based Spatial Clustering of Applications with Noise):基於資料點的密度進行分群,能識別異常值。
降維技術
降維技術將高維資料映射到低維空間,常用於視覺化或減少計算成本。以下是兩種常見方法:
- 主成分分析(Principal Component Analysis, PCA):通過線性變換找到資料的主要變異方向。
- t-SNE(t-Distributed Stochastic Neighbor Embedding):非線性降維,特別適合視覺化高維資料。
實作:對客戶資料進行聚類與降維
我們將使用一個模擬的客戶資料集(或Scikit-learn的make_blobs
生成合成資料),進行K均值聚類與PCA降維,然後視覺化結果。假設資料包含客戶的消費行為特徵(例如年消費金額、購買頻率等)。
程式碼範例
以下程式碼展示如何對合成資料進行聚類與降維:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
# 生成合成資料
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=1.0, random_state=42)
# 資料前處理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# K均值聚類
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans_labels = kmeans.fit_predict(X_scaled)
kmeans_silhouette = silhouette_score(X_scaled, kmeans_labels)
# DBSCAN聚類
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X_scaled)
dbscan_silhouette = silhouette_score(X_scaled, dbscan_labels) if len(np.unique(dbscan_labels)) > 1 else None
# PCA降維
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 視覺化聚類結果
plt.figure(figsize=(12, 5))
# K均值結果
plt.subplot(1, 2, 1)
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=kmeans_labels, palette='deep', s=100)
plt.title(f'K-Means Clustering (Silhouette: {kmeans_silhouette:.4f})')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
# DBSCAN結果
plt.subplot(1, 2, 2)
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=dbscan_labels, palette='deep', s=100)
plt.title(f'DBSCAN Clustering (Silhouette: {dbscan_silhouette if dbscan_silhouette else "N/A"})')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.tight_layout()
plt.savefig('clustering_results.png')
plt.show()
# 視覺化PCA解釋方差
explained_variance_ratio = pca.explained_variance_ratio_
plt.figure(figsize=(6, 4))
sns.barplot(x=['PC1', 'PC2'], y=explained_variance_ratio)
plt.title('Explained Variance Ratio by PCA Components')
plt.ylabel('Variance Ratio')
plt.savefig('pca_variance.png')
plt.show()
# 評估K均值不同群數
silhouette_scores = []
k_range = range(2, 7)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42)
labels = kmeans.fit_predict(X_scaled)
score = silhouette_score(X_scaled, labels)
silhouette_scores.append(score)
plt.figure(figsize=(6, 4))
sns.lineplot(x=k_range, y=silhouette_scores, marker='o')
plt.title('Silhouette Score vs Number of Clusters')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Score')
plt.savefig('kmeans_silhouette.png')
plt.show()
程式碼解釋
- 資料生成與前處理: 使用make_blobs生成300筆合成資料,包含4個群組。 使用StandardScaler標準化特徵,確保聚類與降維的穩定性。
- 聚類: 應用K均值(n_clusters=4)與DBSCAN(eps=0.5, min_samples=5)進行分群。 使用silhouette_score評估聚類品質(值越接近1越好)。
- 降維: 使用PCA將資料降至2維,方便視覺化。 繪製散點圖,展示K均值與DBSCAN的聚類結果。
- 視覺化: 繪製PCA解釋方差圖,展示每個主成分的貢獻。 繪製不同K值下的Silhouette分數,幫助選擇最佳群數。
運行程式碼後,你會看到K均值與DBSCAN的聚類結果、PCA降維後的散點圖、解釋方差圖,以及Silhouette分數曲線。



練習:對Iris資料集應用聚類與降維
請完成以下練習:
- 使用Scikit-learn的load_iris()載入Iris資料集(忽略標籤,僅使用特徵)。
- 對特徵進行標準化。
- 使用K均值聚類(n_clusters=3)與DBSCAN(自選eps與min_samples)進行分群。
- 使用PCA將資料降至2維,繪製K均值與DBSCAN的聚類結果散點圖,保存為iris_clustering.png。
- 計算K均值與DBSCAN的Silhouette分數,並在圖表標題中顯示。
- 繪製PCA解釋方差圖,保存為iris_pca_variance.png。
以下是起點程式碼:
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import seaborn as sns
# 載入Iris資料集
iris = load_iris()
X = iris.data
# 你的程式碼從這裡開始...

總結
恭喜你掌握了非監督學習的基礎!本篇文章介紹了聚類(K均值、DBSCAN)與降維(PCA)的概念與應用,並通過合成資料展示了完整流程。你現在能夠發現資料的隱藏結構並視覺化結果。
在下一篇文章中,我們將學習進階應用 - 管道與模型組合,探索如何簡化工作流程並提升模型表現。請完成練習,並在留言區分享你的Iris資料集聚類圖!
資源與進階學習
- Scikit-learn非監督學習文件:https://scikit-learn.org/stable/unsupervised_learning.html
- 練習平台:Kaggle(https://www.kaggle.com/competitions)