机器学习之K近邻算法--KNN

KNN算法是解决分类问题的。
1.基本假设
越相近越相似
原则:少数服从多数,一点一票
2.算法原理
①算距离
给定测试对象 Item,计算它与训练集中每个对象的距离。
②找邻居
圈定距离最近的k个训练对象,作为测试对象的近邻。
③做分类
根据这k个近邻归属的主要类别,来对测试对象进行分类。
自邻居集合NN中取出前k名,查看它们的标签,对这k个点的标签求和,以多数决,得到可能类别。
3.距离类模型中距离的确认
k-NN算法基本思想我们已经知道了,其模型的表示形式是整个数据集。除了对整个数据集进行存储之外,k-NN没有其他模型。因此,k-NN不具有显式的学习过程,在做「分类」时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。k-近邻法实际上利用了训练数据集对特征向量空间进行划分,并作为其分类的 “模型” 。
当特征数量有很多个形成多维空间时,再用上述的写法就不方便了,我们换一个写法,用 X 加下角标的方式表示
特征维度。则在n维空间中,有两个点 A 和 B,它们的坐标分别为:
在这里插入图片描述
则A和B两点之间的欧氏距离的基本计算公式如下:
在这里插入图片描述
4.手写代码的实现
第一步:构建数据集,提取出特征和标签
导入我们需要使用的库,x特征矩阵,y是标签。定义一个要预测的新样本,变量名为new_data
机器学习之K近邻算法--KNN_第1张图片
我们可以画一个散点图,看一下样本以及预测样本的分布情况
机器学习之K近邻算法--KNN_第2张图片
第二步:计算已知类别数据集中的点与当前点之间的距离
机器学习之K近邻算法--KNN_第3张图片
第三步:运用排序的方法找邻居,并选取一个K值(这里我们将K值设置为3)
机器学习之K近邻算法--KNN_第4张图片
第四步:确定前 k 个点所在类别的计数
机器学习之K近邻算法--KNN_第5张图片
第五步:选择出现次数最多的类别作为当前点的预测类别
机器学习之K近邻算法--KNN_第6张图片
最后的分类结果是0,也就是新的一杯酒是「黑皮诺」。
5.sklearn库算法的实现
通过我们手写代码可以看出,比较麻烦,sklearn库可以很好的实现并找到最优的K值,节省了时间。
①建模
由下图可以看出,当K值等于5时,模型的预测分数是0.921,可以看出测试集的预测效果是好的。
机器学习之K近邻算法--KNN_第7张图片
②不同k的取值对模型的影响
如果选择的 k 值较小,就相当于较小的邻域中的训练实例进行预测,这时候只有与输入实例较近的(相似的)训练实例才会对预测结果起作用,但缺点是预测结果会对近邻的实例点非常敏感。如果邻近的实例点恰好是噪声,预测就会出错。相反地,如果选择的 k 值较大,就相当于较大的邻域中的训练实例进行预测。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误。因此,超参数 k 的选定是 KNN的头号问题。
最优K值的选取,我可以用学习曲线,交叉验证的方法。
Ⅰ、学习曲线
机器学习之K近邻算法--KNN_第8张图片
定义一个循环,让K值的范围在1~20之间,我们通过图表可以看出,最优K值是7,此时的分数达到了0.938左右。
Ⅱ、交叉验证
我们的确追求模型的效果,但我们追求的是模型在未知数据集上
的效果,在陌生数据集上表现优秀的能力被称为泛化能力,即我们追求的是模型的泛化能力。
我们认为,如果模型在一套训练集和数据集上表现优秀,那说明不了问题,只有在众多不同的训练集和测试集上都表现优秀,模型才是一个稳定的模型,模型才具有真正意义上的泛化能力。我们追求的是泛化能力好的模型,就是具有很好的预测能力,为此,机器学习领域有着发挥神作用的技能:「交叉验证」,来帮助我们认识模型。
机器学习之K近邻算法--KNN_第9张图片
由上图我们可以看出,交叉验证的学习曲线,找出了模型的准确率高,方差还相对较小的点,这样的点泛化能力才是最强的。就是6这个点。
③距离类问题需要注意量纲不统一的情况,我们可以用标准化或是归一化解决。这里我们用归一化。
什么是归一化呢?我们把X放到数据框中来看一眼,你是否观察到,每个特征的均值差异很大?有的特征数值很大,有的特征数值很小,
这种现象在机器学习中被称为 “量纲不统一”。KNN是距离类模型,欧氏距离的计算公式中存在着特征上的平方和:
在这里插入图片描述
当数据(x)按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就称作数据归一化(Normalization,又称Min-Max Scaling)。
在这里插入图片描述
用python根据数学公式实现归一化:
机器学习之K近邻算法--KNN_第10张图片
在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。
机器学习之K近邻算法--KNN_第11张图片
注意:一定要先划分数据集,在进行归一化
④以距离作为惩罚因子的优化
我们可以选择合适的惩罚因子,让入选的k个点在最终判别目标点属
于某类别过程发挥的作用不相同,即让相对较远的点判别效力更弱,而相对较近的点判别效力更强。这一点也可以减少 KNN算法对 k 取值的敏感度。
重要参数:weights
关于惩罚因子的选取有很多种方法,最常用的就是根据每个最近邻 xi距离的不同对其作加权,加权方法为设置 wi 权重,该权重计算公式为:
在这里插入图片描述
如果数据本身存在大量异常值点,则采用距离远近作为惩罚因子则会有较好的效果,反之则不然。在sklearn中,我们可以通过参数weights来控制是否适用距离作为惩罚因子。
完整代码:

  1. 不带惩罚因子

机器学习之K近邻算法--KNN_第12张图片
机器学习之K近邻算法--KNN_第13张图片

  1. 加上惩罚因子
    机器学习之K近邻算法--KNN_第14张图片
    机器学习之K近邻算法--KNN_第15张图片
    通过对比,我们发现,模型的准确率一样,并没有起到优化的作用,这时候我们可以不用加惩罚因子。
    以上就是KNN算法啦~,我们只要知道KNN的基本假设,和原理,根据数学原理写出python代码就很容易啦,sklearn库可以更简单的实现KNN算法,找出最优的K值,可以更好的预测出新样本的标签是什么,根据均值和方差查看模型的平均效果和稳定情况。

你可能感兴趣的:(机器学习之K近邻算法--KNN)