Scikit-Learn KMeans聚类可视化与原数据不符问题排查
KMeans聚类可视化差异问题排查与修正
核心问题排查方向
从你描述的情况来看,cluster_df构建错误或前置步骤疏漏是主要原因,以下是逐一排查点:
1. 特征列选择是否准确
先确认你选择训练的两列是否完全匹配数据集列名,避免拼写错误、大小写不一致或多选列:
# 错误示例:列名拼写错误/多选无关列 X = df[['perimetre', 'asymmetry', 'area']] # 正确操作:严格指定目标列,并用copy避免视图警告 X = df[['perimeter', 'asymmetry']].copy()
2. 特征未做标准化(KMeans核心坑点)
KMeans基于欧氏距离计算,若perimeter和asymmetry数值尺度差异极大,聚类结果会被数值大的特征主导,导致和原分类分布完全偏离。必须先标准化:
from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans # 标准化特征 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 训练KMeans(注意n_clusters要和原数据类别数匹配) kmeans = KMeans(n_clusters=3, random_state=42) cluster_labels = kmeans.fit_predict(X_scaled)
3. cluster_df构建时索引是否对齐
如果合并聚类标签时索引错位,会导致标签和样本不匹配,可视化自然混乱:
# 错误示例:直接赋值但索引未对齐(比如X是numpy数组且打乱过) cluster_df = df.copy() cluster_df['cluster'] = cluster_labels # 若X的样本顺序和df不一致则出错 # 正确操作:确保标签和原数据样本一一对应 # 方式1:用assign直接添加标签(X是df子集时,样本顺序一致) cluster_df = df.assign(cluster=cluster_labels) # 方式2:若X是numpy数组,先检查X和df的样本顺序,再赋值 cluster_df = df.copy() cluster_df['cluster'] = kmeans.labels_ # KMeans的labels_会按训练样本顺序输出
4. 可视化时是否用了正确的列
确保聚类结果可视化和原数据可视化使用的是同一两列(perimeter和asymmetry),避免误用其他特征:
import matplotlib.pyplot as plt # 原数据分类可视化(假设原标签列名为'class') plt.figure(figsize=(8, 4)) plt.subplot(1, 2, 1) plt.scatter(df['perimeter'], df['asymmetry'], c=df['class'], cmap='viridis') plt.xlabel('Perimeter') plt.ylabel('Asymmetry') plt.title('Original Class') # 聚类结果可视化 plt.subplot(1, 2, 2) plt.scatter(cluster_df['perimeter'], cluster_df['asymmetry'], c=cluster_df['cluster'], cmap='viridis') plt.xlabel('Perimeter') plt.ylabel('Asymmetry') plt.title('KMeans Clusters') plt.tight_layout() plt.show()
额外检查项
- 确认
n_clusters参数和原数据的类别数量一致,比如原数据是3类,KMeans不能设为2类; - 检查
X中是否存在缺失值,缺失值会导致聚类结果异常,可通过X.isnull().sum()查看,必要时用X.fillna(X.mean())填充。
内容的提问来源于stack exchange,提问作者Shree_ML
相关产品推荐
相关产品推荐

