sklearn KMeans的labels_与predict()结果不一致该用哪个分配簇标签
KMeans的
labels_属性与predict()方法结果差异说明 基础逻辑
正常情况下,二者对训练集的输出结果应该完全一致:
labels_是KMeans模型完成训练后,直接存储的训练样本对应的簇编号,是训练最后一步给样本分配簇的直接结果predict()方法的逻辑是计算输入样本到各个质心的距离,将样本分配到距离最近的质心所属的簇,输入为训练集时,和labels_的计算逻辑完全相同
不一致的可能原因
- 未固定随机种子:你初始化KMeans时没有设置
random_state参数,若两次运行fit操作,得到的质心分布不同,前一次fit得到的labels_和后一次模型predict的结果自然不匹配 - 训练数据被修改:调用
fit()和predict()的间隔中,wdf的行顺序、数值、索引发生了改动,导致predict的输入和fit的输入不是完全相同的数据集 - 模型对象被覆盖:fit完成拿到
labels_后,你又重新实例化了同名的KMeans对象做了其他操作,调用predict时用的是新模型的参数,和旧labels_不匹配
正确的打标签方案
- 给参与训练的样本打标签,直接使用
kmeans.labels_即可,无需额外调用predict,执行效率更高,也不会出现顺序不匹配的问题 - 给未参与训练的新样本打标签,再使用
predict()方法
一致性验证方法
你可以运行以下代码确认二者逻辑一致:
import numpy as np from sklearn.cluster import KMeans # 固定随机种子保证结果可复现 kmeans5 = KMeans(n_clusters=5, max_iter=20, random_state=42) kmeans5.fit(wdf) print(np.array_equal(kmeans5.labels_, kmeans5.predict(wdf)))
正常运行后输出为True,如果依旧为False,可重点排查训练数据是否在fit和predict之间被修改。
内容的提问来源于stack exchange,提问作者Saif
相关产品推荐
相关产品推荐

