kNN 中用于分类的理想 k 值
Ideal k value in kNN for classification
我正在进行分类(不是聚类)。我可以为此使用 kNN 算法吗?要测试的理想 k 值是多少?在一些 stackflow 答案中,我看到他们建议使用特征数量的平方根。但是这个规则是从哪里来的呢?有人可以帮我吗:)
最好的 K 是在给定数据集以及它如何泛化到未见数据的情况下为您提供最佳性能的那个。
K-NN 的工作方式是根据样本之间的特征相似性在样本之间构建图表。每个样本都连接到 K 个最相似的样本。对于给定样本的 K 个邻居的预测,选择在 K 个邻居中拥有多数票且因此在邻域中最常见的标签作为预测标签。
K 绝对应该低于 (#samples - 1),因为在这种情况下,所有样本都是连接的,然后将为所有未标记样本预测具有最高训练样本的标签。
如果 k 等于 1,我们说未标记样本(test/unseen 样本)的标签应该等于与其最相似样本的标签。
如果您对自己的特征非常确定并且知道最相似的训练样本足以进行预测,则应该选择一个非常低的 K(比如 1)。
如果你不确定你的特征,你应该选择一个高 K。你想要更多的样本来投票。
这就像你喜欢少数专家为某事投票或所有人都为某事投票。
如何为你的问题选择合适的K?
您应该为开发集保留部分数据。遍历不同的 K 值(例如从 1 到 #samples-1),看看哪个给你最好的结果。
但是,经验法则是如果样本数量足够多(例如特征数量的 10 倍),那么特征数量的平方根应该是一个很好的初始猜测,但您需要循环考虑不同的 K 值,看看哪一个最适合您。
要检查结果,您需要知道许多样本的标签,但假设您没有。您尝试通过遍历不同的 K 值来预测这些样本的标签。您将预测标签与已知标签进行比较并测量准确性(或 F 度量),然后选择能为您提供最佳性能的最佳 K(例如最高F 测量)。
记得缩放你的特征值,使它们都在 0 和 1 之间(归一化)。
并检查使用和不使用每个功能的性能,以查看哪些功能实际上有助于预测任务。
我建议使用 scikit-learn 的 k 最近邻实现 here
在一般概念中,k被选择为sqrt(n),其中n 是数据点的数量,而不是特征。
但是验证模型的唯一方法是通过测试数据的错误。
我通常做的是,从数据集中选择几个随机数据点,然后找到 k 个最近的邻居,them.Count 个邻居的数量different 类 from the selected point.If 不同 类 的邻居数量太多,然后更改 k 的值。
没有预定义的统计方法可以找到最有利的 K 值。选择非常小的 K 值会导致决策边界不稳定。 K 的值可以选择为 k = sqrt(n)。其中 n = 训练数据中的数据点数 首选奇数作为 K 值。
行业中大部分时间都遵循以下方法。初始化一个随机的K值,开始计算。得出错误率和 K 之间的图,表示定义范围内的值。然后选择具有最小错误率的 K 值。导出精度和 K 之间的图,表示定义范围内的值。然后选择具有最大精度的 K 值。尝试在误差曲线和精度曲线之间找到 K 的权衡值。
我正在进行分类(不是聚类)。我可以为此使用 kNN 算法吗?要测试的理想 k 值是多少?在一些 stackflow 答案中,我看到他们建议使用特征数量的平方根。但是这个规则是从哪里来的呢?有人可以帮我吗:)
最好的 K 是在给定数据集以及它如何泛化到未见数据的情况下为您提供最佳性能的那个。
K-NN 的工作方式是根据样本之间的特征相似性在样本之间构建图表。每个样本都连接到 K 个最相似的样本。对于给定样本的 K 个邻居的预测,选择在 K 个邻居中拥有多数票且因此在邻域中最常见的标签作为预测标签。
K 绝对应该低于 (#samples - 1),因为在这种情况下,所有样本都是连接的,然后将为所有未标记样本预测具有最高训练样本的标签。
如果 k 等于 1,我们说未标记样本(test/unseen 样本)的标签应该等于与其最相似样本的标签。
如果您对自己的特征非常确定并且知道最相似的训练样本足以进行预测,则应该选择一个非常低的 K(比如 1)。
如果你不确定你的特征,你应该选择一个高 K。你想要更多的样本来投票。
这就像你喜欢少数专家为某事投票或所有人都为某事投票。
如何为你的问题选择合适的K? 您应该为开发集保留部分数据。遍历不同的 K 值(例如从 1 到 #samples-1),看看哪个给你最好的结果。
但是,经验法则是如果样本数量足够多(例如特征数量的 10 倍),那么特征数量的平方根应该是一个很好的初始猜测,但您需要循环考虑不同的 K 值,看看哪一个最适合您。
要检查结果,您需要知道许多样本的标签,但假设您没有。您尝试通过遍历不同的 K 值来预测这些样本的标签。您将预测标签与已知标签进行比较并测量准确性(或 F 度量),然后选择能为您提供最佳性能的最佳 K(例如最高F 测量)。
记得缩放你的特征值,使它们都在 0 和 1 之间(归一化)。
并检查使用和不使用每个功能的性能,以查看哪些功能实际上有助于预测任务。
我建议使用 scikit-learn 的 k 最近邻实现 here
在一般概念中,k被选择为sqrt(n),其中n 是数据点的数量,而不是特征。 但是验证模型的唯一方法是通过测试数据的错误。
我通常做的是,从数据集中选择几个随机数据点,然后找到 k 个最近的邻居,them.Count 个邻居的数量different 类 from the selected point.If 不同 类 的邻居数量太多,然后更改 k 的值。
没有预定义的统计方法可以找到最有利的 K 值。选择非常小的 K 值会导致决策边界不稳定。 K 的值可以选择为 k = sqrt(n)。其中 n = 训练数据中的数据点数 首选奇数作为 K 值。
行业中大部分时间都遵循以下方法。初始化一个随机的K值,开始计算。得出错误率和 K 之间的图,表示定义范围内的值。然后选择具有最小错误率的 K 值。导出精度和 K 之间的图,表示定义范围内的值。然后选择具有最大精度的 K 值。尝试在误差曲线和精度曲线之间找到 K 的权衡值。