Bagging模型预测新样本后LabelEncoder.inverse_transform仅返回2个结果的原因排查求助
问题原因与解决方案
嘿,我一眼就发现了两个关键问题,其中一个直接导致了你得到的结果不符合预期:
1. 最直接的错误:误用了.all()方法
你在调用le.inverse_transform时,错误地在预测结果后添加了.all():
le.inverse_transform(bagging.predict(sample_images).all())
.all()是numpy数组的方法,它会对数组中所有元素进行逻辑与运算,最终返回一个单一的布尔值(比如数组里所有非零元素会被视为True,只有所有元素都为真时返回True,否则返回False)。
而le.inverse_transform需要接收的是编码后的标签数组(长度和你的样本数一致,这里是9个元素),不是单个布尔值。当你传入这个布尔值时,它会被当作整数1(True对应1,False对应0)去查找对应的类别,自然得不到你想要的9个结果。
修正代码
直接去掉.all(),传入完整的预测数组:
predicted_encoded = bagging.predict(sample_images) predicted_labels = le.inverse_transform(predicted_encoded) # 现在predicted_labels就是长度为9的数组,完全对应你预期的9个标签
2. 潜在的LabelEncoder使用错误:拟合顺序颠倒
你当前的标签编码逻辑存在不规范的地方:
le.fit(test_labels) list(le.classes_) test_labels_encoded = le.transform(test_labels) le.fit(train_labels) train_labels_encoded = le.transform(train_labels)
正确的做法应该是只在训练集标签上拟合LabelEncoder,然后用同一个编码器去转换训练集和测试集的标签。如果先拟合测试集再重新拟合训练集,会导致编码器的类别映射被覆盖,万一测试集和训练集的类别集合有差异,会直接导致标签编码不匹配——虽然你当前测试集准确率很高,但这可能是巧合,长期来看会埋下隐患。
修正后的标签编码代码
from sklearn import preprocessing le = preprocessing.LabelEncoder() # 只在训练集标签上拟合编码器 le.fit(train_labels) # 用同一个编码器转换训练集和测试集标签 train_labels_encoded = le.transform(train_labels) test_labels_encoded = le.transform(test_labels) # 查看类别映射关系 list(le.classes_)
这样修改后,你的标签编码逻辑才是规范且可靠的,同时也能确保新样本预测时的标签转换完全匹配训练时的映射规则。
内容的提问来源于stack exchange,提问作者Calla
相关产品推荐
相关产品推荐

