KNN

现在,如果我们有一个分类任务。需要用到scikit-learn库的分类器对象。

分类器要完成的任务是,给定一种鸢尾花卉的测量数据,为这种花卉分类。最简单的分类器是近邻分类器。近邻算法搜索训练集,寻找与用作测试的新个体最相似的观测记录。

讲到这里,弄清楚训练集和测试集这两个概念很重要。如果确实只有一个数据集,也没关系,重要的是不要使用同一份数据同时用于训练和测试。鉴于此,把数据集分为两部分:一部分专门用于训练算法,另一部分用于验证算法。

因此,在讲解后面的内容之前,我们先把Iris数据集分为两部分。最好是先打乱数组各元素的顺序,然后再切分,因为数据往往是按特定顺序采集的,比如Iris数据集就是按照种类进行排序的。我们用NumPy的random.permutation( )函数打乱数据集的所有元素。打乱后的数据集依旧包含150条不同的观测数据,其中前140条用作训练集,剩余10条用于测试集。


在我们将数据集划分为两部分之后,我们就可以使用KNN算法了。导入KneighborsClassifier,调用分类器的构造函数,然后使用fit( )函数对其进行训练。



我们用140条观测数据训练knn分类器,得到了预测模型。我们随后将验证它的效果。分类器应该能够正确预测测试集中10条观测数据所对应的类别。要获取预测结果,可直接在预测模型knn上调用predict( )函数。最后,将预测结果与y_test中的实际值进行比较。



我们可以看到,只有一个数据预测错误了,错误率仅为10%。我们可以在用萼片测量数据绘制的2D散点图中,画出决策边界。



我们可以看到散点图中,有小块区域伸入到其他决策边界之中。我们再使用花瓣数据绘制的散点图中,一样可以画出决策边界。



如图所示,我们使用花瓣数据描述鸢尾花卉的特征,也一样能够得到相应的决策边界。

Diabetes数据集

scikit-learn库提供了多个数据集,其中就有Diabetes(糖尿病)数据集。人们首次使用它是在2004年。从那时起,人们拿它作为例子,广泛应用于各种预测模型的研究和评估中。

从这个数据集加载数据前,先要从scikit-learn库中导入datasets模块。然后调用load_diabetes( )函数加载数据集,我们也可以将它存储在一个变量diabetes中。该数据集包含了442位病人的生理数据以及一年之后的病情发展情况,后者即为目标值。前10列数据表示生理数据,分别表示以下特征:1.年龄 2.性别 3.体质指数 4.血压 5.S1~S6(六种血清的化验数据)。

我们调用data属性就可以获取到测量数据。查看数据集,就会发现这些数据和我们想象中的数据差别很大。例如我们来看一下第一位病人的10个数据。



这些数据是经过特殊处理得到的。10个数据中的每一个都做了均值中心化处理,然后又用标准差乘以个数数量调整了数值范围。验证就会发现任何一列的所有数值之和为1,比如对年龄这一列求和,我们会发现它的总和近似为1。



即使这些数据因为经过规范化处理,所以难以读懂,但是我们只需要知道它们表示10个生理特征就可以了,这些数据照样对我们很有帮助。

表明疾病进展的数据,用target属性就可以得到啦!我们接下来预测得到的结果必须也要与之相符。



这样我们就得到了442个介于25到346之间的整数数据。下面我们将要用这些数据进行我们的实验环节。