KNN是什么东东?
小白自学路上的备忘记录。。。
一、KNN
KNN(K-Nearest Neighbor)K-近邻算法,是一种最简单常用的监督学习算法,属于“懒惰学习”,即在训练阶段仅仅是把样本保存起来,训练时间开销为0,待收到测试样本后再进行处理。而那些在训练阶段就对样本进行学习处理的方法,称为“急切学习”。
懒惰学习是一种训练集处理方法,其会在收到测试样本的同时进行训练,与之相对的是急切学习,其会在训练阶段开始对样本进行学习处理。
若任务数据更替频繁,则可采用懒惰学习方式,先不进行任何训练,收到预测请求后再根据当前数据进行概率估值;若数据不断增加,则可在现有估值基础上,仅对新增样本的属性值进行 增量学习 ,其只需对相关概率估值进行技术修正即可
二、模型原理
为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。
KNN 既然是K个近邻投票选择类别,那么就有两个问题:
- 1.如何选出K个近邻
在KNN中,具体执行步骤为:
(1) 计算待测样本和训练集中每个样本点的距离
ps.通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。
(2) 对上面的所有距离排序
(3) 选前K 个最小距离的样本作为“选民”
在 scikit-learn 中 KNN算法的 K 值是通过 n_neighbors 参数来调节的,默认值是 5
K 值较大:距离较远的训练样本也可以对结果产生影响,模型鲁棒,误差大,欠拟合
K值较小:在较小的近邻区域内训练,结果对近邻点十分敏感
可通过交叉验证确定K值。
- 2.如何“投票”,或者说,选票的权重是否相等
在 KNN 算法中,所选择的邻居都是已经正确分类的对象,基本上邻居们是均匀权重投票,即一人一票,计数比较结果。 在 scikit-learn 中通过设置 weights 参数选择对应的权重算法。
三、KNN的特点
-
原理简单
-
保存模型需要保存全部样本集
-
训练过程很快,预测过程很慢
四、KNN 的应用
1.处理二分类问题
2.处理多分类问题
3.回归分析
五、鸢尾花分类代码样例
实现鸢尾花属性类别的分类器
代码
import numpy as np # 快速操作结构数组的工具
import pandas as pd # 数据分析处理工具
import matplotlib.pyplot as plt # 画图工具
from sklearn import datasets # 机器学习库
#数据集 0-setosa、1-versicolor、2-virginica
scikit_iris = datasets.load_iris()
# 转换成pandas的DataFrame数据格式,方便观察数据
iris = pd.DataFrame(data=np.c_[scikit_iris['data'], scikit_iris['target']],
columns=np.append(scikit_iris.feature_names, ['y']))
print(iris.head(2))
# 检查数据是否有缺失
print(iris.isnull().sum())
# 观察样本中按类别数量是否比较均衡
print(iris.groupby('y').count())
# 选择全部特征训练模型
X = iris[scikit_iris.feature_names]
# label
y = iris['y']
# 第一步,选择model
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
# 第二步,fit X、y
knn.fit(X, y)
# 第三步,predict新数据
print(knn.predict([[3, 2, 2, 5]]))
参考资料:
https://blog.csdn.net/pengjunlee/article/details/82713047
《机器学习之路》