KNN(最近邻)分类算法

Posted blowinginthewind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KNN(最近邻)分类算法相关的知识,希望对你有一定的参考价值。

一、算法原理

KNN算法是机器学习中最基本算法之一,属于惰性学习算法的典例。惰性指模型仅通过对训练数据集的记忆功能进行预测,而不产生判别函数。

KNN算法本身很简单,归纳为如下几步:
①选择近邻数量k和距离度量的方法
②找到待分类样本的k个最近邻
③根据最近邻类标进行多数投票

二、超参数(结合sklearn.neighbors.KNeighborsClassifier)

2.1 n_neighbors(近邻个数, default = 5)

k近邻算法的k,近邻个数。

一般的根据经验k=5是最能得到最佳效果的点,但在实际开发过程中需要进行验证。

强调一点,如果在1到10中求得最佳k值为10,那么有必要对10以上的值选择区间再进行测试,因为可能含有效果更好的k值。

2.2 weights(距离权重, default = ‘uniform‘)

基本的KNN算法仅仅通过找到待分类样本最近的k个样本进行多数投票,但可能存在如下情况:


 
技术图片

如果按照投票的方式,应该分为蓝色类别,但从距离上看,样本距离红色类别更近,划为红色似乎更加合理,这里就需要引入距离权重的概念。
在KNeighborsClassifier中有一个参数weight,不指定该参数的情况下默认为uniform也就是多数投票,也可以指定weight为distance,即可采用距离权重的方式进行分类。

2.3 p(距离类型, default = 2)

分类时候使用的距离是什么距离?距离的种类有很多,最常见的有欧氏距离,此外还有曼哈顿距离。

 
技术图片

如图给出的绿色的直线就是欧式距离,其他的线虽然走法不同但距离是一样的,都是曼哈顿距离。
当p为1时,等价于曼哈顿距离,p=2时等价于欧氏距离。当p>2时,基于minkowski距离计算。

2.4 algorithm(求解算法, default=‘auto‘)

KNN算法复杂度较高,可以使用树结构优化,如KD-Tree、Ball-Tree等高效寻找近邻。

三、 算法缺点

3.1 效率低下

假如一个数据集有m个样本n中特征,则预测一个样本的时间复杂度为O(mn),即需要和m个样本求距离并挑选前k个,每个特征维度都需要计算距离,故需要O(mn)。可以使用树结构优化,如KD-Tree、Ball-Tree等。

3.2 预测不具有可解释性

3.3 维数灾难

随着维数增加,看似很近的两个点距离越来越大。

 四、超参数调整

一般调整‘n_neighbors‘, ‘weights‘ 和 ‘p‘即可。

#KNN网格搜索

knears_params = {‘n_neighbors‘: list(range(1,11,1)), 
weights: [uniform,distance], p: [1,2,3,4,5,6]} grid_knears = GridSearchCV(KNeighborsClassifier(n_jobs=-1), knears_params, scoring=roc_auc, n_jobs=-1) grid_knears.fit(X_train, y_train) knears_neighbors = grid_knears.best_estimator_ print(knears_neighbors) knears_score = cross_val_score(knears_neighbors, X_train, y_train, cv=5, scoring=roc_auc) knears_neighbors.fit(X_train,y_train) print(Knears Neighbors Cross Validation Auc Score, knears_score.mean().astype(str)[:4],

and Test Auc Score, roc_auc_score(y_test, knears_neighbors.predict_proba(X_test)[:, 1])astype(str)[:4])

 

参考资料:

https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier

 

以上是关于KNN(最近邻)分类算法的主要内容,如果未能解决你的问题,请参考以下文章

KNN最近邻分类算法

K-近邻(KNN)算法

分类 :kNN(k nearest neighbour)最近邻算法(Python)

K-近邻算法(KNN)

K最近邻算法

分类算法——k最近邻算法(Python实现)(文末附工程源代码)