1、机器学习实战K-近邻算法(2)上一小结学习了简单的k-近邻算法的实现方法,但是这并不是完整的k-近邻算法流程,k-近邻算法的一般流程:收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。准备数据:使用Python解析、预处理数据。分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。测试算法:计算错误率。使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。实战例程1:使用kNN改进某约会网站的配对效果实战背景实战背景海伦女士一直使用在线约会网站寻找适合
2、自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现自己交往过的人可以进行如下分类:1.不喜欢的人2.魅力一般的人3.极具魅力的人海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有1000行。海伦收集的样本数据主要包含以下3种特征:1.每年获得的飞行常客里程数2.玩视频游戏所消耗时间百分比3.每周消费的冰淇淋公升数在将上述特征数据输入到分类器前,必须将待处理的数据的格式改变为分类器可以接收的格式。分类器接收的数据是什么格式的?从上节讲解我们已经知道,要将数据分类两部分,即特征矩阵和
3、对应的分类标签向量。下面我们先处理数据。截取的部分数据格式如下:运行结果如下:可以看到,我们已经顺利导入数据,并对数据进行解析,格式化为分类器需要的数据格式。接着我们需要了解数据的真正含义。可以通过友好、直观的图形化的方式观察数据。准备数据:数据归一化我们很容易发现,上面方程中数字差值最大的属性对计算结果的影响最大,也就是说,每年获取的飞行常客里程数对于计算结果的影响将远远大于其他两个特征,即玩视频游戏所耗时间占比和每周消费冰淇淋公斤数的影响。而产生这种现象的唯一原因,仅仅是因为飞行常客里程数远大于其他特征值。但海伦认为这三种特征是同等重要的,因此作为三个等权重的特征之一,飞行常客里程数并不应
4、该如此严重地影响到计算结果。归一化:归一化:处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处理为到或者-到之间。下面的公式可以将任意取值范围的特征值转化为到区间内的值:newValue=(oldValue-min)/(max-min)其中min和max分别是数据集中的最小特征值和最大特征值。虽然改变数值取值范围增加了分类器的复杂度,但为了得到准确结果,我们必须这样做。运行结果可以看到,我们已经顺利将数据归一化了,并且求出了数据的取值范围和数据的最小值,这两个值是在分类的时候需要用到的,直接先求解出来,也算是对数据预处理了测试算法:验证分类器测试算法:验证分类器机
5、器学习算法一个很重要的工作就是评估算法的正确率,通常我们只提供已有数据的90%作为训练样本来训练分类器,而使用其余的10%数据去测试分类器,检测分类器的正确率。需要注意的是,10%的测试数据应该是随机选择的,由于海伦提供的数据并没有按照特定目的来排序,所以我们可以随意选择10%数据而不影响其随机性。截取的部分运行结果如下:我们可以改变函数datingClassTest内变量hoRatio和分类器k的值,检测错误率是否随着变量值的变化而增加。依赖于分类算法、数据集和程序设置,分类器的输出结果可能有很大的不同。使用算法:构建完整可用系统使用算法:构建完整可用系统我们可以给海伦一个小段程序,通过该程
6、序海伦会在约会网站上找到某个人并输入他的信息。程序会给出她对男方喜欢程度的预测值。输入数据(12,5000,0.5),预测结果是”你可能有些喜欢这个人”,也就是这个人魅力一般。一共有三个档次:讨厌、有些喜欢、非常喜欢,对应着不喜欢的人、魅力一般的人、极具魅力的人。实战背景对于需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素x32像素。尽管采用本文格式存储图像不能有效地利用内存空间,但是为了方便理解,我们将图片转换为文本格式,数字的文本格式如下。实战例程2:手写识别系统与此同时,这些文本格式存储的数字的文件命名也很有特点,格式为:数字的值_该数字的样本序号对于这样已
7、经整理好的文本,我们可以直接使用Python处理,进行数字预测。数据集分为训练集和测试集,使用前面的方法,同样可以实现分类。运行的部分分类结果如下:Sklearn实现实现k-近邻算法简介近邻算法简介Scikitlearn也简称sklearn,是机器学习领域当中最知名的python模块之一。sklearn包含了很多机器学习的方式:Classification分类Regression回归Clustering非监督分类Dimensionalityreduction数据降维ModelSelection模型选择Preprocessing数据与处理使用sklearn可以很方便地让我们实现一个机器学习算法。
8、一个复杂度算法的实现,使用sklearn可能只需要调用几行API即可。所以学习sklearn,可以有效减少我们特定任务的实现周期。sklearn.neighbors模块实现了k-近邻算法。内容如下:我们知道数字图片是32x32的二进制图像,为了方便计算,我们可以将32x32的二进制图像转换为1x1024的向量。对于sklearn的KNeighborsClassifier输入可以是矩阵,不用一定转换为向量,不过为了跟之前的k-近邻算法分类器对应上,这里也做了向量化处理。然后构建kNN分类器,利用分类器做预测。部分结果如下:上述代码使用的algorithm参数是auto,更改algorithm参数
9、为brute,使用暴力搜索,我们会发现,运行时间变长了。更改n_neighbors参数,会发现不同的值检测精度也是不同的。我们可以自己可以尝试更改这些参数的设置,加深对其函数的理解。总结总结kNN算法的优缺点优点:1.简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;2.可用于数值型数据和离散型数据;3.训练时间复杂度为O(n);无数据输入假定;4.对异常值不敏感。缺点:1.计算复杂性高;空间复杂性高;2.样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);3.一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。4.最大的缺点是无法给出数据的内在含义。