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

KMeans假钞检测模型训练集预测正常但测试集标签反转求助

KMeans假钞识别中测试集标签反转问题的解决方法

问题描述

我在学习用Python构建假钞检测器,分别基于线性回归和KMeans模型实现假钞识别。线性回归模型运行正常,但KMeans模型出现问题。

使用的预测代码:

model_kmean = KMeans(n_clusters = 2) #fake bills (0) and true bills (1)
train_pred_kmean = model_kmean.fit_predict(X_train)

训练集输出符合预期:真钞预测为1,假钞预测为0;但测试集的预测结果里1和0完全反转了。

问题根源

KMeans是无监督聚类算法,它只会根据数据的特征相似度划分簇,不会自动对应你预设的业务标签(0=假钞、1=真钞)。训练集的簇编号碰巧和你的标签定义匹配,但KMeans的簇编号是随机分配的,测试集的簇编号完全可能出现反转。

解决步骤

  • 基于训练集真实标签校准簇编号
    拿到训练集的聚类结果后,统计每个簇对应的真实标签占比,确定簇编号和业务标签的对应关系:

    import numpy as np
    # y_train为训练集真实标签(0=假钞,1=真钞)
    cluster_labels = model_kmean.labels_
    # 计算簇0中占比最高的真实标签
    cluster0_target = np.bincount(y_train[cluster_labels == 0]).argmax()
    # 计算簇1中占比最高的真实标签
    cluster1_target = np.bincount(y_train[cluster_labels == 1]).argmax()
    
  • 构建标签映射字典
    根据上面的统计结果,创建映射关系,把KMeans的簇编号转换为你需要的业务标签:

    label_map = {0: cluster0_target, 1: cluster1_target}
    # 修正训练集预测结果
    train_pred_kmean = np.array([label_map[label] for label in cluster_labels])
    
  • 统一转换测试集结果
    对测试集做预测后,直接用同一个映射字典转换,确保标签定义一致:

    test_pred_kmean = model_kmean.predict(X_test)
    test_pred_kmean = np.array([label_map[label] for label in test_pred_kmean])
    

额外提示

  • 永远不要假设KMeans的簇编号会和业务标签自动匹配,无监督算法的簇编号是随机生成的,必须用有标签的训练数据做校准。
  • 可以用混淆矩阵验证校准后的结果,确保真钞和假钞的分类符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:54:17