如何定义kNN分类器的最大k?

Posted

技术标签:

【中文标题】如何定义kNN分类器的最大k?【英文标题】:How to define the maximum k of the kNN classifier? 【发布时间】:2014-05-24 00:29:10 【问题描述】:

我正在尝试使用 kNN 分类器来执行一些监督学习。为了找到 kNN 的最佳“k”个数,我使用了交叉验证。例如,以下代码加载一些 Matlab 标准数据并运行交叉验证以绘制关于交叉验证误差的各种 k 值

load ionosphere;
[N,D] = size(X)
resp = unique(Y)

rng(8000,'twister') % for reproducibility
K = round(logspace(0,log10(N),10)); % number of neighbors
cvloss = zeros(numel(K),1);
for k=1:numel(K)
    knn = ClassificationKNN.fit(X,Y,...
        'NumNeighbors',K(k),'CrossVal','On');
    cvloss(k) = kfoldLoss(knn);
end
figure; % Plot the accuracy versus k
plot(K,cvloss);
xlabel('Number of nearest neighbors');
ylabel('10 fold classification error');
title('k-NN classification');

结果看起来像

在这种情况下,最好的 k 是 k=2(这不是穷举搜索)。从图中我们可以看出,k>50后交叉验证误差急剧上升。在 k>100 后,它会出现很大的误差并变得稳定。

我的问题是我们应该在这种交叉验证框架中测试的最大 k 是多少?

例如,“电离层”数据中有两个类。一类标记为“g”,一类标记为“b”。总共有 351 个实例。 'g' 有 225 例,'b' 有 126 例。

在上面的代码中,它选择了最大的 k=351 进行测试。但是我们应该只测试 1 到 126 还是最多 225?测试用例与最大 k 数之间是否存在关系?谢谢。 A.

【问题讨论】:

我建议你在crossvalidated问这个问题。 【参考方案1】:

在分类过程中增加要考虑的邻居数量会使您的分类器成为平均值选择。你只需要检查你的类的比率,看看它是否等于错误率。

由于您使用的是交叉验证,因此您应该选择与错误率最小值相对应的 k 作为值。在这种情况下,如果没有记错,它是 3。

请记住,交叉验证参数会在您选择 k 时引入偏差。那里需要更详细的分析,但你的 10 应该适合这种情况。

【讨论】:

【参考方案2】:

您不希望k 太大(即与示例数量太接近),因为那样每个查询示例的k 邻域包含很大一部分空间,因此预测依赖较少较少关注查询的实际位置,而更多关注整体统计信息。这就解释了为什么性能对大 k 不好。您的分类器本质上总是选择“g”,并在图中看到错误126/351=35%

理论表明k 需要随着标记示例数量的增长而增长,但呈次线性增长。 当您有大量训练数据时,您希望k 很大,因为您希望对查询点附近的点获得每个标签的可能性有一个很好的估计。这允许模仿最大后验决策规则(这是最佳的,假设您知道实际分布)。

所以这里有一些实用技巧:

    如果可以,请获取更多数据。然后再次运行实验。 关注k 的小值。我敢打赌k=3k=2 好。通常对于二进制分类,k 至少为 3,并且通常是奇数(以避免平局)。 您看到k=2 更好的事实是没有意义的。因此,k=1k=2 不同的唯一情况是两个最近的邻居具有不同的标签。但是,在这种情况下,决定是随机或任意做出的(例如,总是选择“g”)。这取决于knn算法的实现。我的猜测是,在您使用的算法中,决定是固定的,并且在平局的情况下,它选择“g”,这 恰好 总体上更有可能。如果您切换标签的角色,您可能会发现k=1k=2 好。

如果看到 k 的小值(例如 1 - 20)的图会很有趣。

参考资料: nearest neighbor classification

【讨论】:

【参考方案3】:

在分类问题中选择参数的最佳方式是通过专业性来选择它。你所做的肯定不是这个。如果您的数据足够小,可以使用不同的参数值进行大量分类,您会这样做,但为了合理,您需要表明您选择的参数不是随机选择的,您需要解释 plot 的行为你画的。

在这种情况下,函数是升序的,所以你可以看出 2 是最好的选择。

在大多数情况下你不会选择超过 20 的 K,但是没有证据,你需要做分类,直到你能证明你的选择。

【讨论】:

以上是关于如何定义kNN分类器的最大k?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中测量knn分类器的准确性

不平衡数据集的 Knn 分类器

KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践

KNN分类器最近邻分类KD树KNN分类的最佳K值基于半径的最近邻分类器KNN多分类KNN多标签分类KNN多输出分类KNN分类的优缺点

KNN 分类器算法不适用于所有情况

KNN分类器