【发布时间】:2016-02-26 08:14:25
【问题描述】:
我正在做一个分类(不是聚类)。我可以为此使用kNN算法吗?要测试的理想 k 值是多少?在一些堆栈流答案中,我看到他们建议使用特征数量的平方根。但是这个规则是从哪里来的呢?有人可以帮我吗:)
【问题讨论】:
-
@NominSim 我从你的回答中找到了“特征数量的平方根”:) 所以请帮助我
标签: machine-learning classification knn
我正在做一个分类(不是聚类)。我可以为此使用kNN算法吗?要测试的理想 k 值是多少?在一些堆栈流答案中,我看到他们建议使用特征数量的平方根。但是这个规则是从哪里来的呢?有人可以帮我吗:)
【问题讨论】:
标签: machine-learning classification knn
一般而言,k 被选择为 sqrt(n),其中 n 是数据点的数量,而不是特征。 但是验证模型的唯一方法是通过测试数据上的错误。
我通常做的是,从数据集中选择几个随机数据点,然后为它们找到 k 个最近的邻居。从所选点计算具有不同类别的邻居的数量。如果不同类别的邻居数量过多,则改变k的值。
【讨论】:
最佳 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 值。选择非常小的 K 值会导致决策边界不稳定。 K 的值可以选择为 k = sqrt(n)。其中 n = 训练数据中的数据点数 K值首选奇数。
以下方法的大部分时间都在工业中遵循。初始化一个随机的 K 值并开始计算。得出错误率和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最小错误率。得出精度和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最大精度。尝试在误差曲线和准确度曲线之间找到 K 的折衷值。
【讨论】: