为什么有人会使用 KNN 进行回归?

机器算法验证 回归 机器学习 k-最近邻
2022-02-12 04:02:22

据我了解,我们只能建立一个位于训练数据区间内的回归函数。

例如(只需要其中一个面板): 在此处输入图像描述

我将如何使用 KNN 回归器预测未来?同样,它似乎只逼近一个位于训练数据区间内的函数。

我的问题:使用 KNN 回归器有什么优势?我知道它是一个非常强大的分类工具,但它似乎在回归场景中表现不佳。

4个回答

在某些情况下,像 K-NN 这样的局部方法是有意义的。

我在学校做的一个例子与预测各种水泥成分混合物的抗压强度有关。所有这些成分相对于响应或彼此而言都是相对不易挥发的,KNN 对此做出了可靠的预测。换句话说,没有一个自变量具有不成比例的大方差来单独或可能通过相互交互赋予模型。

对此持保留态度,因为我不知道有一种数据调查技术可以最终证明这一点,但直观地说,如果你的特征有一定程度的方差,我不知道什么比例,你可能有一个KNN 候选人。我当然想知道是否有一些研究和由此产生的技术发展到这种效果。

如果您从广义领域的角度考虑它,则会有一大类应用程序,其中类似的“配方”会产生类似的结果。这当然似乎描述了预测混合水泥结果的情况。我会说,如果您有符合此描述的数据,并且您的距离测量对于手头的域也是自然的,最后您有足够的数据,我想您应该从 KNN 或其他本地方法获得有用的结果.

当您使用本地方法时,您还可以获得极低偏差的好处。有时,广义加性模型 (GAM) 通过使用 KNN 拟合每个单独的变量来平衡偏差和方差,这样:

y^=f1(x1)+f2(x2)++fn(xn)+ϵ

加法部分(加号)可防止高方差,而使用 KNN 代替可防止高偏差。fn(xn)

我不会这么快就注销KNN。它有它的位置。

我不想这么说,但实际上简短的回答是,“预测未来”实际上是不可能的,不使用 knn 也不使用任何其他当前存在的分类器或回归器。

当然,您可以推断线性回归的线或 SVM 的超平面,但最终您不知道未来会怎样,据我们所知,这条线可能只是弯曲现实的一小部分。例如,当您查看像高斯过程这样的贝叶斯方法时,这一点变得很明显,一旦您离开“已知输入域”,您就会注意到预测分布存在很大的不确定性。

当然,您可以尝试从今天发生的事情概括到明天可能发生的事情,这可以使用 knn 回归器轻松完成(例如,去年圣诞节期间的客户数量可以很好地提示您今年的数量)。当然,其他方法可能会包含趋势等,但最终你会看到它在股市或长期天气预报方面的效果如何。

首先是“我将如何使用 KNN 回归器预测未来?”的示例。

预测明天 的日照时间 训练数据:过去 10 年的sunt+1sunt..sunt6
sunt

表示weektsunt..sunt6tomorrow(weekt))sunt+1

方法:将 3650-odd曲线放入 kd 树中,k=7。 给定一个新的, 用他们的_9查找它的 10 个最近邻周, 并计算加权平均数weekt
week
tomorrow0..tomorrow9
predict(week)tomorrow0..tomorrow9

调整权重,参见例如 inverse-distance-weighted-idw-interpolation-with-python
以及 7d 中“最近邻”的距离度量。

“使用 KNN 回归器有什么优势?”
对于其他人的好评,我会添加易于编码和理解的内容,并且可以扩展到大数据。缺点:对数据和调优敏感,了解
不多


(关于术语的长脚注:
“回归”用作“将模型拟合到数据”的花哨词。
最常见的是使用线性模型拟合到目标同样常见的是 根据过去一周或一年的 价格预测明天的股票价格 预报员称其为 ARMA、自回归移动平均模型 或自回归模型 。另见 回归分析XY
Yt=b0Xt+b1Xt1+...
Yt+1
Yt+1=a0Yt+a1Yt1+...

所以你的第一行“我们只能建立一个位于训练数据区间内的回归函数”似乎是关于“回归”这个令人困惑的词。)

田航宇指出,当没有足够的数据和方法(如线性回归)做出更强有力的假设时,k-NN 回归不会做得很好,可能会优于 k-NN。然而,关于 k-NN 的惊人之处在于,您可以使用不同的权重对各种有趣的假设进行编码。例如,如果您对数据进行归一化,然后使用作为数据中所有之间的权重,这实际上将近似于良好的老式线性回归!当然,与其他线性回归方法相比,它会不必要地慢,但关键是你实际上有很大的灵活性。作为参考,这称为线性内核。k(x,x)=xxxxx,x

我玩弄了生成您附加的照片的笔记本。如该示例所示,我认为没有太多理由使用均匀或距离权重进行 k-NN 回归。所以我将其更改为使用 RBF 权重。这意味着它将像 scipy.interpolate.Rbf 一样,只是我们只查看最近的邻居。显然,查看 k 个最近的邻居并不能提高准确性,但是当您拥有大型数据集时,这对性能至关重要。我还将邻居的数量增加到 10。此外,我认为您应该与真实函数进行比较,而不是与嘈杂的数据进行比较。我们的目标是逼近真实函数并忽略所有噪声。此外,为了有一个基线,我将其与 CubicSpline 进行了比较。我还使用了 80 个示例,而不仅仅是 40 个。我在时间轴上使用了不同的轴,因为这会影响密度,这是任何 k-NN 方法性能的重要因素。即使我改变了轴上的界限,k-NN 插值也能很好地工作。它通常比原始数据更接近原始函数。所以我认为这个特定的例子只需要做一些工作。无论如何,使用 k-NN 的一般原因是它比查看整个数据集要快。因此,基于 k-NN 的回归将比高斯过程更具可扩展性。它也非常简单、直观和可预测。您可以在附图中看到三次样条在某些区域显示出一些奇怪的行为。神经网络也相对不可预测。 在此处输入图像描述 在此处输入图像描述

我们还可以看到,随着数据的增多,k-NN 会变得更好。与此同时,三次样条开始变得疯狂,高斯过程开始变得太慢。

这里我们使用两倍的数据量。 在此处输入图像描述

我认为这个故事的寓意是,k-NN 可以根据您定义距离和权重的方式做非常不同的事情。实际上,您甚至可以使用带有多项式内核的 k-NN 来插值多项式,就像我们使用三次样条一样。或者因为这里的底层函数是 sin,所以使用周期性内核是最有意义的。有关更多信息,请参阅内核手册https://www.cs.toronto.edu/~duvenaud/cookbook/