用于分类的 kNN 中的理想 k 值

Posted

技术标签:

【中文标题】用于分类的 kNN 中的理想 k 值【英文标题】:Ideal k value in kNN for classification 【发布时间】:2016-02-26 08:14:25 【问题描述】:

我正在做一个分类(不是聚类)。我可以为此使用kNN算法吗?要测试的理想 k 值是多少?在一些堆栈流答案中,我看到他们建议使用特征数量的平方根。但是这个规则是从哪里来的呢?有人可以帮我吗:)

【问题讨论】:

@NominSim 我从你的回答中找到了“特征数量的平方根”:) 所以请帮助我 【参考方案1】:

一般而言,k 被选择为 sqrt(n),其中 n 是数据点的数量,而不是特征。 但是验证模型的唯一方法是通过测试数据上的错误。

我通常做的是,从数据集中选择几个随机数据点,然后为它们找到 k 个最近的邻居。从所选点计算具有不同类别的邻居的数量。如果不同类别的邻居数量过多,则改变k的值。

【讨论】:

我正在使用 10 折交叉验证。我有 1000 个用户的 93 个功能。根据我的场景,n 的值是多少? 1000 个用户意味着您的数据集中有 1000 行,ryt 吗?那么 n 是 1000。顺便说一句,对于 k 来说,这不是一些硬性规定。你应该尝试我在答案中提到的,从值 sqrt(n) 开始并相应地更改值。 不是 n = 训练数据中的数据点数吗?如果是的话不是n=900(因为我用的是10折交叉验证) 是的你,我错过了交叉验证部分。 谢谢 :) 顺便说一句,还有一个问题。在我的问题中,我有 2 节课。我听说在 2 类问题中,k 值应该是奇数。所以当取 900 的平方根时,它是 30(这是一个偶数)。这将是什么解决方案。我应该使用 29 还是 31? :)【参考方案2】:

最佳 K 是在给定数据集以及它如何泛化到未见数据的情况下为您提供最佳性能的 K。

K-NN 的工作方式是根据样本之间的特征相似性在样本之间构建图表。每个样本都连接到 K 个最相似的样本。对于给定样本的 K 个邻居的预测,选择在 K 个邻居中拥有多数票且在邻域中最常见的标签作为预测标签。

K 绝对应该低于 (#samples - 1),因为在这种情况下,所有样本都已连接,然后将为所有未标记的样本预测具有最高训练样本的标签。

如果 k 等于 1,我们是说未标记样本(测试/未见样本)的标签应该等于与其最相似的样本的标签。

如果您对自己的特征非常确定并且知道最相似的训练样本足以进行预测,那么您应该选择一个非常低的 K(比如 1)。

如果您不确定自己的功能并且希望更多样本投票支持,您应该选择高 K。

这就像您希望少数专家为某事投票或所有人为某事投票。

如何为您的问题选择合适的 K? 您应该将部分数据用于开发集。循环遍历不同的 K 值(例如,从 1 到 #samples-1),看看哪一个给你最好的结果。

但是,经验法则是,如果样本数量足够多(例如,特征数量的 10 倍),那么特征数量的平方根应该是一个很好的初始猜测,但您需要遍历不同的K 值,看看哪一个最适合您。

要检查结果,您需要知道一些样本的标签,但假设您没有这些标签。您尝试通过循环 K 的不同值来预测这些样本的标签。您将预测的标签与已知标签进行比较并测量准确度(或 F 度量),然后选择能够提供最佳性能的最佳 K(例如最高F 度量)。

记得缩放特征值,使它们都在 0 和 1 之间(归一化)。

并检查每个特征在使用和不使用的情况下的性能,以了解哪些特征实际上有助于预测任务。

我建议使用 scikit-learn 的 k 最近邻实现 here

【讨论】:

在你的回答中,最好的 k 值是训练数据集中特征数或点数的平方根? :) 我有 1000 个用户的 93 个功能。你能告诉我我应该考虑什么值来获得平方根:) PS:我使用10折交叉验证 我会说尝试 2^0、2^1、2^2、2^3、2^4、2^5 和 2^6 并检查每个表演,然后选择表现最好的一。他们说对 K 使用奇数,这样对于每个社区,您都可以获得多数票。如果您的图不是二进制的(边权重不是 0 和 1,当您使用样本特征的余弦相似度时会发生这种情况),那么您不需要选择奇数个邻居。【参考方案3】:

没有预定义的统计方法可以找到最有利的 K 值。选择非常小的 K 值会导致决策边界不稳定。 K 的值可以选择为 k = sqrt(n)。其中 n = 训练数据中的数据点数 K值首选奇数。

以下方法的大部分时间都在工业中遵循。初始化一个随机的 K 值并开始计算。得出错误率和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最小错误率。得出精度和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最大精度。尝试在误差曲线和准确度曲线之间找到 K 的折衷值。

【讨论】:

以上是关于用于分类的 kNN 中的理想 k 值的主要内容,如果未能解决你的问题,请参考以下文章

使用类包中的 knn() 在 R 中查找 k-Nearest-Neighbor

Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻

机器学习之KNN鸢尾花分类

K近邻分类算法实现 in Python

K-近邻(KNN)算法

1. KNN算法