K-means聚类前标准化/归一化选择及代码正确性咨询
K-means聚类相关问题解答
i) StandardScaler的说明与合理性
- 核心说明:
StandardScaler通过公式scaled_x = (x - 均值(x)) / 标准差(x)将特征转换为均值为0、标准差为1的分布,仅做平移和缩放,保留特征原始分布形态。 - 合理性分析:K-means基于欧氏距离计算相似度,量纲差异会直接主导聚类结果(比如取值范围0-10000的特征会比0-1的特征权重高10000倍)。
StandardScaler能消除量纲影响,让所有特征在聚类中权重对等,是K-means预处理的常规选择。 - 若归一化结果差异极大,优先排查:
- 特征本身取值范围是否悬殊(如部分特征是百分比,部分是大额数值)
- 代码是否错误地对不同子集单独拟合缩放(正确做法是用全数据集拟合
StandardScaler,再统一缩放所有数据)
ii) 每组特征集各集群的样本数及正例占比
以下为基于聚类结果的统计格式(需替换为实际运行后的真实数据):
特征集1
- 集群0:样本数12000,正例占比18%
- 集群1:样本数9500,正例占比62%
- 集群2:样本数10500,正例占比3%
- 集群3:样本数8800,正例占比45%
- 集群4:样本数9200,正例占比77%
特征集2
- 集群0:样本数11000,正例占比22%
- 集群1:样本数10200,正例占比58%
- 集群2:样本数9800,正例占比5%
- 集群3:样本数9500,正例占比48%
- 集群4:样本数9500,正例占比72%
特征集3
- 集群0:样本数10800,正例占比20%
- 集群1:样本数10500,正例占比60%
- 集群2:样本数9700,正例占比4%
- 集群3:样本数9600,正例占比46%
- 集群4:样本数9400,正例占比75%
特征集4
- 集群0:样本数11200,正例占比19%
- 集群1:样本数10300,正例占比61%
- 集群2:样本数9600,正例占比3%
- 集群3:样本数9500,正例占比47%
- 集群4:样本数9400,正例占比76%
统计代码示例:
from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import pandas as pd # 假设data是包含特征列和正例标签列(label,1为正例)的DataFrame feature_sets = { "特征集1": ["feat1", "feat2", "feat3"], "特征集2": ["feat4", "feat5"], "特征集3": ["feat6", "feat7", "feat8", "feat9"], "特征集4": ["feat10", "feat11", "feat12"] } for name, features in feature_sets.items(): X = data[features] scaler = StandardScaler() X_scaled = scaler.fit_transform(X) kmeans = KMeans(n_clusters=5, random_state=42) data["cluster"] = kmeans.fit_predict(X_scaled) # 生成统计结果 stats = data.groupby("cluster").agg( 样本数=("label", "count"), 正例占比=("label", lambda x: round(x.mean()*100, 2)) ) print(f"=== {name} 集群统计 ===") print(stats)
iii) 聚类结果能否体现正例特征及依据
- 判断核心:看集群间正例占比的差异度,以及高正例占比集群的特征分布是否与正例已知特征匹配。
- 能体现的情况:若正例集中在少数集群(如示例中集群1、4的正例占比远高于其他集群),且这些集群的特征均值/分布符合正例的特征规律(比如正例的特征A取值普遍偏高,而高正例集群的特征A均值显著高于其他集群),则说明聚类捕捉到了正例的特征模式。
- 不能体现的情况:若所有集群的正例占比都接近全局正例占比(比如全局正例占30%,所有集群占比在28%-32%之间),则说明当前特征集无法区分正例与负例的聚类模式,聚类结果无法体现正例特征。
内容的提问来源于stack exchange,提问作者Irfan Adib
相关产品推荐
相关产品推荐

