《机器学习实战》—— KNN(K近邻算法)

《机器学习实战》可以说是学习ML的必备书籍,连载本书中的重点算法。重点在算法和思想,避免涉及数学和理论推导。
由于现在已经有现成的库,不管是Sklearn还是keras,所以算法基本不需要我们自己去写,调用库就可以,但是必须要知道如何要去调参,也就是每个算法涉及到的参数,如何调整,能效果更好。

1.基本概念:

k近邻作为监督学习的入门算法,是数据分析不可缺少的一部分。
适用情况:对于一系列有标签的数据D1,我们想对某个或某些数据D2进行分类。我们首先,分别计算D2与D1各个数据的距离(此处多种度量方法),计算得出距离,然后对这些数据按距离远近排序,距离小在前面。然后,选择排在前k(即KNN中的k)个的数据,作为参考对象。对于前k个数据,统计每个类别出现的频率,频率大的(也就是出现次数多的)作为该数据D2的预测类别。

2.算法伪代码:

算法-对未知类型的数据集中的点执行下列操作:
    1>分别计算改点与已经类型数据集中的每个点之间的距离;
    2>按距离递增排序;
    3>选取距离最小的前k个点;
    4>统计这k个点,对应类别,每个类别出现的频率;
    5>这k个点,对应类别,出现频率最高的作为当前点的预测分类;

3. 算法注意点:

3.1 归一化数值:

在使用knn对数据进行预测之前,我们首先要对数据做归一化,因为每个特征的大小差很多,例如有的特征值1000多,有的个位数,如果不归一化,不同特征的权重会差很多。同时会影响到收敛速度。当然在进行数据分析的时候,并不是每个特征对分类的贡献完全相同。我们可以分析特征,对特征赋予不同的特征值。

3.2 算法优缺点:

优点
简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
可用于数值型数据和离散型数据;
训练时间复杂度为O(n);无数据输入假定;
对异常值不敏感。

缺点:
计算复杂性高;空间复杂性高;
样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。
最大的缺点是无法给出数据的内在含义,即没有显式的训练过程,我们不知道式根据哪些特征,如何做出的预测。

4.算法实战

接下来的每个算法,我们都会说明如何调用Sklearn来实现,说明sklearn各个参数的含义。括号内的均为默认值。
image.png

4.1 参数:

  • n_neighbors:默认为5,就是k-NN的k的值,选取最近的k个点。
  • weights:默认是uniform,参数可以是uniform、distance,也可以是用户自己定义的函数。uniform是均等的权重,就说所有的邻近点的权重都是相等的。distance是不均等的权重,距离近的点比距离远的点的影响大。用户自定义的函数,接收距离的数组,返回一组维数相同的权重。
  • algorithm:快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。ball tree是为了克服kd树高纬失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。
  • leaf_size:默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。需要根据问题的性质选择最优的大小。
  • metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度量)。
  • p:距离度量公式。在上小结,我们使用欧氏距离公式进行距离度量。除此之外,还有其他的度量方法,例如曼哈顿距离。这个参数默认为2,也就是默认使用欧式距离公式进行距离度量。也可以设置为1,使用曼哈顿距离公式进行距离度量。
  • metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。
  • n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。如果为-1,那么CPU的所有cores都用于并行工作。

4.2 方法:

  • fit(X, y):使用X作为训练数据,y作为训练标签(目标值)来拟合模型(分类器)
  • get_params([deep]):得到分类器的参数
  • kneighbors([X, n_neighbors, return_distanced]):返回一个点的k近邻
  • kneighbors_graph([X, neighbors, mode]):
  • predict(X):预测类别未知数据X的类别
  • predict_proba(X):返回数据X预测的各类别的概率
  • score(X,y[,sample_weight]):对于测试数据,返回预测的得分结果
  • set_params( **params):设置分类器的参数
    用到最多的便是,fit、predict、score

参考资料:

1。《机器学习实战》
2。《机器学习》-周志华
3。http://blog.csdn.net/c406495762/article/details/75172850#41-knn算法的优缺点
建议阅读大神的博客,《机器学习实战》中代码有些过时,而且讲解不够明白,他的博客给出了详细的过程和解释,再参阅西瓜书和《机器学习实战》可以事半功倍。

猜你喜欢

转载自blog.csdn.net/linxid/article/details/79271847