【2】监督学习--1--分类-K近邻分类器

K近邻分类器(KNN):通过计算待分类数据点,与 已有数据集中的所有数据点的距离。取 距离最小的前K个点,根据“少数服从 多数“的原则,将这个数据点划分为出 现次数最多的那个类别。

sklearn中的K近邻分类器

在sklearn库中,可以使用sklearn.neighbors.KNeighborsClassifier 创建一个K近邻分类器,主要参数有:

  • n_neighbors:用于指定分类器中K的大小(默认值为5,注意与 kmeans的区别)
  • weights:设置选中的K个点对分类结果影响的权重(默认值为平均 权重“uniform”,可以选择“distance”代表越近的点权重越高, 或者传入自己编写的以距离为参数的权重计算函数)

它的主要参数还有:

  • algorithm:设置用于计算临近点的方法,因为当数据量很大的情况 下计算当前点和所有点的距离再选出最近的k各点,这个计算量是很 费时的,所以(选项中有ball_tree、kd_tree和brute,分别代表不 同的寻找邻居的优化算法,默认值为auto,根据训练数据自动选择)

K近邻分类器的使用 创建一组数据 X 和它对应的标签 y:

X = [[0], [1], [2], [3]] 
y = [0, 0, 1, 1]

使用 import 语句导入 K 近邻分类器。

from sklearn.neighbors import KNeighborsClassifier

参数 n_neighbors 设置为 3,即使用最近的3个邻居作为分类的依据,其他参 数保持默认值,并将创建好的实例赋给变量 neigh。

>>> neigh = KNeighborsClassifier(n_neighbors=3)

调用 fit() 函数,将训练数据 X 和 标签 y 送入分类器进行学习。

>>> neigh.fit(X, y)

调用 predict() 函数,对未知分类样本 [1.1] 分类,可以直接并将需要分类 的数据构造为数组形式作为参数传入,得到分类标签作为返回值。

>>> print(neigh.predict([[1.1]]))
[0]

样例输出值是 0,表示K近邻分类器通过计算样本 [1.1] 与训练数据的距离, 取 0,1,2 这 3 个邻居作为依据,根据“投票法”最终将样本分为类别 0。

KNN的使用经验

在实际使用时,我们可以使用所有训练数据构成特征 X 和标签 y,使用 fit() 函数进行训练。在正式分类时,通过一次性构造测试集或者一个一个输入 样本的方式,得到样本对应的分类结果。有关K 的取值:

  • 如果较大,相当于使用较大邻域中的训练实例进行预测,可以减小估计误差,但是距离较远的样本也会对预测起作用,导致预测错误。
  • 相反地,如果 K 较小,相当于使用较小的邻域进行预测,如果邻居恰好是噪声点,会导致过拟合。
  • 一般情况下,K 会倾向选取较小的值,并使用交叉验证法选取最优 K 值。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn