深入浅出Python机器学习
上QQ阅读APP看书,第一时间看更新

3.2.1 K最近邻算法在分类任务中的应用

在scikit-learn中,内置了若干个玩具数据集(Toy Datasets),还有一些API让我们可以自己动手生成一些数据集。接下来我们会使用生成数据集的方式来进行展示,请大家在Jupyter notebook中输入代码如下:

在这段代码中,我们使用了scikit-learn的make_blobs函数来生成一个样本数量为200,分类数量为2的数据集,并将其赋值给X和y,然后我们用matplotlib将数据用图形表示出来,运行代码,会得到如图3-4所示的结果。

图3-4 使用make_blobs生成的数据集

【结果分析】从图3-4中可以看出,make_blobs生成的数据集一共有两类,其中一类用深色表示,而另外一类用浅色表示。读者朋友可能有点疑惑:这不是已经进行好分类了吗?我们还需要K最近邻算法做什么呢?

这确实是初学者非常容易提出的问题,答案是这样的——我们这里生成的数据集,可以看作机器学习的训练数据集,是已知的数据。我们就是基于这些数据用算法进行模型的训练,然后再对新的未知数据进行分类或者回归。

下面我们就使用K最近邻算法来拟合这些数据,输入代码如下:

运行代码,会得到如图3-5所示的结果。

图3-5 使用K最近邻算法创建的分类模型

【结果分析】从图3-5中我们可以看到,K最近邻算法基于数据集创建了一个分类模型,就是图中粉色区域和灰色区域组成的部分。那么如果有新的数据输入的话,模型就会自动将新数据分到对应的分类中。

例如,我们假设有一个数据点,它的两个特征值分别是6.75和4.82,我们来试验下模型能不能将它放到正确的分类中,首先我们可以在上面那段代码中,plt.show()之前加一行代码如下:

#把新的数据点用五星表示出来
plt.scatter(6.75,4.82, marker='*', c='red', s=200)

再次运行代码,会得到结果如图3-6所示。

图3-6 新的数据点所在的位置

【结果分析】图3-6中五角星就代表了新的数据点所在的位置,可以看到K最近邻算法将它放在了下方的区域,和浅色的数据点归为了一类。

下面我们再验证一下,输入代码如下:

#对新数据点分类进行判断
print('\n\n\n')#这一行代码主要是为了让截图好看一些
print('代码运行结果:')
print('==============================')#打印分隔符让结果美观一些
print('新数据点的分类是:',clf.predict([[6.75,4.82]]))
print('==============================')#同上
print('\n\n\n') #这一行代码主要是为了让截图好看一些

运行代码,我们将得到结果如图3-7所示。

图3-7 分类器对新数据点的分类判断

【结果分析】看起来,K最近邻算法的工作成果还是很不错的,不过这可能是因为我们这次的任务有点太简单了。下面我们给它增加一点难度——处理多元分类任务。