KNN近邻回归

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

这个方法是做什么的

预测一个数值型因变量,但它不“训练”出任何模型:来了一个新样本,就在特征空间里找出离它最近的 K 个训练样本(默认 K=5),把这些样本的因变量取平均作为预测。权重方式选 uniform 时 K 个邻居等权,选 distance 时越近的邻居权重越大。所以它没有参数、没有函数形式,全部知识就是那张训练数据表本身——好处是任意复杂的局部规律都能刻画,坏处是它只会“查表插值”,一步也走不出训练数据覆盖的区域。定类自变量可直接拖入,管线内独热编码后参与距离计算;不产出回归系数。

报告共五张卡。主结果口径是 5 折 KFold 交叉验证:表4 给验证折 R²、RMSE、MAE 的均值、折间标准差与 95%CI,另附“训练折均值”与一次留出测试集两列,表5 是逐折明细。卡① 给建模设置与前提诊断(n∶p 比、定量特征尺度差异、VIF、因变量分布形态、疑似数据泄漏、重复观测、预处理泄漏防护);卡③ 给逐折 R² 柱状图、拟合散点与残差图;卡④ 给测试集上 20 次随机重排的置换重要性、Cohen f² 与相对均值基线的 RMSE 降幅;卡⑤ 给论文用的规范表述。这一族八个模块的报告结构相同,但卡① 表3 的七项诊断里,“定量特征尺度差异”一行在本模块的分量与树模型那几篇不同——KNN 的预测就是按距离选出的邻居平均(见下)。

需要准备什么数据

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

数据要求

  • 数据表至少 30 行。
  • 单列缺失率不超过 30%。
  • 不接受取值全都一样的列(零方差列没有可分析的变异)。

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

什么时候用它

  • 自变量个数不多(几个到十几个),而且每一个你都确认与因变量有关
  • 样本在特征空间里分布得比较密,任意一个新样本附近都能找到真正相似的历史样本
  • 局部规律明显但整体说不清——某一小片区域内有自己的规律,全局套不上一个统一的形式
  • 想要一个不做任何分布假设的对照基准,用来衡量别的模型有没有真本事

前提:因变量必须是连续数值且有真实波动。有效样本量建议 ≥30,且“样本量 / 独热编码后特征维度”比值 ≥10;本模块的样本量瓶颈与同族别处不是一回事:不在“样本够不够学”,而是一条会直接报错的硬约束——近邻数 K 不得超过训练集样本数(本次训练集 192 条,上限即 192)。所选变量上有缺失的整行会被剔除。

什么时候不要用它

  • 因变量是类别:用「KNN近邻分类」。
  • 自变量个数多(十几个以上)或独热后维度膨胀:高维空间里所有点的距离趋于相等,“最近的邻居”不再有意义。改用按单个变量逐层切分、不依赖全局距离的「随机森林回归」;确实要保留全部变量又想降维,先做「主成分分析(PCA)」。
  • 样本在特征空间里稀疏或分布很不均:稀疏区域的“最近邻”其实离得很远,预测就是把远处的值搬过来。这种数据用一条全局光滑函数去拟合更合适,比如「支持向量回归(SVR)」。
  • 要系数、置信区间与 p 值:本模块一项都没有;用「线性回归 (最小二乘法)」,自变量多时用「Lasso回归」。
  • 要预测训练取值范围之外的样本:KNN 完全不能外推(见下),用「线性回归 (最小二乘法)」。
  • 观测之间不独立(同一对象多期、分层嵌套):同一个体的记录会互相成为对方的近邻,R² 严重虚高;用「混合模型」或「面板模型」。

容易误读的地方

  • 量纲问题产品已经替你解决了,但“每个特征等权”这个假设还在。 卡① 表3 的“定量特征尺度差异”行显示示例数据里最大/最小标准差比是 32.22(门店面积 vs 广告投入),判定为“已由管线内标准化消除”——建模管线在每个训练折内独立做 z 标准化,尺度差异确实不会传导到距离。但标准化之后,每个自变量在距离里都占同样一份权重:一个与因变量毫无关系的噪声列,照样把它那份随机波动加进距离,把真正的近邻挤走。所以本模块的自变量必须事先精选,“都扔进去让模型决定”那一套行不通,先用「特征筛选」压掉无关列。
  • 卡② 那句过拟合建议对本模块不适用。 本次训练折 R²=0.5447、验证折 R²=0.2889,落差 0.2557,报告给出的文案是“落差较大,过拟合明显,建议减少弱学习器数量/树深或增大样本量”——那是按落差分档发的三档文案之一(落差 ≥0.20 即发此句),八个模块共用同一套,而 KNN 既没有弱学习器也没有树深。在本模块里,对应的动作是把“近邻数K”调大(更多邻居参与平均,预测更平滑、方差更小),或把“权重方式”从 uniform 改成 distance。
  • 卡④ 表7 里的两行数字不是在同一个集合上算的。 “解释力 R²”那行明写“来源:5 折交叉验证”,取值 0.2889;下面“相对均值基线的 RMSE 降幅”21.94% 却是拿留出测试集的 RMSE(11.6720)比同一批测试样本上的均值基线 RMSE(14.9532)算出来的,而交叉验证的 RMSE 均值其实是 10.6905。两行摆在一张表里,很容易被读成同一次评估的两个侧面,往外报时要各自注明口径。还要再退一步:那 48 条测试样本是与交叉验证错开种子另抽的一批,不是某一折的副本;但交叉验证跑在全部 240 条上,它们仍在各折的训练折里,所以那一列不构成第二次独立验证。它也只是一次划分而已:同样 48 条、同一个模型,表5 第 1 折的 R² 是 0.0927,留出那一批却给 0.3882。
  • 本模块的训练折 R² 天然到不了 1,别拿它跟树模型横向比。 0.5447 这个数字是 K=5、权重 uniform 的结果:预测一个训练样本时,它自己也只占五个邻居里的一份,模型不可能把训练集背下来。「极端随机树回归」在默认设置下的训练折 R² 恒为 1.0000。两个模块的“训练折均值”列压根不是同一种东西,跨模块比这一列没有意义;能横着比的只有“交叉验证均值”,而且要连折间标准差与 95%CI 一起看。
  • KNN 完全不能外推,天花板比树模型还硬。 预测就是 K 个最近邻因变量的(加权)平均,取值恒在训练集因变量的最小值与最大值之间;自变量一旦走远,最近的那 5 个邻居不再改变,预测值就固定成一个常数。另外 K 有硬约束:超过训练集样本数会直接报错,提示“请减小 K,或增大样本量 / 调小测试集比例”——注意调大测试集比例会同时缩小训练集,可用的 K 上限也跟着变小。

报告里有什么

  1. 输出结果一:数据概览与前提检验
  2. 输出结果二:主结果表(交叉验证性能)
  3. 输出结果三:可视化(逐折性能 / 拟合散点 / 残差)
  4. 输出结果四:效应量与事后分析
  5. 输出结果五:结论与学术表述
逐折验证 R²(5 折)
图1 逐折验证 R²(5 折)
真实值 vs 预测值(留出测试集)
图2 真实值 vs 预测值(留出测试集)
残差 vs 预测值(留出测试集)
图3 残差 vs 预测值(留出测试集)
三张图分别回答:模型在不同数据划分下稳不稳(逐折 R²)、预测值贴不贴近真实值(散点)、误差是否随预测水平系统性变化(残差图)。

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

在线使用
使用教程