如何修正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
相关产品推荐
相关产品推荐

