使用sklearn的average_precision_score计算KNN模型指标遇ValueError求助
解决average_precision_score报错及模型预测异常问题
一、报错原因分析
你遇到的ValueError: pos_label=1 is invalid是因为average_precision_score函数默认将正类标签设为1,但从你打印的y_test.values可以看到,你的真实标签只有2和3两个类别,根本不存在1这个标签,所以函数找不到指定的正类就报错了。
另外,你输出的y_pre全是3,这说明你的KNN模型存在严重的预测偏差——大概率是训练数据中类别3的占比远高于2(类别不平衡),或者模型参数设置不合理(比如k值过大),导致模型只会预测多数类。
二、分步解决方案
1. 修复average_precision_score的报错
你需要明确任务中哪个类别是正类,然后通过pos_label参数指定它:
- 如果把
2作为正类,修改代码为:
average_precision = metrics.average_precision_score(y_test.values, y_pre, pos_label=2)
- 如果把
3作为正类,修改代码为:
average_precision = metrics.average_precision_score(y_test.values, y_pre, pos_label=3)
注意:你原来代码里的np.array(y_pre.tolist)完全多余,因为y_pre已经是numpy数组了,直接传入即可。
2. 解决模型全预测3的问题
- 检查类别分布:先统计训练集中
2和3的样本数量,如果3占比极高,属于类别不平衡问题。可以尝试:- 使用
class_weight='balanced'参数(sklearn的KNeighborsClassifier支持该参数),让模型给少数类更高的权重。 - 对少数类进行过采样(比如SMOTE算法),或者对多数类进行欠采样,平衡数据集。
- 使用
- 调整KNN参数:尝试减小
n_neighbors(k值),因为k值太大时,模型更容易被多数类样本主导。比如从默认的5改成3或者1,观察预测结果是否变化。 - 检查特征质量:确认你的特征是否有区分度,如果特征无法有效区分两个类别,模型也会倾向于预测多数类。
内容的提问来源于stack exchange,提问作者Andrew Zhang
相关产品推荐
相关产品推荐

