本文根据贪心学院付费课程学习笔记整理而来,参见课程网址:AI教AI。
本文github源代码网址:https://github.com/ZhiHuDaShiJie/Fundamentals-of-Machine-Learning/blob/main/2.1%20KNN.ipynbgithub.comhttps://github.com/ZhiHuDaShiJie/Fundamentals-of-Machine-Learning/blob/main/2.2%20KNN%20decision%20boundary%20visualization.ipynbgithub.comZhiHuDaShiJie/Fundamentals-of-Machine-Learninggithub.com
本文目录:
1. KNN算法的核心思想
2. 用sklearn实现KNN代码讲解
3. KNN具体的实现步骤详解
4. 用python从零开始实现一个KNN算法
5. K近邻的决策边界以及决策边界的python可视化实现
6.用交叉验证选择超参数K
7. 用特征缩放解决KNN算法的潜在隐患
8. KNN 算法总结
以下为正文
1.KNN算法的核心思想
KNN是一个极其简单的算法,中文叫K近邻算法。
算法虽然简单,但非常有效,即便深度学习横行的今天,很多的问题其实都可以使用KNN来解决。KNN主要用于分类问题,但这不意味着不能解决回归问题,只不过回归不是它的主战场罢了
对于KNN,可以用两句话来做个总结。首先,它是最容易理解的机器学习算法。学习编程语言的第一步通常是学习编写"Hello World",那对于机器学习来说,KNN就像是一个Hello World算法。
其次,KNN是最容易实现的算法,即便从零开始实现我们完全可以通过少于五行代码来编写KNN,特别简单。
下面的图片讲述了KNN的核心思想。
总结起来,给定一个预测目标(上图中的是否给张三offer),接下来计算预测预测目标和所有样本之间的距离或者相似度(根据已有的特征,如上图中的应聘者之前工作经验年限和之前的工资水平),然后选择距离最近的前K个样本,然后通过这些样本来投票决策。
这个好比一个人如果跟很多AI工程师有交集,即可以预测这个人也是从事AI工作的。
是否可以选择不同的K值?K个数是人为定义的,可以通过一些技巧来选择合适的K值。
不同的K值会对算法有影响吗?K值当然对算法是有影响的,所以也是KNN里最为重要的一个参数。下面来看一下K值的不一样对预测产生什么样的影响。
K设置为奇数的主要好处是什么吗?一般对于二分类问题来说,把K设置为奇数是容易防止平局的现象。但对于多分类来说,设置为奇数未必一定能够防平局。
2. 用sklearn实现KNN代码讲解
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
第一个import是用来导入一个样本数据。sklearn库本身已经提供了不少可以用来测试模型的样本数据,所以通过这个模块的导入就可以直接使用这些数据了。 第二个import是用来做数据集的分割,把数据分成训练集和测试集,这样做的目的是为了评估模型。第三个是导入了KNN的模块,是sklearn提供的现成的算法。
iris = datasets.load_iris()
X = iris.data
y = iris.target
print (X, y)
这几行代码是用来导入数据集的。在这里我们导入的数据集叫做iris数据集,也是开源数据中最为重要的数据集之一。这个数据包含了3个类别,所以适合的问题是分类问题。另外,具体数据集的描述可以参考:https://archive.ics.uci.edu/ml/datasets/Iris/ 从print(x,y)结果可以看到X拥有四个特征,并且标签y拥有0,1,2三种不同的值。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2003)
在这里X存储的是数据的特征,y存储的每一个样本的标签或者分类。我们使用 train_test_split来把数据分成了训练集和测试集。主要的目的是为了在训练过程中也可以验证模型的效果。如果没有办法验证,则无法知道模型训练的好坏。
这里的random_state就像随机生成器中的seed。通过不同的值采样的训练数据和测