![深入浅出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=1739526128-DgKJuM9EqBuz5VzqVCI4jl9rtiSQOGwU-0-68b2c64a86ed7fe30a9a3f041195855d)
为了方便画图,我们选择样本的特征数量仅为1个,同时为了增加难度。我们添加标准差为50的noise,运行代码,将会得到如图3-11所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P48_3544.jpg?sign=1739526128-hXueC1jIlurlPaqm5OPgWaU7hnjCtXRF-0-dc317a041d777afd476060f0822c257a)
图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=1739526128-DY82xR5AnpSsNJM743O5J1uM4lz6voaa-0-6582765b104d1c24423f9d973060e991)
运行代码,将会得到如图3-12所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P49_22466.jpg?sign=1739526128-F67tSqxrMQtD10LNMM64nSjHyK9IUB6j-0-f8437a5673b40cb4dc4dfc77e658a37a)
图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=1739526128-0g8QRIjOPB6R7dW8Jj7bJehNIz0movKf-0-c6b5320303e0c2aa7e7d0877c2d9c181)
图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=1739526128-Lf51fSRQaD3xOaARksHICZwTGPX6zx41-0-4b3ef5c006ec3f1277e504422989a353)
在这段代码中,我们将K最近邻算法的n_neighbors参数降低为2,再次运行代码,将会得到如图3-14所示的结果。
![](https://epubservercos.yuewen.com/89A715/23721687209561106/epubprivate/OEBPS/Images/Figure-P50_3844.jpg?sign=1739526128-wIul3nsXrshulLSxYtm10NyY6FOdI4VZ-0-c48e86fdf9d466f98ecaddeee2369f33)
图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=1739526128-V8TxAI7XexNtrQvMuGJeybqVU5GHEkWp-0-cd2324fb75358952d1396f7bd506a622)
图3-15 降低n_neighbors参数数值后的模型得分
【结果分析】和我们预料的一样,模型的评分从0.77提升到了0.86,可以说是有显著的提升。不过以上都是基于我们虚构的数据所进行的实验,接下来我们用一个来自真实世界的数据集来进行K最近邻算法的实战。