机器学习算法中,KNN(K-Near-est Neighbor,K最近邻)算得上是较基础且易于理解的算法之一了。它既可以用于分类任务,也可以用于回归任务。
KNN算法的原理十分容易理解:它识别k个最近的数据点(基于欧几里得距离)来进行预测,它分别预测邻域中最频繁的分类或是回归情况下的平均结果。用通俗的话讲,已知过去三个月房地产板块在跌,过去三个月银行板块在涨。现在给你一个公司让你判断他过去三个月股票的走势。通过简短的了解,你发现这家公司主营业务是房地产,企图转型还未实施,这时,你大概率会判断他过去三个月的股价是跌的。
对于回归任务来说,KNN的工作机理也是相似的。例如,你打算去吃一顿饭,在同一家饭店发现菜价都十分接近的菜单。鱼香肉丝的价格是12元,青椒肉丝的价格是10元,而你想吃小煎肉的售价未知,基于这家饭店的菜价都十分相近,你觉得可能小煎肉的价格为11元,即前面两种菜的的均值。
今天我们来逐一演示一下KNN在分类当中的应用,回归就下次演示了。
二、KNN算法用于分类
1.载入数据集并查看
scikit-learn内置了一些供大家学习的玩具数据集(toy dataset),其中有些是分类任务的数据,有些是回归任务的数据。
首先西西使用一个最简单的数据集来给大家演示KNN算法在分类中的应用。输入代码如下:
首先我们看下数据集存储了样本的哪些特征,代码如下:
可以看出,数据集中的样本共有4个特征,分别是sepallength(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)和petal width(花瓣宽度)。
下面再来看一下这些样本被分为几类,输入代码如下:
可以发现系统返回了一个数组,数组中的数字有0,1和2。这说明数据集中的样本分为3类,分别用0、1、2这3个数字来表示。
到这里,相信朋友们也已经明白,这个数据集的目的是:根据样本鸢尾花萼片和花瓣的长度及宽度,结合分类标签来训练模型,以便让模型可以预测出某一种鸢尾花属于哪个分类。
2.拆分数据集
下面,我们就来把数据集拆分为训练集和验证集,以便验证模型的准确率。先输入如下代码:
上面的运行结果可以看出,我们将数据集的特征赋值给了X,而将分类标签赋值给了y。通过查看X的形态,可知样本数量共有150个,每个样本有4个特征。
下面来对数据集进行拆分,代码如下:
上面的运行结果可以看到,通过拆分,训练集中的样本数量为112个其余的38个样本则进入了验证集。
3.训练模型并评估准确率
下面训练一个最简单的KNN模型,代码如下:
使用KNN算法训练的分类模型,在训练集中的准确率达到了98%,在验证集中的准确率达到了0.95%。
需要说明的是,在scikit-leam中,KNN可以通过调节n_neighbors参数来改进模型的性能。在不手动指定的情况下,KNN默认的近邻参数n_neighbors为5。那么这个参数是最优的吗?
使用网格搜索法来寻找到模型的最优参数。
运行结果可以看到,当n_neighbors参数为6时,模型的准确率是最高的。
下面我们就来看一下当把n_neighbors设置为6时,模型的准确率。
【结果分析】从上面的代码运行结果可以看到,当把n_neighbors参数设置为6时,模型在训练集中的准确率提高到了96%,可以说倒退了;而在验证集中的准确率保持在100%左右,显著提升、
Copyright © 2024-2025 成都宁时科技有限公司 版权所有