Docs
Introduction
K近邻算法(K-nearest neighbors, KNN)是一种很基本朴实的机器学习方法。在模式识别领域中,KNN是一种用于分类和回归的非参数统计方法。在这两种情况下,输入包含特征空间中的 k个最接近的训练样本。因此,在sklearn中,KNN也分为KNeighborsClassifier
和KNeighborsRegressor
两种更加细致的算法,Classifier
用于分类中,输出一些离散的枚举值,如电影分类问题,而Regressor
用于回归预测中,输出一般连续的值,如房价预测问题。
Core Concept
KNN 在我们日常生活中也有类似的思想应用,比如,我们判断一个人的人品,往往只需要观察他最密切的几个人的人品好坏就能得到结果了。这就是 KNN 的思想应用,**KNN 方法既可以做分类,也可以做回归。**在本篇内容中,我们来给大家展开讲解 KNN 相关的知识原理。
- 若 K=1,则该对象的类别直接由最近的一个节点赋予。
在 KNN 回归中,输出是该对象的属性值。该值是其 K 个最近邻居的值的平均值。
Step
总的来说,就是在K的最近邻样本中找出出现频率最大的类别作为位置样本的频率。本质上是对空间区域的划分。
Example
常见的问题豆子分类问题、电影分类,都可以用KNN来解决,这里介绍一下一个房价预测的例子:假如一套房子打算出租,但不知道市场价格,可以根据房子的规格(面积、房间数量、厕所数量、容纳人数等),在已有数据集中查找相似(K近邻)规格的房子价格,看别人的相同或相似户型租了多少钱。
详细的代码实现不记录下来,可以参考:https://www.showmeai.tech/tutorials/34?articleId=187
已知的数据集中,每个已出租住房都有房间数量、厕所数量、容纳人数等字段,并有对应出租价格。将预计出租房子数据与数据集中每条记录比较计算欧式距离,取出距离最小的5条记录,将其价格取平均值,可以将其看做预计出租房子的市场平均价格。
Disadvantage And Optimize
优缺点
- 优点:精度高、对异常值不敏感、无数据输入假定。
- 缺点:计算复杂度高、空间复杂度高。
- 适用数据范围:数值型和标称型。
核心要素:距离度量准则
核心要素:K的大小
对于 KNN 算法而言,K 的大小取值也至关重要,如果选择较小的 K 值,意味着整体模型变得复杂(模型容易发生过拟合),模型学习的近似误差(approximation error)会减小,但估计误差(estimation error)会增大。
如果选择较大的 K 值,就意味着整体的模型变得简单,减少学习的估计误差,但缺点是学习的近似误差会增大。
在实际的应用中,一般采用一个比较小的 K 值。并采用交叉验证的方法,选取一个最优的 K 值。
在实际的问题中,k到底取多少? 这是一个很重要的问题,一般来说工程问题都有一些trick,而在机器学习中关于参数k的取值,可以使用网格搜索来寻找最优的参数。网格搜索是一种常用的参数优化方法,它通过枚举可能的参数值来找到最优的参数。
网格搜索大致的过程如下:
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'n_neighbors': [3, 5, 7, 9, 11],
'weights': ['uniform', 'distance']}
# 创建网格搜索对象
grid_search = GridSearchCV(knn, param_grid, cv=5)
# 进行网格搜索
grid_search.fit(X, y)
# 输出最优参数
print(grid_search.best_params_)
实际上,在房价预测的example中,3-11的取值都不是knn的最佳范围,最最优值应该为35,n_neighbors
的值取的这么大,推测可能是维度增高的原因。
事实上,在这个房价预测的例子中,网格搜索的速度比我自己写寻找最佳参数的算法还慢…
缺点
只考虑了样本数量而忽略了距离。
评论区