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

3.2.3 K最近邻算法用于回归分析

在scikit-learn的数据集生成器中,有一个非常好的用于回归分析的数据集生成器,make_regression函数,这里我们使用make_regression生成数据集来进行实验,演示K最近邻算法在回归分析中的表现。

首先我们还是先来生成数据集,输入代码如下:

为了方便画图,我们选择样本的特征数量仅为1个,同时为了增加难度。我们添加标准差为50的noise,运行代码,将会得到如图3-11所示的结果。

图3-11 使用make_regression生成的数据集

【结果分析】从图3-11中我们可以看到,横轴代表的是样本特征的数值,范围大概在-3~3;纵轴代表样本的测定值,范围大致在-250~250。

下面我们使用K最近邻算法来进行回归分析,输入代码如下:

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

图3-12 使用K最近邻算法对数据进行回归分析

【结果分析】图3-12中黑色的曲线代表的就是K最近邻算法拟合make_regression生成数据所进行的模型。直观来看,模型的拟合程度并不是很好,有大量的数据点都没有被模型覆盖到。

现在我们尝试给模型进行评分,看看结果如何,输入代码如下:

print('\n\n\n')
print('代码运行结果:')
print('==============================')
print('模型评分:{:.2f}'.format(reg.score(X,y)))
print('==============================')
print('\n\n\n')

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

图3-13 最近邻数为5时KNN回归模型的得分

【结果分析】模型的得分只有0.77,这是一个差强人意的结果,和我们目测的情况基本一致,为了提高模型的分数,我们将K最近邻算法的近邻数进行调整。由于在默认的情况下,K最近邻算法的n_neighbors为5,我们尝试将它减少。

输入代码如下:

在这段代码中,我们将K最近邻算法的n_neighbors参数降低为2,再次运行代码,将会得到如图3-14所示的结果。

图3-14 n_neighbors=2时的模型

【结果分析】从图3-14中我们可以看到,相对于图3-10来说,黑色曲线更加积极地试图覆盖更多的数据点,也就是说,模型变得更复杂了。看起来比n_neighbors等于5的时候更加准确了,我们再次进行评分,看看分数是否有了提高。

输入代码如下:

print('\n\n\n')
print('代码运行结果:')
print('==============================')
print('模型评分:{:.2f}'.format(reg2.score(X,y)))
print('==============================')
print('\n\n\n')

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

图3-15 降低n_neighbors参数数值后的模型得分

【结果分析】和我们预料的一样,模型的评分从0.77提升到了0.86,可以说是有显著的提升。不过以上都是基于我们虚构的数据所进行的实验,接下来我们用一个来自真实世界的数据集来进行K最近邻算法的实战。