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])
参考资料:
以上是关于KNN(最近邻)分类算法的主要内容,如果未能解决你的问题,请参考以下文章