1.scikit-learn 中KNN相关的类库

机器学习经典库scikit-learn中的sklearn.neighbors包集成了近邻法相关的算法,KNN分类树算法使用KNeighborsClassifier,回归树使用KNeighborsRegressor。除此之外,还有KNN的扩展,即限定半径最近邻分类树RadiusNeighborsClassifier和限定半径最近邻回归树RadiusNeighborsRegressor,以及最近质心分类算法NearestCentroid。

在这些算法中,KNN分类和回归的类参数完全一样。限定半径最近邻法分类和回归的类的主要参数也和KNN基本一样。比较特别是的最近质心分类算法,由于它是直接选择最近质心来分类,所以仅有两个参数,距离度量和特征选择距离阈值。

限定半径最近邻算法,即样本中某系类别的样本非常的少,甚至少于K,这导致稀有类别样本在找K个最近邻的时候,会把距离其实较远的其他样本考虑进来,而导致预测不准确。为了解决这个问题,我们限定最近邻的一个最大距离,也就是说,我们只在一个距离范围内搜索所有的最近邻,这避免了上述问题。这个距离我们一般称为限定半径。

最近质心算法首先把样本按输出类别归类。对于第 L类的Cl个样本。它会对这Cl个样本的n维特征中每一维特征求平均值,最终该类别所有维度的n个平均值形成所谓的质心点。对于样本中的所有出现的类别,每个类别会最终得到一个质心点。当我们做预测时,仅仅需要比较预测样本和这些质心的距离,最小的距离对于的质心类别即为预测的类别。这个算法通常用在文本分类处理上。

2.K近邻法类库参数小结

参数 KNeighborsClassifier KNeighborsRegressor RadiusNeighborsClassifier RadiusNeighborsRegressor
KNN中的K值,n_neighbors K值的选择与样本分布有关,通过交叉验证选择较优的K值,默认为5。 如果数据是三维或以下的,可以通过可视化观察来调参 不适用 不适用
限定半径最邻近法中的半radius 不适用于KNN 不适用于KNN 半径的选择与样本分布有关,通过交叉验证来选择较小的半径。 尽量保证每类训练样本其他类别样本的距离较远,默认为1
近邻权weights 主要用于标识每个样本的近邻样本的权重,如果是KNN,即K个近邻样本的权重。可以选择”uniform”, “distance”或自定义权重。 默认为uniform,即权重一样;distance是权重和距离成反比,即距离目标越近,权重越高。也可以通过函数自定义权重。 一般样本分布比较成簇,使用默认的uniform,如果样本分布比较乱,选择distance。如果以上两种效果都不好,需要自定义距离权重。
KNN和限定半径最近邻法使用的算法 三种算法:蛮力实现,KD树,球树。参数’brute’对应蛮力实现,’kd_tree’对应KD树,’ball_tree’对应球树,’auto’自动选择上述三种中拟合最好的最优算法。注意如果输入样本特征是稀疏的,无论选择哪种算法,最后都是使用蛮力算法。 如果样本少特征也少,使用默认的’auto’,如果数据量很大或者特征也很多,’auto’建树时间很长,效率不高,建议使用’kd_tree’,如果发现’kd_tree’比较慢或者样本分布不均匀,可以使用’ball_tree’。
停止建子数的叶子节点阈值leaf_size 这个值控制了使用KD树或者球树时,停止建子树的叶子节点数量的阈值。值越小,树越大,层数越深,建树时间越长。默认是30,一般依赖样本的数量,随着数量的增加,这个值必须要增加,否则建树时间较长,还容易过拟合。可以通过交叉验证选择适中的值。 如果使用的算法是蛮力实现,这个参数可以忽略
距离度量metric 默认欧氏距离,其他有曼哈顿距离,切比雪夫距离,闵可夫斯基距离,马氏距离等
距离度量附属参数p p是使用距离度量参数metric的附属参数,只用于闵可夫斯基和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离,p=2为欧式距离,默认为2
并行处理任务数n_jobs 加快建立knn树和预测搜索的速度,一般用默认的-1,即所有CPU都参与运算
异常点类别选择outlier_label 不适用于KNN 一般设置为训练集里最多样本的类别

3. KNN算法的优缺点

KNN的主要优点有:
1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归
2) 可用于非线性分类
3) 训练时间复杂度比支持向量机之类的算法低,仅为O(n)
4) 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
5) 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合
6)该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分

KNN的主要缺点有:
1)计算量大,尤其是特征数非常多的时候
2)样本不平衡的时候,对稀有类别的预测准确率低
3)KD树,球树之类的模型建立需要大量的内存
4)使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢
5)相比决策树模型,KNN模型可解释性不强

参考: 1.K近邻法(KNN)原理小结 2.scikit-learn K近邻法类库使用小结