多分类问题中如何调整分类阈值?KNN不平衡分类场景咨询
解决KNN多分类不平衡问题:调整分类阈值的实操方法
针对你遇到的4分类不平衡问题(类别3占主导,小众类1、2、4召回率偏低),KNN默认的predict方法直接选取概率最高的类别,无法灵活调整分类倾向。要优化小众类的表现,你可以通过获取类别预测概率并自定义加权规则实现阈值调整,具体步骤如下:
1. 获取KNN的类别预测概率
KNN的predict_proba()方法会返回每个样本属于各类别的概率矩阵(形状为[样本数, 类别数]),我们基于这个矩阵调整分类逻辑。
替换原代码中的预测部分:
# 替换原Y_pred = knn.predict(X_test) Y_pred_proba = knn.predict_proba(X_test)
2. 自定义加权阈值规则
通过给不同类别设置权重,调整模型分类倾向:给小众类(1、2、4)设置大于1的权重,提升它们的概率优先级;给主导类(3)设置小于1的权重,降低其分类优先级。
示例代码:
# 定义各类别的权重,对应类别1、2、3、4 class_weights = np.array([1.5, 1.2, 0.8, 1.3]) # 对概率矩阵进行加权 weighted_proba = Y_pred_proba * class_weights # 选取加权后概率最高的类别(你的类别为1-4,argmax结果需加1) Y_pred_adjusted = np.argmax(weighted_proba, axis=1) + 1
3. 评估调整后的效果
计算调整后的分类指标,验证小众类表现变化:
print("调整阈值后的KNN测试集准确率:", accuracy_score(Y_test, Y_pred_adjusted)) print("调整阈值后的分类报告:") print(metrics.classification_report(Y_test, Y_pred_adjusted)) print("调整阈值后的混淆矩阵:") print(confusion_matrix(Y_test, Y_pred_adjusted))
4. 调优权重参数
上述权重为经验值,你可以通过交叉验证寻找最优组合:
- 以小众类的F1-score或召回率为优化目标
- 用
GridSearchCV遍历不同权重范围(比如给每个类别设置0.5-2之间的候选值)
其他补充优化方向
除了调整阈值,还可以结合以下方法进一步优化:
- 数据层面:对小众类做过采样(如SMOTE),或对主导类做欠采样,平衡训练数据分布
- 模型参数:调整
n_neighbors(比如增大k值)、尝试其他距离度量(如余弦距离) - 评价指标:优先关注加权F1、macro F1或小众类的召回率,避免被整体accuracy误导
内容的提问来源于stack exchange,提问作者Rirro Romeu
相关产品推荐
相关产品推荐

