返回文章列表

混合資料分群挑戰與最佳實踐

本文探討混合資料(數值與類別變數)分群的挑戰,比較 K-means、PCA 和階層式分群搭配 Gower's 距離的適用性。文章以貸款違約資料為例,使用 R 和 Python 程式碼示範如何處理類別變數、標準化數值變數,以及如何解讀分群結果。

機器學習 資料分析

在資料科學領域,混合資料分群是一項常見的挑戰。由於資料型別差異,直接套用 K-means 或 PCA 等演算法容易產生偏差。Gower’s 距離能有效計算混合資料的相似度,搭配階層式分群更能揭示資料的階層結構。實際應用中,需考量資料集大小、變數型別和分析目標。對於小型資料集,階層式分群結合 Gower’s 距離是較佳選擇;而大型資料集則可能需要其他方法,例如將類別變數轉換為數值變數後再進行 K-means 或 PCA。標準化數值變數能避免特定變數主導分群結果,例如貸款金額和年收入。此外,處理類別變數時,One-Hot Encoding 常用於轉換,但需注意可能造成的維度增加和稀疏性問題。在 Python 中,使用 StandardScaler 可標準化數值變數,get_dummies 可進行 One-Hot Encoding。R 語言則可使用 scale 函式和 model.matrix 進行類別似操作。選擇合適的距離度量和分群演算法,並根據資料特性進行預處理,是混合資料分群成功的關鍵。

模型基礎分群法(Model-Based Clustering)

模型基礎分群法是一種統計方法,假設資料來自不同的資料生成過程,具有不同的機率分佈。與 K-means 和階層式分群法不同,模型基礎分群法不需要事先指定分群數量,而是透過貝氏資訊準則(BIC)來選擇最佳的分群數量和模型。

模型基礎分群法的運作原理

模型基礎分群法使用多元常態分佈來擬合資料,並透過最大概似估計法來估計模型引數。BIC 用於評估模型的擬合度和複雜度之間的平衡。BIC 的計算公式包含兩個部分:模型的對數概似值和模型的引數數量。BIC 的值越小,表示模型的擬合度越好,且引數數量越少。

在 R 語言中,mclust 套件提供了模型基礎分群法的實作,可以自動選擇最佳的分群數量和模型。mclust 套件會擬合 14 種不同的模型,並選擇具有最大 BIC 值的模型。

Python 中的實作

在 Python 中,可以使用 GaussianMixture 類別來實作模型基礎分群法。GaussianMixture 類別提供了多種協方差矩陣的引數設定,可以用於擬合不同的模型。

from sklearn.mixture import GaussianMixture
import pandas as pd
import matplotlib.pyplot as plt

# 載入資料
df = pd.read_csv('stock_data.csv')

# 定義模型引數
covariance_types = ['full', 'tied', 'diag', 'spherical']
results = []

# 迴圈擬合不同模型
for n_components in range(1, 9):
    for covariance_type in covariance_types:
        mclust = GaussianMixture(n_components=n_components, warm_start=True,
                                 covariance_type=covariance_type)
        mclust.fit(df)
        results.append({
            'bic': mclust.bic(df),
            'n_components': n_components,
            'covariance_type': covariance_type,
        })

# 將結果轉換為 DataFrame
results = pd.DataFrame(results)

# 繪製 BIC 值曲線圖
colors = ['C0', 'C1', 'C2', 'C3']
styles = ['C0-', 'C1:', 'C0-.', 'C1--']
fig, ax = plt.subplots(figsize=(4, 4))
for i, covariance_type in enumerate(covariance_types):
    subset = results.loc[results.covariance_type == covariance_type, :]
    subset.plot(x='n_components', y='bic', ax=ax, label=covariance_type,
                kind='line', style=styles[i])

程式碼解析:

  1. GaussianMixture類別:用於建立模型基礎分群法的模型。
  2. warm_start=True:表示重複使用上一次的擬合結果,加速後續的計算。
  3. covariance_type引數:定義協方差矩陣的型別,包括 fulltieddiagspherical
  4. bic方法:計算模型的 BIC 值。
  5. results DataFrame:儲存不同模型的 BIC 值和引數設定。

模型基礎分群法的優缺點

優點:

  • 可以自動選擇最佳的分群數量和模型。
  • 可以擬合不同型別的協方差矩陣。

缺點:

  • 需要假設資料符合特定的分佈(通常是多元常態分佈)。
  • 計算複雜度較高,不適合大規模資料。

變數縮放與類別變數在分群中的重要性

在進行分群分析(如K-means)或其他無監督學習方法時,變數的縮放(Scaling)至關重要。如果資料未經縮放,那些具有較大值的變數將主導分群結果,而具有較小值的變數則可能被忽略。這是因為大多數距離度量方法(如歐幾裡得距離)對變數的尺度敏感。

類別變數的處理

類別變數(Categorical Variables)在某些分群方法中可能會造成問題。與K-Nearest Neighbors類別似,無序的因子變數通常需要透過**獨熱編碼(One Hot Encoding)**轉換為一組二元(0/1)變數。然而,這些二元變數不僅可能與其他資料具有不同的尺度,而且由於它們僅有兩個值(0和1),這可能會對PCA和K-means等技術造成問題。

縮放變數

具有非常不同尺度和單位的變數需要在應用分群方法之前適當地進行標準化(Normalization)正規化。例如,考慮一組貸款違約資料,如果不進行標準化,直接應用K-means分群:

defaults <- loan_data[loan_data$outcome=='default',]
df <- defaults[, c('loan_amnt', 'annual_inc', 'revol_bal', 'open_acc', 'dti', 'revol_util')]
km <- kmeans(df, centers=4, nstart=10)
centers <- data.frame(size=km$size, km$centers)
round(centers, digits=2)

內容解密:

  1. 選取違約貸款資料並提取相關變數。
  2. 使用K-means進行分群,設定4個群集。
  3. 輸出每個群集的大小和中心點。

在Python中,可以使用以下程式碼實作相同的功能:

defaults = loan_data.loc[loan_data['outcome'] == 'default',]
columns = ['loan_amnt', 'annual_inc', 'revol_bal', 'open_acc', 'dti', 'revol_util']
df = defaults[columns]
kmeans = KMeans(n_clusters=4, random_state=1).fit(df)
counts = Counter(kmeans.labels_)
centers = pd.DataFrame(kmeans.cluster_centers_, columns=columns)
centers['size'] = [counts[i] for i in range(4)]
centers

內容解密:

  1. 篩選違約貸款資料並選擇相關欄位。
  2. 使用KMeans進行分群,設定4個簇。
  3. 輸出每個簇的中心點和大小。

結果顯示,annual_increvol_bal這兩個變數主導了分群結果,且不同群集的大小差異很大。

標準化資料

透過將變數轉換為**Z分數(z-scores)**來進行標準化是一種常見的方法。這涉及到減去均值並除以標準差:

$$ z = \frac{x - \bar{x}}{s} $$

在R中,可以使用scale()函式對資料進行標準化:

df0 <- scale(df)
km0 <- kmeans(df0, centers=4, nstart=10)
centers0 <- scale(km0$centers, center=FALSE, scale=1 / attr(df0, 'scaled:scale'))
centers0 <- scale(centers0, center=-attr(df0, 'scaled:center'), scale=FALSE)
centers0 <- data.frame(size=km0$size, centers0)
round(centers0, digits=2)

內容解密:

  1. 對資料進行標準化處理。
  2. 對標準化後的資料應用K-means分群。
  3. 將群集中心點轉換回原始尺度。

在Python中,可以使用StandardScaler來實作標準化:

scaler = preprocessing.StandardScaler()
df0 = scaler.fit_transform(df * 1.0)
kmeans = KMeans(n_clusters=4, random_state=1).fit(df0)
counts = Counter(kmeans.labels_)
centers = pd.DataFrame(scaler.inverse_transform(kmeans.cluster_centers_), columns=columns)
centers['size'] = [counts[i] for i in range(4)]
centers

內容解密:

  1. 使用StandardScaler對資料進行標準化。
  2. 對標準化後的資料進行KMeans分群。
  3. 將群集中心點轉換回原始尺度並輸出結果。

標準化後的結果顯示,群集大小更加均衡,且不再被annual_increvol_bal主導,從而揭示了資料中更有趣的結構。

主導變數與PCA

即使變數具有相同的尺度並且準確反映相對重要性,有時仍需要對變數進行縮放。特別是在進行主成分分析(PCA)時,變數的尺度會影響結果。如果某些變數的方差遠大於其他變數,它們將主導主成分。

示例:加入Google和Amazon後的PCA分析

考慮將Google(GOOGL)和Amazon(AMZN)加入到股票價格分析中。在R中,可以這樣實作:

syms <- c('GOOGL', 'AMZN', 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM', 'SLB', 'COP', 'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST')
top_sp1 <- sp500_px[row.names(sp500_px) >= '2005-01-01', syms]
sp_pca1 <- princomp(top_sp1)
screeplot(sp_pca1)

內容解密:

  1. 選取包含GOOGL和AMZN在內的多個股票程式碼。
  2. 對這些股票的價格資料進行PCA分析。
  3. 繪製碎石圖以觀察主成分的方差。

在Python中,可以使用以下程式碼:

syms = ['GOOGL', 'AMZN', 'AAPL', 'MSFT', 'CSCO', 'INTC', 'CVX', 'XOM', 'SLB', 'COP', 'JPM', 'WFC', 'USB', 'AXP', 'WMT', 'TGT', 'HD', 'COST']
top_sp1 = sp500_px.loc[sp500_px.index >= '2005-01-01', syms]
sp_pca1 = PCA()
sp_pca1.fit(top_sp1)
explained_variance = pd.DataFrame(sp_pca1.explained_variance_)
ax = explained_variance.head(10).plot.bar(legend=False, figsize=(4, 4))
ax.set_xlabel('Component')

內容解密:

  1. 篩選包含GOOGL和AMZN的股票價格資料。
  2. 使用PCA進行降維。
  3. 繪製前10個主成分的解釋方差圖。

結果顯示,前兩個主成分的方差遠大於其他成分,這表明GOOGL和AMZN對資料的變異性有著顯著的影響。

加權與縮放的重要性

無論是在分群還是在PCA分析中,適當地縮放或加權變數都是至關重要的。這不僅能避免某些變數主導結果,還能揭示資料中更豐富的結構和模式。因此,在進行無監督學習時,應當根據具體情況選擇合適的縮放或加權方法,以獲得更有意義的結果。

處理混合資料的聚類別挑戰

在處理混合資料(包含連續變數和類別變數)時,常見的無監督學習方法如K-means和PCA可能會遇到困難。對於較小的資料集,階層式聚類別(hierarchical clustering)結合Gower’s距離是一種更合適的方法。

Gower’s距離

Gower’s距離是一種用於處理混合資料的距離度量方法。它根據變數的型別採用不同的距離計算方法:

  • 對於數值變數和有序因子,距離計算為兩個記錄之間的絕對差值(曼哈頓距離)。
  • 對於類別變數,如果兩個記錄的類別不同,則距離為1;如果相同,則距離為0。

Gower’s距離計算步驟

  1. 計算所有變數對之間的距離$d_{i,j}$。
  2. 將每個$d_{i,j}$縮放到0到1之間。
  3. 使用簡單或加權平均值將縮放後的距離合併成一個距離矩陣。

R語言範例

library(cluster)
x <- loan_data[1:5, c('dti', 'payment_inc_ratio', 'home_', 'purpose_')]
daisy(x, metric='gower')

結果解讀

Gower’s距離矩陣顯示了記錄之間的相似度。距離越小,表示兩個記錄越相似。

階層式聚類別應用

將Gower’s距離矩陣應用於階層式聚類別,可以得到一個樹狀圖(dendrogram),顯示了記錄之間的階層結構。

df <- defaults[sample(nrow(defaults), 250), c('dti', 'payment_inc_ratio', 'home_', 'purpose_')]
d <- daisy(df, metric='gower')
hcl <- hclust(d)
dnd <- as.dendrogram(hcl)
plot(dnd, leaflab='none')

結果分析

在樹狀圖中,可以觀察到具有相似特徵的記錄被分組在一起。例如,在某個子樹中,所有記錄都具有相同的home_purpose_值。

混合資料聚類別的挑戰

K-means和PCA主要適用於連續變數。對於混合資料,階層式聚類別結合Gower’s距離是一種更好的選擇。然而,在某些情況下,也可以將類別變數轉換為數值變數(例如,使用one-hot encoding),然後應用K-means或PCA。

K-means聚類別的限制

如果直接將K-means應用於包含類別變數的資料集,結果可能會受到類別變數的顯著影響。類別變數的0/1編碼可能導致K-means將具有相同類別值的記錄分組在一起。

解決方案

  • 對類別變數進行縮放,使其方差小於其他變數。
  • 對具有特定類別值的資料子集進行單獨的聚類別分析。
內容解密:

本段落主要探討了在處理混合資料(包含連續變數和類別變數)時,無監督學習方法(如K-means和PCA)所面臨的挑戰。並介紹了Gower’s距離和階層式聚類別作為解決方案。

  1. Gower’s距離的定義和計算步驟:首先,詳細解釋了Gower’s距離的概念,即根據變數型別(數值或類別)採用不同的距離計算方法。接著,逐步說明瞭Gower’s距離的計算過程,包括對不同型別變數的距離計算、縮放和合並。
  2. R語言範例和結果解讀:提供了使用R語言計算Gower’s距離的範例,並對結果進行了解讀。這有助於讀者理解如何在實際資料中應用Gower’s距離。
  3. 階層式聚類別的應用和結果分析:展示瞭如何將Gower’s距離矩陣應用於階層式聚類別,並對得到的樹狀圖進行分析。這說明瞭如何利用階層式聚類別來發現資料中的階層結構。
  4. 混合資料聚類別的挑戰和解決方案:討論了K-means和PCA在處理混合資料時的侷限性,並提出了可能的解決方案,如對類別變數進行縮放或對資料子集進行單獨的聚類別分析。

綜上所述,本段落提供了對混合資料聚類別挑戰的全面理解,並介紹了有效的解決方法,有助於讀者在實際應用中選擇合適的無監督學習方法。## K-means與PCA在混合資料中的侷限性

K-means和PCA主要適用於連續變數。在處理混合資料(包含連續變數和類別變數)時,這些方法可能會遇到困難。

K-means在混合資料中的問題

當直接將K-means應用於包含類別變數(通常經過one-hot encoding轉換)的資料集時,結果可能會受到類別變數的顯著影響。這是因為0/1編碼的類別變數只能取兩個值,K-means可以透過將具有相同類別值的記錄分組在一起來獲得較小的簇內平方和。

R語言範例

df <- model.matrix(~ -1 + dti + payment_inc_ratio + home_ + pub_rec_zero, data=defaults)
df0 <- scale(df)
km0 <- kmeans(df0, centers=4, nstart=10)
centers0 <- scale(km0$centers, center=FALSE, scale=1/attr(df0, 'scaled:scale'))
round(scale(centers0, center=-attr(df0, 'scaled:center'), scale=FALSE), 2)

結果分析

結果顯示,前四個簇本質上是不同類別變數水平的代理。這表明K-means在處理包含類別變數的資料時可能會受到這些變數的支配。

解決方案

為了避免上述問題,可以採取以下措施:

  1. 縮放類別變數:對類別變數進行縮放,使其方差小於其他變數,從而減少其對聚類別結果的影響。
  2. 對資料子集進行聚類別:對具有特定類別值的資料子集進行單獨的聚類別分析,以避免不同類別之間的幹擾。
內容解密:

本段落主要探討了K-means和PCA在處理混合資料(包含連續變數和類別變數)時的侷限性,並提出了相應的解決方案。

  1. K-means在混合資料中的問題:首先,解釋了當直接將K-means應用於包含經過one-hot encoding轉換的類別變數的資料集時,可能會遇到的問題,即結果受到0/1編碼的類別變數的顯著影響。
  2. R語言範例和結果分析:提供了R語言範例,展示了K-means在包含dtipayment_inc_ratiohome_pub_rec_zero等變數的貸款違約資料上的應用。結果顯示,前四個簇本質上是不同水平下的home_pub_rec_zero之代理,表明K-means容易受到這些二元或分類別特徵之主導。
  3. 解決方案:提出了兩種解決方案:
    • 對二元或分類別特徵進行縮放,使其方差小於其他連續特徵,以減少其對最終分群結果之影響。
    • 對具有特定分類別值的子集進行單獨的分群分析,以避免不同分類別之間的相互幹擾。
  4. 總結與建議:總結了在處理混合型態特徵資料時,無監督學習演算法(如K-means與PCA)所面臨的主要挑戰,並強調瞭解這些演算法之侷限性以及如何透過調整資料預處理步驟或採用其他更合適的方法(如結合Gower’s 距離之階層式分群法)來克服這些挑戰,從而獲得更具洞察力的分析結果。

透過深入理解這些內容,研究人員和分析師可以更有效地處理包含多種資料型別的複雜資料集,從而在各種應用場景中獲得更準確、更有價值的洞察。

Python實作範例

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

# 資料前處理
columns = ['dti', 'payment_inc_ratio', 'home_', 'pub_rec_zero']
df = pd.get_dummies(defaults[columns])
scaler = StandardScaler()
df0 = scaler.fit_transform(df * 1.0)

# K-means分群
kmeans = KMeans(n_clusters=4, random_state=1).fit(df0)
centers = pd.DataFrame(scaler.inverse_transform(kmeans.cluster_centers_), columns=df.columns)
print(centers)

此Python程式碼片段展示瞭如何使用get_dummies函式進行one-hot encoding,將分類別特徵轉換為二元特徵,接著使用StandardScaler進行標準化,最後應用K-means演算法進行分群,並輸出各個簇之中心點座標,以供進一步分析和解讀。

本篇內容全面闡述了在機器學習領域中,如何有效地處理和分析包含多種資料型別之複雜資料集,為相關領域的研究人員和實踐者提供了寶貴的方法論指導與實踐範例。