深入浅出KNN算法(二) sklearn KNN实践

港控/mmm° 2022-12-22 14:27 257阅读 0赞

上次介绍了KNN的基本原理,以及KNN的几个窍门,这次就来用sklearn实践一下KNN算法。

一.Skelarn KNN参数概述

要使用sklearnKNN算法进行分类,我们需要先了解sklearnKNN算法的一些基本参数,那么这节就先介绍这些内容吧。

  1. def KNeighborsClassifier(n_neighbors = 5,
  2. weights = 'uniform',
  3. algorithm = '',
  4. leaf_size = '30',
  5. p = 2,
  6. metric = 'minkowski',
  7. metric_params = None,
  8. n_jobs = None
  9. )
  10. - n_neighbors: 这个值就是指KNN中的"K"了,前面说到过,调整K值,算法会有不同的效果。
  11. - weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,
  12. 比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,
  13. 决定了如何分配权重。参数选项如下:
  14. 'uniform':不管远近权重都一样,就是最普通的 KNN 算法的形式。
  15. 'distance':权重和距离成反比,距离预测目标越近具有越高的权重。
  16. 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
  17. - algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,
  18. 1. 暴力法,就是直接计算距离存储比较的那种放松。
  19. 2. 使用 kd 树构建 KNN 模型
  20. 3. 使用球树构建。 其中暴力法适合数据较小的方式,否则效率会比较低。
  21. 如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,
  22. 则可以试试球树来构建 KNN
  23. 参数选项如下:
  24. 'brute' :蛮力实现
  25. 'kd_tree'KD 树实现 KNN
  26. 'ball_tree':球树实现 KNN
  27. 'auto' 默认参数,自动选择合适的方法构建模型
  28. 不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 'brute'
  29. - leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,
  30. 它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,
  31. 否则速度过慢不说,还容易过拟合。
  32. - p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离,
  33. p=2为欧式距离。默认为p=2
  34. - metric:指定距离度量方法,一般都是使用欧式距离。
  35. 'euclidean' :欧式距离
  36. 'manhattan':曼哈顿距离
  37. 'chebyshev':切比雪夫距离
  38. 'minkowski' 闵可夫斯基距离,默认参数
  39. - n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

二. KNN代码实例

KNN算法算是机器学习里面最简单的算法之一了,我们来sklearn官方给出的例子,来看看KNN应该怎样使用吧:

数据集使用的是著名的鸢尾花数据集,用KNN来对它做分类。我们先看看鸢尾花长的啥样。

鸢尾花

上面这个就是鸢尾花了,这个鸢尾花数据集主要包含了鸢尾花的花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性(特征),以及鸢尾花卉属于『Setosa,Versicolour,Virginica』三个种类中的哪一类(这三种都长什么样我也不知道)。

在使用KNN算法之前,我们要先决定K的值是多少,要选出最优的K值,可以使用sklearn中的交叉验证方法,代码如下:

  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import cross_val_score
  3. import matplotlib.pyplot as plt
  4. from sklearn.neighbors import KNeighborsClassifier
  5. #读取鸢尾花数据集
  6. iris = load_iris()
  7. x = iris.data
  8. y = iris.target
  9. k_range = range(1, 31)
  10. k_error = []
  11. #循环,取k=1到k=31,查看误差效果
  12. for k in k_range:
  13. knn = KNeighborsClassifier(n_neighbors=k)
  14. # cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集
  15. scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')
  16. k_error.append(1 - scores.mean())
  17. #画图,x轴为k值,y值为误差值
  18. plt.plot(k_range, k_error)
  19. plt.xlabel('Value of K for KNN')
  20. plt.ylabel('Error')
  21. plt.show()

运行后,我们可以得到下面这样的图:

KNN Error

有了这张图,我们就能明显看出K值取多少的时候误差最小,这里明显是K=11最好。当然在实际问题中,如果数据集比较大,那为减少训练时间,K的取值范围可以缩小。

有了K值我们就能运行KNN算法了,具体代码如下:

  1. import matplotlib.pyplot as plt
  2. from numpy import *
  3. from matplotlib.colors import ListedColormap
  4. from sklearn import neighbors, datasets
  5. n_neighbors = 11
  6. #导入一些要玩的数据
  7. iris = datasets.load_iris()
  8. x = iris.data[:, :2] #我们只采用前两个feature,方便画图在二维平面显示
  9. y = iris.target
  10. h = .02 #网格中的步长
  11. # 创建彩色的图
  12. cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
  13. cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
  14. #weights 是KNN模型中的一个参数,上述参数介绍中有介绍,这里绘制两种权重参数下KNN的效果图
  15. for weights in ['uniform', 'distance']:
  16. # 创建了一个knn分类器的实例,并拟合数据。
  17. clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
  18. clf.fit(x, y)
  19. # 绘制决策边界。为此,我们将为每个分配一个颜色
  20. # 来绘制网格中的点 [x_min, x_max]x[y_min, y_max].
  21. x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1
  22. y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
  23. xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
  24. np.arange(y_min, y_max, h))
  25. Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
  26. # 将结果放入一个彩色图中
  27. Z = Z.reshape(xx.shape)
  28. plt.figure()
  29. plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
  30. # 绘制训练点
  31. plt.scatter(x[:, 0], x[:, 1], c=y, cmap=cmap_bold)
  32. plt.xlim(xx.min(), xx.max())
  33. plt.ylim(yy.min(), yy.max())
  34. plt.title("3-Class classification (k = %i, weights = '%s')"
  35. % (n_neighbors, weights))
  36. plt.show()

KNN和Kmeans

前面说到过,KNN和Kmeans听起来有些像,但本质是有区别的,这里我们就顺便说一下两者的异同吧。

相同:

  1. K值都是重点
  2. 都需要计算平面中点的距离

相异:
Knn和Kmeans的核心都是通过计算空间中点的距离来实现目的,只是他们的目的是不同的。KNN的最终目的是分类,而Kmeans的目的是给所有距离相近的点分配一个类别,也就是聚类。

简单说,就是画一个圈,KNN是让进来圈子里的人变成自己人,Kmeans是让原本在圈内的人归成一类人。

发表评论

表情:
评论列表 (有 0 条评论,257人围观)

还没有评论,来说两句吧...

相关阅读

    相关 KNN算法

    记得读研那会,接触过这个算法,算法原理还是比较容易理解,类似机器学习中的预测,在给定的一堆数据,预测当前节点的分类。计算距离,然后排序,计算最相似的分类。 impor

    相关 kNN算法总结

    一直接触KNN近邻算法,但是一直没有机会系统的总结一下,现在做一下总结,希望加深一下自己对近邻算法的理解。 定义:K-近邻算法采用测量不同特征值之间的距离方法进行分类 优缺

    相关 KNN算法

    KNN算法即K-近邻算法,KNN的核心思想是通过你的“邻居”来推断出你的类别。 1 K-近邻算法(KNN)原理     k 值取得过小,容易受到异常点的影响   

    相关 KNN算法

    1、kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。 最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数