解释无监督模型

Python 可解释性 AI

Fouad Trad

Machine Learning Engineer

聚类

在无标签情况下将相似数据点分组

包含2个特征的数据被分为3个簇,每个簇有一个质心。

Python 可解释性 AI

轮廓系数(Silhouette)

  • 衡量聚类质量
  • 取值范围 -1 到 1
    • 1 → 簇分离良好

簇分离良好的示意图。

Python 可解释性 AI

轮廓系数(Silhouette)

  • 衡量聚类质量
  • 取值范围 -1 到 1
    • 1 → 簇分离良好
    • -1 → 点被错误分配

簇无明显分离的示意图。

Python 可解释性 AI

特征对聚类质量的影响

将含2个特征的数据送入聚类算法后的结果。

Python 可解释性 AI

特征对聚类质量的影响

移除一个特征并重新训练后得到的聚类结果。

Python 可解释性 AI

特征对聚类质量的影响

通过差分计算被移除特征的影响:所有特征在场时的轮廓系数减去移除该特征时的轮廓系数。

  • $\text{Impact(}f) > 0$ → $f$ 正向贡献
  • $\text{Impact(}f) < 0$ → $f$ 引入噪声
Python 可解释性 AI

学生成绩数据集

age health status absences G1 G2 G3
18 3 4 0 11 11
17 3 2 9 11 11
15 3 6 12 13 12
15 5 0 14 14 14
16 5 0 11 13 13

 

X: 包含特征的数组

Python 可解释性 AI

计算特征对聚类质量的影响

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score


kmeans = KMeans(n_clusters=2).fit(X)
original_score = silhouette_score(X, kmeans.labels_)
for i in range(X.shape[1]):
X_reduced = np.delete(X, i, axis=1)
kmeans.fit(X_reduced)
new_score = silhouette_score(X_reduced, kmeans.labels_)
impact = original_score - new_score print(f'Feature {column_names[i]}: Impact = {impact}')
Python 可解释性 AI

计算特征对聚类质量的影响

Feature age: Impact = 0.05199181662741281
Feature health status: Impact = 0.06046737420227638
Feature absences: Impact = 0.031290940582026694
Feature G1: Impact = -0.025746421940652353
Feature G2: Impact = -0.02578292339364119
Feature G3: Impact = -0.03163419458330158
Python 可解释性 AI

调整兰德指数(ARI)

  • 衡量两组聚类标签的一致性

给定数据集的两种相似聚类分配。

  • 最大 ARI = 1 → 完全一致
Python 可解释性 AI

调整兰德指数(ARI)

  • 衡量两组聚类标签的一致性

同一数据集的两种不同聚类分配。

  • 最大 ARI = 1 → 完全一致
  • ARI 越低 → 差异越大
Python 可解释性 AI

聚类分配的特征重要性

   

  • 逐一移除特征
  • $\text{Importance}(f) = 1 - \text{ARI (original clusters, modifed clusters)}$
  • $\text{ARI}$ 低 → $\text{1 - ARI}$ 高 → 特征重要
Python 可解释性 AI

聚类分配的特征重要性

from sklearn.metrics import adjusted_rand_score

kmeans = KMeans(n_clusters=2).fit(X) original_clusters = kmeans.predict(X)
for i in range(X.shape[1]):
X_reduced = np.delete(X, i, axis=1)
reduced_clusters = kmeans.fit_predict(X_reduced)
importance = 1 - adjusted_rand_score(original_clusters, reduced_clusters) print(f'{df.columns[i]}: {importance}')
age: 0.0
health status: 0.9995376368119572
absences: 0.0
G1: 0.0
G2: 0.6204069909514572
G3: 0.6204069909514572
Python 可解释性 AI

Vamos praticar!

Python 可解释性 AI

Preparing Video For Download...