You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让K近邻(KNN)分类模型输出预测为正类的概率值

K近邻分类器输出患病概率的实现方法

K近邻算法本身不需要修改核心分类逻辑,就可以同步输出离散分类结果和对应类别的概率,你要的标签1(患病)的概率本质就是近邻投票中患病类别的权重占比,完全符合项目必须使用KNN分类器的要求,具体实现分两种常见场景:

调用scikit-learn库实现的方案

如果你是用scikit-learn封装的KNN分类器开发,不需要自己改算法源码,直接调用模型内置的概率预测接口即可:

  • 你之前调用的predict()方法只会返回0/1的离散分类结果,换成配套的predict_proba()方法就能输出每个类别的预测概率
  • 方法返回的结果是二维数组,每行对应一个待预测样本,列顺序和模型训练时识别到的类别顺序一致,第二列就是标签1(患病)的对应概率
    示例代码如下:
from sklearn.neighbors import KNeighborsClassifier

# 按你的项目需求初始化模型参数,例如此处设置近邻数K=5
knn_model = KNeighborsClassifier(n_neighbors=5)
# 传入训练集特征、训练集标签完成模型拟合
knn_model.fit(X_train, y_train)

# 获取和之前一致的0/1离散分类结果
cls_result = knn_model.predict(X_test)
# 获取所有类别的预测概率
proba_result = knn_model.predict_proba(X_test)
# 单独提取每个样本的患病(标签=1)概率
cancer_pos_proba = proba_result[:, 1]

如果需要优化概率的合理性,可以在初始化模型时设置weights='distance'开启距离加权,此时概率不再是简单的样本数占比,而是按近邻和待预测样本的距离倒数分配权重(距离越近的邻居权重越高),最终计算患病类别的权重占比作为概率,结果通常比等权重投票更可靠。

手动实现KNN时的概率计算逻辑

如果你是从零手写KNN代码,按照以下逻辑计算即可,完全不改变KNN的核心分类规则:

  • 对每个待预测样本,计算其与所有训练样本的距离,筛选出距离最小的K个近邻样本
  • 等权重投票场景:统计K个近邻中标签为1的样本数量pos_count,患病概率 = pos_count / K,当概率≥0.5时分类结果为1,否则为0,和你之前输出的离散分类结果完全对齐
  • 距离加权场景:给每个近邻计算权重w_i = 1 / (distance_i + 1e-8)(加极小值是为了避免距离为0时出现除零错误),将所有标签为1的近邻权重求和,再除以K个近邻的总权重和,得到的结果就是加权后的患病概率

注意:KNN输出的概率是基于近邻投票的经验占比,不属于经过严格校准的概率值,如果项目对概率的校准度有要求,可以在不改动KNN分类核心逻辑的前提下,额外增加概率校准步骤,不会违反项目必须使用KNN分类器的要求。

内容的提问来源于stack exchange,提问作者David manga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:27:24