Loading

K-近邻算法(KNN)


返回 我的研究方向(Research Interests)



K-近邻算法(k-Nearest Neighbor,KNN)


定义与理解

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

来源:KNN算法最早是由Cover和Hart提出的一种分类算法

举个例子来说明:
假如我在北京,我又不知道我在哪个区,但是我认识5个人,他们知道自己在哪个区,那我就打电话问他们每个人的到我的距离,1号离我最近,那么我就可以认为我和1号在一个区。即根据我的“邻居”来推断出我所在的区。

image

欧式距离(euclidean metric)

两个样本的距离可以通过如下公式计算,又叫欧式距离(euclidean metric,也叫欧几里得度量)
比如:\(a(a_1, a_2, a_3), b(b_1, b_2, b_3)\)

\[\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+(a_3-b_3)^2} \]


k-近邻算法优缺点


优点:

简单,易于理解,易于实现,无需估计参数,无需训练(不用迭代训练,程序运行一次就可以)

缺点:

懒惰算法,对测试样本分类时的计算量大,内存开销大,必须指定K值,K值选择不当则分类精度不能保证

使用场景

小数据场景,几千一几万样本,具体场景具体业务去测试

K取多大

  • K值取很小:容易受到异常值点影响

  • K值取很大:容易受K值数量(类别)波动,比如说,10个数据中,K取5,模型认10个中有一半是邻居


案例:预测入住位置


Facebook V: Predicting Check Ins URL:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data
image

数据说明:

  • train.csv,test.csv
    • row_id:签到事件的ID
    • xy:坐标
    • 精度:位置精度
    • 时间:时间戳
    • place_id:商家的ID,这是您要预测的目标
  • sample_submission.csv-带有随机预测的正确格式的样本提交文件

代码实现(sklearn库)

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

  • n_neighbors:int,可选(默认=5) , k_neighbors,查询默认使用的邻居数
  • algorithm: {'auto',‘ball_tree',‘kd_tree',‘brute'},可选用于计算最近邻居的算法:‘ball_ree'将会使用BallTree,‘kd_tree'将使用KDTree。‘auto'将尝试根据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)

查看训练数据
image
由于数据量太大了,我们可以缩小范围,取其中的一小部分
image
我们可以从现有的特征中构造出新的特征
image
比如说这里的时间,形式是时间戳,我们可以转成年月日,形成新的特征,加入
image
对于签到数小于3的,我们不计入(这也是偷懒)
image
从下面的结果可以看出,经过我们的处理,数据量已经减少了不少
image
把特征值和目标值分离出来
image
对数据集进行划分,按照 训练集:测试集=75%:25%
image
不使用交叉验证进行求解
image
使用交叉验证进行求解
image


posted @ 2021-04-19 18:28  言非  阅读(521)  评论(0编辑  收藏  举报