我正在尝试使用kNN分类器来执行一些有监督的学习。为了找到最佳数量的' k'对于kNN,我使用了交叉验证。例如,以下代码加载一些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之后变得很大并且变得稳定。
我的问题是我们应该在这种交叉验证框架中测试的最大值是多少?
例如,电离层中有两个类。数据。一个标记为' g'一个标记为' b'。共有351个实例。对于' g'有225个案例,而且' b'有126个案例。
在上面的代码中,它选择要测试的最大k = 351。但是我们应该只测试1到126或高达225吗?测试用例和k的最大数量之间是否存在关系?谢谢。甲
答案 0 :(得分:1)
在分类问题中选择参数的最佳方法是通过专业性来选择它。你当然在做什么不是这个。如果您的数据足够小,可以使用不同的参数值进行大量分类,那么您将这样做,但为了合理,您需要证明您选择的参数不是随机选择的,您需要解释绘图的行为你画了。
在这种情况下,函数是升序的,所以你可以告诉2是最好的选择。
在大多数情况下,您不会选择K超过20,但没有证据,您需要进行分类,直到您可以证明您的选择。
答案 1 :(得分:0)
您不希望k
过大(即过于接近示例数),因为每个查询示例的k
邻域都包含大部分空间,因此预测越来越少地依赖于查询的实际位置,而更多地依赖于整体统计。这解释了为什么性能不适合大k
。你的分类器基本上总是选择'并且如你在图中看到的那样错误126/351=35%
。
理论认为,k
需要随着标记示例的数量增长而增长,但需要亚线性增长。
当您有大量的训练数据时,您希望k
变大,因为您希望很好地估计查询点附近的点获取每个标签的可能性。这允许模仿最大的后验决策规则(假设您知道实际分布,这是最优的)。
以下是一些实用技巧:
k
的小值。我敢打赌,k=3
优于k=2
。通常对于二进制分类k
至少为3,通常为奇数(以避免联系)。k=2
更好的事实没有意义。因此,k=1
与k=2
不同的唯一情况是2个最近邻居具有不同的标签。但是,在这种情况下,决定是随机的或任意的(例如总是选择' g)。这取决于knn算法的实现。我的猜测是,在你使用的算法中,决定是固定的,并且在一个平局的情况下,它选择' g'只是发生更有可能整体。如果您切换标签的角色,您可能会发现k=1
优于k=2
。 看一下k
的小值(例如1 - 20)的情节会很有趣。
答案 2 :(得分:0)
在分类期间增加要考虑的邻居数量会使您的分类器成为平均值选择。您只需要检查类的比率,看它是否等于错误率。
由于您使用的是交叉验证,因此您应该选择与错误率最小值相对应的k作为值。在这种情况下,如果没有误,它就是3。
请记住,交叉验证参数会在您选择k时引入偏差。那里需要进行更精细的分析,但是对于这种情况你的10应该没问题。