1.10 - K近邻
1. 模型思想
从样本中选出距离测试点最近的 K 个样本,通过这 K 个样本的属性即可推测出待测样本的属性,分类:取占多数类别的样本;回归:取 K 个样本的平均值。
1.1 KNN三要素
1)K 值得选取:K 过大会导致欠拟合,K值过小会导致过拟合。
2)距离的度量:一般欧式距离。sklearn的API中默认 闵可夫斯基 距离 且默认 p=2,所以依旧是 欧氏距离。
3)决策规则:分类,多数表决/加权多数表决;回归,均值/加权均值。权值根据距离衡量,距离越小,该近邻点标签的权值越大。
2. 模型构建
KNN在 fit 的过程不需要做任何计算操作,只需要将所有数据加载到内存中即可。
但是这样会导致,模型预测过程过慢,所以,如何在 fit 过程做一些预处理,使得预测过程快一些 ?
3. 模型优化
3.1 无任何优化时
每次新来一个待测样本点,暴力枚举所有的训练数据计算距离,然后选出距离最小的 K 个样本,得到预测结果。
3.2 KD树(一般选择这个)
fit过程:选出 方差最大 的特征并记录该特征的维度&选取该特征的 中位数 将数据集作为左右两个子树(方差最大是想要数据分得最开,距离待测样本最近的点更容易出现在一起;选取中位数是为了保证左右子树平衡),再分别对左右子树重复上述操作,递归K次,形成KD树。最后KD树的每个叶子节点都会包含多个数据。
预测过程:初始化 最近距离表,待测数据根据KD数每层记录的分割特征来比较进入左子树还是右子树,直到叶节点,一边将遍历的节点存入 回溯路径表 一边更新最近距离表,最后选取最近距离表中的最大距离作为 搜索距离 并遍历 回溯路径表,如果 待测样本到节点的 维度距离 小于搜索距离,则将该节点另一侧子树的节点也纳入回溯路径表(因为这代表另一侧的维度中心边界处可能出现更近的点)。到最后根据 最近距离表中的 K 个点得到预测结果。
3.3 Ball树
源起:当样本在KD图的棱角附近时,KD树在通过搜索距离遍历回溯路径表时,会将很多无效的子树节点纳入回溯路径表,产生很多无效搜索。为了优化KD树。
fit过程:找一个恰好包围所有训练数据的球面,选出距离最远的两个点进行聚类,分别求出聚类中心;再对两个聚类按照上述操作迭代聚类,形成Ball树。
预测过程:预测样本根据每次的聚类中心判断应该被归属到哪个类,最终到最细分的Ball,然后选出最近的 K 个样本得到预测结果。
4. 过拟合和欠拟合
K越大,越容易欠拟合;K越小,越容易过拟合。
5. 应用场景和模型特性
5.1 模型特性
优点:
1)选取距离最近的K个样本,思想简单,既可以做分类,也可以做回归。是 天然的多分类 模型,但是相较朴素贝叶斯,对数据特征没有独立假设,准确率更高。
2)可解决非线性可分问题(只需要找出和目标属性最相关的特征属性即可,不涉及线性不线性的问题)
3)fit 过程的时间复杂度比较低 O(n)
缺点:
1)计算量大,尤其是在特征数比较多的时候,所以,特征选择和降维对KNN很重要。
2)样本不平衡的时候,对 稀有类别 的预测准确率偏低。
3)KD树和Ball树比较耗费内存。
4)相较于决策树等模型,KNN的可解释性不强。
特征归一化:需要进行归一化,因为要计算距离和方差,但是不要标准化Standard,因为这会将所有特征的方差全部变为1。
5.2 模型应用
1)缺失值填充
根据KNN的思想填充某个特征的缺失值,一般会将 有缺失值的一个特征和没有缺失值的几个特征一起放进 KNNImputer 进行 fit。
2)数据不平衡处理
a. 收集数据补充
b. 上采样/ 下采样(根据KNN下采样,但是一般会将多的那类数据随机删除,而不是根据什么KNN的算法删除,因为你不知道数据的原始特征是怎么分布的)
c. 数据增强
d. 调整样本权重
e. 改评价指标
f. 改损失函数
a ~ d:从数据层面解决;e ~ f:从模型层面解决。