机器学习系列——KNN算法(中)

各位看官,下午好!又到了新的一期文章更新之时,上期文章中,笔者和大家聊了一下机器学习算法中的KNN算法,对KNN算法的来源以及原理等进行了说明,并且给出了KNN算法的Python程序。这期文章,笔者将继续和大家聊聊KNN的那些事。本期的主题是通过KNN算法去改进约会配对。

凡事预则成,不预则废,本期文章将讲解KNN算法在对约会数据进行分类分析时的步骤,因此在文前,笔者首先对本文的分析步骤进行梳理:

(一)数据准备

本文所采用的数据可以在https://github.com/TinyPrince/Machine_Learning/tree/KNN中下载,DatingTestSet.txt便是本文分析所采用的数据集。笔者将用python中的pandas库来读入数据,并将数据进行分类,主要分成属性数据和标签数据,这样便于运用我们在前一篇文章中所编写的分类函数。同时,为了分析数据的需要,笔者也会使用matplotlib库进行绘图分析,因此各位看官如果尚未安装pandas和matplotlib库,就请使用以下命令进行这两个python库的安装。

pip install pandas

pip insatll matplotlib

再一次友情推荐一下,如果刚入手Python,请直接安装Anaconda软件包,这会极大程度上避免后期安装各种库的困扰,当然如果你已经是Python大神的话,那就自动忽略这句提醒吧。在做好这些前期准备之后,下面就可以开心地使用Python来导入与分析数据了。

通过以上命令,笔者将用于分析的约会配对数据集导入进了python之中,并且将数据集拆分为了属性数据和标签数据。当查看数据特征时,可以看出属性数据的列名称为0,1,2,这很不便于介绍数据,因此笔者顺便将原数据的列名称换成Flying,Game 以及Icecream,分别用来表示飞行公里数、玩游戏时间以及冰淇淋的食用量(不得不说女主还真心是一个吃货呀,这点像我);同时可以看出,训练数据集的标签主要分为三类largeDoses,smallDoses与didntLike,分别表示非常喜欢,有好感以及毫无感觉。在对数据有了初步印象之后,下面便可以展开对约会配对数据的进一步分析。

(二)分析数据

在导入了约会数据之后,接下来笔者就带领各位看官浏览一下数据的相关特征。为了在图形中更加清晰地看出各个属性之间的关系,我们选取原数据集中的一部分数据来进行分析。

可以看出,飞行距离与玩游戏时间存在一定的正相关,为了更清晰地分析看出这种关系以及更好地看出这种关系以及看出每种人群下的这种关系,笔者通过将每种人群标之以不同的颜色,来进一步说明这种关系,具体代码如下:

可以看出最被喜欢的人生活习惯不会过于极端,每年的飞行里数以及花在游戏上的时间都处于中等水平;同时可以看出没有感觉的人的飞行数与游戏时间存在着很强的正相关。从属性数据中,还可以看出飞行数的数值过大,这会使得距离的计算过度依赖于飞行数,为了避免这个问题,笔者下面对属性数据进行归一化处理。

(三)准备数据:数据的归一化处理

因为飞行数据的数值对于距离计算的影响较大,因此,为了使所有指标具有同等的重要性,有必要对原数据进行归一化处理,处理的方式就是用每一个数据除以数据所在数据集的极差。公式表示为:

其中,min和max分别表示数据集中的最小值和最大值。归一化的数据处理算法如下所示:

可以看出,算法已经将原数据中的属性数据进行了归一化处理,为了方便后面使用归一化后的数据,这里,笔者将归一化的数据重新赋值给NormData:

现在拥有了归一化的数据NormData,这样在归类的距离计算中便不会再出现过度依赖现象,因此,笔者可以很方便地采用归一化后的数据进行分类测试。

(四)测试算法:验证分类器

上文已经按照需要对原数据进行了处理,本部分则将测试分类器的效果。所谓分类器的效果就是指算法的正确率或者说错误率(分类出错的数量占参与计算样本数据数量的比例),错误率越小,分类越有效,否则分类越无效。这里笔者随机从约会配对数据集中挑选出10%的数据作为测试数据集,因为原测试数据集自身已经随机排列,因此,这里可以简单地选取数据前10%的数据作为测试数据集,检验错误率的程序如下:

注意使用错误率程序之前,请导入上期文章中的分类函数classification,最后在运行了这个分类器函数之后,便可以得到:

可以看出分类器的错误率为2.4%,结果还是比较令人满意的(这里请允许笔者稍微得意一番)。当然,也可以通过改变测试函数之中的TestRatio值和K值,来得出更多的错误率结果,这里笔者不再赘述。既然分类测试结果还算可以,那么便可以运用此分类器对约会数据进行分类了。

(五)使用算法:构建实用程序

上文对分类器已经进行了检验,并得到较为满意的测试结果,因此,下面便可以通过输入相关的分类数据从而得出样本所属的类别。实用程序如下:

一旦在命令行中运行上述程序,将会得到相关的提示,按照提示输入数值,此时便会得出相关的分类结果,这里笔者分别为三个值输入10,10,10,最终程序判断的结果是didntLike,见下面程序与结果。

至此,笔者完成了对于约会配对数据的分类分析,各位看官可以在阅读的同时随手实践,如果按照笔者的提示,你最终会得到如期输出。

结语

本期文章写到这里就算结束了,本期文章通过运用分类器对约会配对数据进行了分类分析,进一步加深了对于KNN算法的了解与运用,为KNN算法的进一步运用奠定了基础。下一期文章,笔者将继续探索KNN算法,当然下一期文章也将是KNN算法系列的最后一篇文章,在下期文章中,笔者将介绍怎么用KNN算法实现手写识别系统,同时,笔者也将在下一期文章中介绍python机器学习中的优秀库scikit-learn。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180327G1U29U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券