scikit-learn 是最受欢迎的机器学习库之一, 它提供了各种主流的机器学习算法的 API 接口供使用者调用, 让使用者可以方便快捷的搭建一些机器学习模型, 并且通过调参可以达到很高的准确率.
这次我们主要介绍 scikit-learn 中 k 近邻算法 (以下简称为 KNN) 的使用.
KNN 是一种非参数机器学习算法(机器学习中通过模型训练而学到的是模型参数, 而要人工调整的是超参数, 请注意避免混淆). 使用 KNN 首先要有一个已知的数据集 D, 数据集内对于任意一个未知标签的样本数据 x, 可以通过计算 x 与 D 中所有样本点的距离, 取出与 x 距离最近的前 k 个已知数据, 用该 k 个已知数据的标签对 x 进行投票, 哪一类票数最多, x 就是哪一类, 这是 kNN 的大概思想, 以下举个例子方便理解.
正方形该分到哪个类?
在上图中有 2 个已知类别 -- 红色五角星和蓝色三角形和一个未知样本 -- 绿色方格. 现在我们要用 KNN 算法对绿色方格进行分类, 以判定其属于这两类中的哪一类, 首先令 k=5, 通过计算距离我们可以知道距离绿色方格最近的 5 个样本中(假设绿色方格位于圆心), 有 2 个红色五角星, 3 个蓝色三角形. 通过投票可知: 蓝色三角形得 3 票, 红色五角星得 2 票, 因此绿色方格应该属于蓝色三角形. kNN 就是这样工作的.
上图同时也引申出 KNN 算法的一个重要的超参数 --k. 举例来说, 如果当 k=10 时, 由图可以看出: 红色五角星投了 6 票, 蓝色三角形投了 4 票, 因此未知的样本应该属于红色五角星一类. 因此, 我们可以看出超参数的选择会影响最终 kNN 模型的预测结果. 下面用代码具体展示如何调用 scikit-learn 使用 kNN, 并调整超参数.
以上是利用 scikit-learn 中默认的 k 近邻模型来预测未知鸢尾花样本的种类(假装未知), 我们在实例化模型的过程中并未传入任何的超参数, 则 kNN 模型会使用模型默认的超参数.
例如:
● metric='minkowski' -- 计算样本点之间距离的时候会采用明可夫斯基距离, 与 p=2 等价
● n_jobs=1 -- kNN 算法支持 CPU 多核并行运算; n_jobs=1, 默认使用一个核, 当 n_jobs=-1 时, 使用所有的核
● n_neighbors=5 -- 表示 k=5, 即抽取未知样本附近最近的 5 个点进行投票
● weights='uniform' -- 表示再利用最近的 k 个点投票时, 他们的权重是等价的, 当 weights='distance'时, 表示一个已知样本点距离未知点的距离越小, 其投票时所占权重越大
还有一些其他的很重要的超参数, 在这里先暂不说明, 以下用代码具体展示.
以下用循环来搜索下关于 n_neighbors, 和 p 这两个超参数的最优值.
因为我们为了便于可视化, 仅使用了鸢尾花数据集中的 2 个特征, 所以导致最终预测的准确率不太高, 如果使用该数据集的全部特征来训练模型并预测未知样本, 传入最佳超参数的 kNN 模型, 亲测准确度可达 100%, 当然这与鸢尾花数据集的高质量也有关系. 运行以上代码并打印结果可得如上所示.
来源: https://yq.aliyun.com/articles/672292