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
相关产品推荐
相关产品推荐

