1. 为什么K-Means需要数据预处理?
K-Means算法作为最经典的聚类方法之一,其性能高度依赖于数据质量。我在实际项目中多次验证过,未经处理的原始数据直接输入K-Means,结果往往惨不忍睹。这就像让米其林大厨用没洗过的食材做菜——再好的厨艺也难发挥。
1.1 特征尺度差异的灾难性影响
假设我们有个客户分群场景,包含"年收入(万元)"和"年龄"两个特征。年收入范围可能是10-1000,而年龄范围20-80。K-Means使用欧氏距离计算时,收入数值大,会完全主导距离计算,年龄特征几乎不起作用。
我做过一个对比实验:同一组银行客户数据,未做特征缩放时聚类结果SSE(误差平方和)是缩放后的3.2倍。更糟的是,业务部门反馈未缩放的聚类结果"完全无法用于营销策略"。
1.2 高维空间的诅咒
在文本聚类项目中,当特征维度超过500时,我发现聚类效果开始急剧下降。这不是算法问题,而是高维空间中所有点对的距离都趋向相同,使聚类失去意义。就像在100维空间里,任意两个点都可能" equally dissimilar"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 特征缩放实战指南
2.1 标准化(Standardization) vs 归一化(Normalization)
在电商用户行为分析中,我对比过两种方法:
python复制from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 标准化 (更适合K-Means)
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
# 归一化
minmax = MinMaxScaler()
X_norm = minmax.fit_transform(X)
关键选择依据:
- 数据有异常值:用RobustScaler更稳妥
- 特征边界明确(如像素值0-255):MinMax
- 其他情况:优先StandardScaler
2.2 实战中的坑与技巧
-
不要在整个数据集上fit:应该先在训练集fit,再transform测试集。我在某次比赛因此导致数据泄露,模型效果虚高。
-
分类特征的特殊处理:对于性别等类别特征,我常用OneHot
