在前幾篇教程中,我們探討了 sklearn 的基礎、高級功能,異常檢測與降維,時間序列分析與自然語言處理,模型部署與優化,以及集成學習與模型解釋。本篇教程將專注于無監督學習和聚類分析,這在探索性數據分析和數據挖掘中非常重要。
無監督學習
無監督學習是一種無需預先標記數據的學習方法,主要用于發現數據的內在結構和模式。常見的無監督學習任務包括聚類分析、降維和異常檢測。
聚類分析
聚類分析是將數據集劃分為若干組(簇)的過程,使得同一簇中的數據點彼此相似,而不同簇中的數據點差異較大。常見的聚類算法包括 k 均值(K-Means)、層次聚類(Hierarchical Clustering)和 DBSCAN。
k 均值(K-Means)
k 均值是一種迭代聚類算法,通過最小化簇內數據點到簇中心的距離來劃分數據。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 加載數據集
iris = load_iris()
X = iris.data# 訓練 k 均值模型
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)# 聚類結果
labels = kmeans.labels_
centers = kmeans.cluster_centers_# 可視化聚類結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='X', s=200)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('K-Means Clustering')
plt.show()
層次聚類(Hierarchical Clustering)
層次聚類通過構建樹狀結構(樹狀圖)來進行聚類,常用的方法包括凝聚聚類(Agglomerative Clustering)。
from sklearn.cluster import AgglomerativeClustering
import scipy.cluster.hierarchy as sch# 訓練層次聚類模型
hc = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
labels = hc.fit_predict(X)# 繪制樹狀圖
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title('Dendrogram')
plt.xlabel('Samples')
plt.ylabel('Euclidean distances')
plt.show()# 可視化聚類結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Hierarchical Clustering')
plt.show()
DBSCAN
DBSCAN 是一種基于密度的聚類算法,適用于發現任意形狀的簇。
from sklearn.cluster import DBSCAN# 訓練 DBSCAN 模型
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)# 可視化聚類結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('DBSCAN Clustering')
plt.show()
降維
降維是通過減少數據的特征數量來簡化數據,同時保留數據的重要結構和模式。常見的降維方法包括主成分分析(PCA)和 t-SNE。
主成分分析(PCA)
PCA 通過線性變換將數據投影到低維空間,同時盡量保留數據的方差。
from sklearn.decomposition import PCA# 訓練 PCA 模型
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)# 可視化降維結果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=iris.target, cmap='viridis')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA of IRIS dataset')
plt.show()
t-SNE
t-SNE 是一種非線性降維方法,適用于高維數據的可視化。
from sklearn.manifold import TSNE# 訓練 t-SNE 模型
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)# 可視化降維結果
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=iris.target, cmap='viridis')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.title('t-SNE of IRIS dataset')
plt.show()
異常檢測
異常檢測是識別數據集中異常或不正常數據點的過程。常用的異常檢測方法包括孤立森林(Isolation Forest)和局部異常因子(Local Outlier Factor, LOF)。
孤立森林(Isolation Forest)
孤立森林通過構建隨機樹來隔離數據點,計算其異常分數。
from sklearn.ensemble import IsolationForest# 訓練孤立森林模型
iso_forest = IsolationForest(contamination=0.1, random_state=42)
labels = iso_forest.fit_predict(X)# 可視化異常檢測結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Isolation Forest Anomaly Detection')
plt.show()
局部異常因子(LOF)
LOF 通過計算局部密度偏差來識別異常點。
from sklearn.neighbors import LocalOutlierFactor# 訓練 LOF 模型
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
labels = lof.fit_predict(X)# 可視化異常檢測結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Local Outlier Factor Anomaly Detection')
plt.show()
綜合示例項目:無監督學習與聚類分析
步驟1:數據預處理與聚類分析
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt# 生成數據集
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 標準化數據
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# K-Means 聚類
kmeans = KMeans(n_clusters=4)
kmeans_labels = kmeans.fit_predict(X_scaled)# DBSCAN 聚類
dbscan = DBSCAN(eps=0.3, min_samples=10)
dbscan_labels = dbscan.fit_predict(X_scaled)# PCA 降維
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)# 可視化 K-Means 聚類結果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans_labels, cmap='viridis')
plt.title('K-Means Clustering')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()# 可視化 DBSCAN 聚類結果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=dbscan_labels, cmap='viridis')
plt.title('DBSCAN Clustering')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
步驟2:異常檢測
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor# 孤立森林異常檢測
iso_forest = IsolationForest(contamination=0.1, random_state=42)
iso_forest_labels = iso_forest.fit_predict(X_scaled)# 局部異常因子異常檢測
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
lof_labels = lof.fit_predict(X_scaled)# 可視化孤立森林異常檢測結果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=iso_forest_labels, cmap='viridis')
plt.title('Isolation Forest Anomaly Detection')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()# 可視化局部異常因子異常檢測結果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=lof_labels, cmap='viridis')
plt.title('Local Outlier Factor Anomaly Detection')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
總結
通過本篇專題教程,我們學習了 sklearn 中的無監督學習和聚類分析。無監督學習包括聚類分析、降維和異常檢測。聚類分析方法包括 k 均值、層次聚類和