You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正KMeans聚类标签倒置问题?分类场景标签重分配方案

KMeans聚类标签倒置问题的解决方法

问题描述

我正在使用机器学习分类预测算法进行训练,对比测试Logistic Regression、KNN以及基于KMeans质心的分类方法。
除KMeans外,其余方法均运行正常,但KMeans出现了标签0和1倒置的问题:聚类结果本身正确,但类别对应关系错误,导致混淆矩阵中True和False的位置反转,准确率从预期的99%降至1%。
我需要将簇0对应False、簇1对应True,且该适配需不受数据集类别分布影响。请问是否有办法提前修正或重分配KMeans的聚类标签?

用户提供的原始代码:

# Kmeans model initialization
km = KMeans(n_clusters=2)
km.fit(X_train_std)

# centroids definition
centroid = km.cluster_centers_    
c_km = pd.DataFrame(centroid, columns=X_name)

# prediction pour 2 clusters
y_pred_km = km.predict(X_test_std)

# model training
pred['pred_km'] =  y_pred_km
pred['is_genuine_km'] = pred['pred_km'].apply(lambda x: True if x >0 else False)

# plot the confusion matrix & accuracy score
fig, ax = plt.subplots(1,1)
cm_km = metrics.confusion_matrix(y_test, y_pred_km)
cm_display_km = metrics.ConfusionMatrixDisplay(cm_km, display_labels=['False', 'True'])
cm_display_km.plot(ax=ax)
ax.set_title('K-Means Confusion Matrix \n Accuracy =  %0.3f' % metrics.accuracy_score(y_test, y_pred_km))
plt.show()

解决方案

KMeans是无监督算法,簇的编号是随机生成的,无法提前指定0/1对应哪个类别。但可以通过训练集真实标签与聚类结果的关联关系自动修正标签,这个方法不受数据集类别分布影响。

核心思路

找到每个聚类簇对应的真实标签的众数(即该簇中占比最高的真实标签),建立簇编号到真实标签的映射,再用这个映射修正预测结果的标签。

修改后的完整代码

from scipy.stats import mode
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt

# 初始化并训练KMeans模型
km = KMeans(n_clusters=2)
km.fit(X_train_std)

# 获取训练集的聚类结果
y_train_clusters = km.labels_

# 建立簇编号到真实标签的映射:取每个簇中出现最多的真实标签
cluster_label_map = {}
for cluster_id in range(2):
    # 筛选当前簇的所有样本的真实标签
    cluster_true_labels = y_train[y_train_clusters == cluster_id]
    # 计算众数,得到该簇对应的真实标签
    most_common_label = mode(cluster_true_labels, keepdims=True)[0][0]
    cluster_label_map[cluster_id] = most_common_label

# 预测测试集并修正标签
y_pred_km_raw = km.predict(X_test_std)
y_pred_km_corrected = [cluster_label_map[cluster] for cluster in y_pred_km_raw]

# 更新预测结果
pred['pred_km'] = y_pred_km_corrected
# 根据真实标签的定义转换为True/False(假设1对应True,0对应False)
pred['is_genuine_km'] = pred['pred_km'].apply(lambda x: True if x == 1 else False)

# 绘制混淆矩阵和准确率
fig, ax = plt.subplots(1,1)
cm_km = metrics.confusion_matrix(y_test, y_pred_km_corrected)
cm_display_km = metrics.ConfusionMatrixDisplay(cm_km, display_labels=['False', 'True'])
cm_display_km.plot(ax=ax)
ax.set_title('K-Means Confusion Matrix \n Accuracy =  %0.3f' % metrics.accuracy_score(y_test, y_pred_km_corrected))
plt.show()

注意事项

  • 如果你的真实标签中True对应0、False对应1,只需调整is_genuine_km的lambda表达式即可
  • 该方法依赖训练集的真实标签,属于半监督式的标签修正,完全适配数据集类别分布变化的场景

内容的提问来源于stack exchange,提问作者Lilly_Co

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:54:23