KNN近邻分类

所属分类:机器学习-分类

这个方法是做什么的

它不“训练”出任何模型:来了一个待判样本,就在特征空间里找出离它最近的 K 个训练样本(默认 K=5),这 K 个里哪一类占多数就判成哪一类,类别概率就是各类在这 K 个邻居里的(加权)占比。权重方式选 uniform 时五个邻居等权,选 distance 时越近的邻居说话越算数。所以它没有参数、没有函数形式,全部知识就是那张训练数据表本身——任何形状的类别边界它都能贴着走,但它也只会“查表”,一步走不出训练数据覆盖的区域。因变量是定类列,自变量可含定量与定类,定类列独热编码后同样参与距离计算;报告不给系数,也不给任何自变量的 p 值。

报告共五张卡:卡① 建模设置与八项体检,卡② 分层 5 折交叉验证主结果与无信息率检验,卡③ 混淆矩阵与 ROC/PR/逐类别指标四张图,卡④ 效应量区间与置换重要性,卡⑤ 论文表述。别处只是流程说明的那一行,在本模块是决定性的:卡① 表3 的“特征尺度差异”显示演示数据里标准差最大与最小的两个自变量相差 32.22 倍,管线已在每个训练折内做 Z 标准化把它抹平——否则量纲大的那一列会独占整个距离。但标准化解决的只是量纲,标准化之后每个自变量在距离里仍然各占同样一份权重,这正是本模块最容易翻车的地方(见下)。

需要准备什么数据

  • 放入因变量Y:不限
  • 放入自变量X:至少 1 个

数据要求

  • 数据表至少 30 行。
  • 单列缺失率不超过 20%。
  • 不接受取值全都一样的列(零方差列没有可分析的变异)。
  • 「放入因变量Y」的类别数需在 2~20 之间。
  • 「放入因变量Y」的每一组至少 5 个样本。

以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。

什么时候用它

  • 自变量个数不多(几个到十几个),而且每一个你都确认与结局有关
  • 类别边界很不规则、分块甚至不连通,任何全局函数都套不上
  • 样本在特征空间里分布得比较密,新样本附近总能找到真正相似的历史样本
  • 需要一个不做任何分布假设的对照基准,用来衡量别的模型有没有真本事

前提:因变量是定类列,2~20 个类别、每类至少 5 例;整表至少 30 行,含缺失的整行剔除。本模块还有一条会直接报错的硬约束:近邻数 K 不得超过训练集样本数。实测 40 行数据配 K=50 时请求被拒绝,提示是“近邻数 K(50)不能超过训练集样本数(32)。请减小 K,或增大样本量 / 调小测试集比例。”——注意调大测试集比例会同时缩小训练集,可用的 K 上限也跟着变小。

什么时候不要用它

  • 因变量是连续数值:用「KNN近邻回归」。
  • 要报告每个自变量的效应方向与显著性:本模块连“系数”这个概念都不存在;二分类结局用「逻辑回归」,结局有序用「有序逻辑回归」。
  • 自变量个数多(十几个以上),或定类变量独热后维度膨胀:高维空间里所有点的距离趋于相等,“最近的邻居”不再有意义;改用按单个变量逐层切分、不依赖全局距离的「随机森林分类」,确实要保留全部信息又想降维就先做「主成分分析(PCA)」。
  • 自变量里混着与结局无关的列:它们会实实在在地污染距离(见下),先用「特征筛选」压掉。
  • 样本在特征空间里稀疏或分布很不均:稀疏区域的“最近邻”其实离得很远,等于把远处的类别搬过来;这种数据更适合找一条全局边界的「支持向量机分类(SVM)」。
  • 观测之间不独立(同一对象多期、机构内嵌套):同一个体的记录会互相成为对方的近邻,交叉验证成绩严重虚高;用「面板模型」或「混合模型」。

容易误读的地方

  • 一列无关的数据不会被模型“忽略”,它会按满额权重挤进距离里。 实测:在演示数据的 3 个自变量之外再加 10 列纯随机噪声,交叉验证 Accuracy 从 0.7583 掉到 0.6958、Macro-F1 从 0.7507 掉到 0.6857、κ 从 0.5048 掉到 0.3747,卡⑤ 的综合判定随之翻成“模型尚不满足全部可用性判据 —— Cohen's κ=0.3747 未达中等一致性”。这与树模型的行为完全不同:树可以不选那一列,而距离没有“不选”这个选项。“先都扔进去让模型决定”那一套在本模块行不通。
  • 同一次实验里,一列纯噪声拿到了“正贡献(打乱后性能显著下降)”的判定。 还是上面那次加噪实验:13 个自变量中,“无关噪声列9”的 ΔF1=0.0305、95%CI[0.0007, 0.0602],下限刚好大于 0,被判为正贡献;而真实的“促销折扣力度(%)”ΔF1=0.0087、区间跨 0,被判为不稳定。表8 对每个变量各算一个 95% 区间、彼此不做多重比较校正,变量越多,凭运气“显著”的就越多。表8 只能读作模型内部的相对依赖排序,不能当成变量筛选的判据。
  • “近邻数K”的可填范围有上限 50,超出会被静默改小。 实测填 200 与填 193,卡① 表1 印的都是“超参数·近邻数K | 50”,两次的表4 完全一样。也就是说这个控件既有一条看得见的下线(K 不得超过训练集样本数,会报错),也有一条看不见的上线(50,不报错、直接改)。改完 K 之后请回到卡① 表1 核对它到底用了多少。
  • 多分类时类别的排列顺序按字符编码来,不是你心里的业务顺序。 实测把结局改成“低 / 中 / 高”三档,卡① 表2 与卡④ 表6 的行序是“中、低、高”——因为按 Unicode 排“中”在“低”前面。同时表4 会少掉 ROC-AUC 与 PR-AUC 两行(多分类不画单条曲线),卡③ 的结论文案改成“多分类任务不绘制单条 ROC 曲线,各类别的 OvR AUC 见卡④”。读混淆矩阵前先看清行头是哪一类,别按位置默认它是有序的。
  • “调大 K 成绩变好”不等于可以一直调大。 K=5 时每个待判样本的结论由五个邻居决定,混进一个噪声点就足以改判;K 越大边界越平滑,极端情形是所有样本都被判成多数类——那时准确率恰好等于表5 里的无信息率。演示数据上把 K 从 5 调到 50,交叉验证 Accuracy 从 0.7583 升到 0.8042、κ 从 0.5038 升到 0.5957,说明这份数据的合适 K 确实大于默认值;但同样的调法在少数类稀少的数据上会先把准确率抬上去、再把少数类召回率压下来。判断方向要同时看表4 的平衡准确率与卡④ 表6 的逐类别召回率:准确率涨而平衡准确率不涨,就是被多数类带偏了。

报告里有什么

  1. 输出结果一:数据概览与前提检验
  2. 输出结果二:交叉验证性能主结果表
  3. 输出结果三:分类效果可视化
  4. 输出结果四:效应量与事后分析
  5. 输出结果五:结论与学术表述
混淆矩阵(交叉验证折外预测,n=240)
图1 混淆矩阵(交叉验证折外预测,n=240)
ROC 曲线(交叉验证折外预测,AUC=0.827)
图2 ROC 曲线(交叉验证折外预测,AUC=0.827)
Precision-Recall 曲线(交叉验证折外预测,PR-AUC=0.774)
图3 Precision-Recall 曲线(交叉验证折外预测,PR-AUC=0.774)
各类别的精确率 / 召回率 / F1(交叉验证折外预测)
图4 各类别的精确率 / 召回率 / F1(交叉验证折外预测)
卡③ 全部基于交叉验证折外预测绘制:混淆矩阵与曲线所用的预测都来自模型未见过该样本的那一折,不是训练集回代结果。

在线统计分析平台 · 233 种分析方法 · AI 智能解读

在线使用
使用教程