关于KNN算法的中k的取值的问题

来源:4-5 超参数

宝慕林0794768

2021-03-26

我从网上自己找的西瓜书的模拟数据, 尝试着自己去找出合适的K值, 数据集有两种分类, 当k为偶数的时候时候,考虑了距离的权重, 之后把k从1到10 进行遍历, 输出结果很诧异, k= 1, 2, 3,4的时候 准确率都是1, 那么这种情况下,我们k值应 给如何去选取呢??? k=1 可以考虑,,会有过拟合, 那k=2 可以吗? 应该如何去理解呢??? 我们又该如何去理解呢???
另外k的遍历范围是多少合适? 从0开始,上限是数据集数量的平方根????
另外结果出现这个情况,是不是和我自己找的数据有关???
图片描述
图片描述

图片描述

写回答

1回答

liuyubobobo

2021-03-26

首先,这说明你的数据太简单了。轻松达到 100%。在这种情况下,请考虑一下,是否有可能你的数据根本不需要使用机器学习的算法,就能很好地作区分。


其次,如果一定要使用 kNN,应该使用较大的 k。因为 k 越小,越容易过拟合;k 越大,越不容易过拟合。这一点,在课程后续介绍过拟合的时候会介绍。整体,让数据不过拟合,是非常重要的,甚至比几个点的准确率还重要。


你给出的 k 的取值范围,从数学的角度,是一个很好的取值范围(2 - 数据集的平方根)。


但是很多时候,k 的取值范围,也和具体业务场景相关。比如一个正常人认识的人的数量不会超过 100 人,那么在对人做分类的时候,可能最多看 100 个人就够了。哪怕你的数据集中有 1 个亿的数据量。


在很多时候,专有的领域有这样的先验知识可以使用。这也是机器学习在解决领域问题的时候,离不开领域专家的原因。(比如机器学习在金融领域的应用,大量依赖已有的金融指标。)


另外,k 从小到大的过程,肯定是从过拟合,到欠拟合的过程。所以,也可以不指定 k 的范围,k 从小到大,计算验证数据集的准确率,这个准确率肯定是一个从逐渐下降的过程(从过拟合,到欠拟合)。可以去观察这条曲线,找到这条曲线最合适的点(比如准确率在 75% 以上的最大的 k)。


这种绘制出一条曲线,曲线中找到一个合适的平衡点,也是机器学习中常用的一种参数选择的方式。这个课程中后续还会介绍一些这类曲线。但这种方式在更复杂的算法中,应用的更多。(比如神经网络,但这个课程不涉及神经网络。)


继续加油!:)

4
3
weixin_慕田峪3059225
回复
liuyubobobo
感谢老师的回复!这个课程真的太良心了。讨论区收获很多,希望老师能够多写文章分享。之后有新课程一定还支持!
2023-10-28
共3条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5850 学习 · 2437 问题

查看课程