调用sklearn的top_k_accuracy_score时y_true与y_score类别数不匹配
报错原因
top_k_accuracy_score默认会从传入的y_test中提取唯一值作为类别集合,自动推导类别总数。你拆分数据集时,部分样本量极低的类别没有被分配到测试集中,导致y_test仅包含255个不同类别,但分类pipeline是在完整269个类别上训练的,predict_proba输出的概率矩阵始终对应269个类别的概率,两者维度不匹配触发了该报错。
你手动实现的计算逻辑没有全局类别校验步骤,直接用真实标签匹配预测的top5索引,因此不会触发这个报错。
正确调用方式
调用函数时手动指定labels参数为模型训练覆盖的所有类别整数列表即可,有两种常用实现方案:
- 方案1:使用你提前生成的类别映射中的所有值
all_classes = list(class_int_mapping.values()) top5_acc = top_k_accuracy_score(y_test, pipeline.predict_proba(x_test), k=5, labels=all_classes)
- 方案2:直接读取pipeline训练后内置的类别列表(更稳妥,可避免手动维护的类别顺序和模型输出概率的顺序不匹配问题)
top5_acc = top_k_accuracy_score(y_test, pipeline.predict_proba(x_test), k=5, labels=pipeline.classes_)
内容的提问来源于stack exchange,提问作者Deshwal
相关产品推荐
相关产品推荐

