KNN算法即在一个训练数据集中来了一个新的输入实例,在训练集中找到与这个新的实例最近的K个邻居,在k的邻居中,有多个实例属于已知的类,那么把这个已知的类作为这个新实例所属的类别。也就是用投票法(少数服从多数)。由于用投票法,所以k值一般取奇数。
但是K值得大小选取有要求:
首先,如果k值选取太小,就相当于以待分类的实例为中心,在较小的邻域内,以该邻域内的邻居的类别来为新实例分类,那么就意味着我们的整体模型会比较复杂,容易发生过拟合,也就是说如果有噪声,则会影响分类效果。如果取k=1这种极端情况,来解释模型的复杂性以及过拟合现象。
如图所示,K值太小,受噪声的影响较大,如果把K值取大,那么受噪声影响就比较小
但是也不能去太大,如果太大,模型就会变得简单,就会根据整体哪个类别多新来的数据就属于哪个类别。
因此一般通过交叉验证法来选取最优值,即把数据集分成均等份,每一组数据集当一次预测值。剩下的几组当训练值来得到最优K值。
通常采用叉验证法来选取最优的k值就是比较不同k值时的交叉验证平均误差率,选择误差率最小的那个大值。例如选择k= 1,2.3.对每个k=i做若干次交叉验证,计算出平均误差,然后比较、选出最小的那个
KNN算法总结:
1.思想:给定一个训练数据集,计算每个训练集与新的实例之间的距离,对这些距离从小到大排序,取前K个距离,K个训练实例多的所属类即为新的待预测的新的实例类别
2.一般距离有多种形式,比如曼哈顿距离,欧氏距离,等等。这里选取欧氏距离,也就是我们常用的距离,即两点间的距离。
3…在进行距离计算时,为了保证实例的每个特征同等重要,因此,需要进行归一化(又称标准化)处理,一般采用最小最大归一化。
neighbors-based (基于邻居的) 监督学习分为两种: classification (分类)针对的是具有离散标签的数据,regression (回归)针对的是具有连续标签的数据。
三要素:K如何选择、距离如何度量、分类决策的规则
最近邻分类
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=1, **kwargs)
参数
n_neighbors: k值
algorithm:指定计算最近邻的算法
‘auto’:自动决定最合适的
‘ball_tree’:BallTree算法
‘kd_tree’:KDTree算法
‘brute’:暴力搜索法
leaf_size:int,指定BallTree/KDTree叶节点规模,影响树的构建和查询速度
metric:指定距离度量,参考文档距离表示
p:指定在minkowski距离上的指数p,p=1 对应曼哈顿距离,p=2 对应欧式距离
归一化处理:最值归一化
把所有的数据映射到0~1之间
适用于有明显的边界,受outlier极端值影响较大,比如收入的分布
归一化方式二:均值-方差归一化
把所有数据归一到均值为0方差为1的分布中