![深入浅出Python机器学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/94/44510094/b_44510094.jpg)
3.2.3 K最近邻算法用于回归分析
在scikit-learn的数据集生成器中,有一个非常好的用于回归分析的数据集生成器,make_regression函数,这里我们使用make_regression生成数据集来进行实验,演示K最近邻算法在回归分析中的表现。
首先我们还是先来生成数据集,输入代码如下:
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P48_22460.jpg?sign=1738949819-4oP9LRKCXdqigscWeguZoQRTRr1LMI8U-0-11cf32b663f86cb3dd5c4954ec6cb7fd)
为了方便画图,我们选择样本的特征数量仅为1个,同时为了增加难度。我们添加标准差为50的noise,运行代码,将会得到如图3-11所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P48_3544.jpg?sign=1738949819-MCiPyH5qiww9rNd1EYs0A29d7XiqMBLw-0-36d9bb174b3f21ffa80d8e69fc9ff2d3)
图3-11 使用make_regression生成的数据集
【结果分析】从图3-11中我们可以看到,横轴代表的是样本特征的数值,范围大概在-3~3;纵轴代表样本的测定值,范围大致在-250~250。
下面我们使用K最近邻算法来进行回归分析,输入代码如下:
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P49_22461.jpg?sign=1738949819-NJFC7DlXMYD664AAtKewMYqkzdL5wbDC-0-d78b57abb6b14a867c286f8b6c8d9887)
运行代码,将会得到如图3-12所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P49_22466.jpg?sign=1738949819-jZLNi9n8A7EkjaffGzhtgMCrRXgpdn1I-0-63cec79338d7db6dda227ac40eba94b3)
图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所示。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P50_3829.jpg?sign=1738949819-n9gykT4j0CHN4GvRvt1jtgLndXHaiOl0-0-9a26ffaaffaaf1a4aca72341151da6d1)
图3-13 最近邻数为5时KNN回归模型的得分
【结果分析】模型的得分只有0.77,这是一个差强人意的结果,和我们目测的情况基本一致,为了提高模型的分数,我们将K最近邻算法的近邻数进行调整。由于在默认的情况下,K最近邻算法的n_neighbors为5,我们尝试将它减少。
输入代码如下:
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P50_22469.jpg?sign=1738949819-gsd9nYxtqC3WFirHQ1v8PEBS3JB2wFU6-0-2e45a19871c9040a839afc14ae09b27b)
在这段代码中,我们将K最近邻算法的n_neighbors参数降低为2,再次运行代码,将会得到如图3-14所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P50_3844.jpg?sign=1738949819-GcGTuBVCmPm18DBY094IKMZJzg0NwCQ2-0-64e3f4805ca3bbb3d16e6972223f9720)
图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所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P51_3976.jpg?sign=1738949819-yL1Xe9RSLAfL1W48ylpWnixvTlUbGqhD-0-4e1b2c1e35c9ebcf345390c71453f0d6)
图3-15 降低n_neighbors参数数值后的模型得分
【结果分析】和我们预料的一样,模型的评分从0.77提升到了0.86,可以说是有显著的提升。不过以上都是基于我们虚构的数据所进行的实验,接下来我们用一个来自真实世界的数据集来进行K最近邻算法的实战。