k—近邻算法
简介:
K Nearest Neighbor算法又叫KNN算法,如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。
该算法的思想是:
一个样本与数据集中的k个样本最相似,如果这k个样本中的大多数属于某一个类别,则该样本也属于这个类别,即,对每一个测试样本,基于事先选择的距离度量,KNN算法在训练集中找到距离最近(最相似)的k个样本,然后将k个样本的类别的投票结果作为测试样本的类别。
K 近邻算法api调用
1、scikit_learn
2、api
3、模型训练具体使用
4、knn算法是一个懒惰算法,根据给出的样本自己进行判断,比较耗时
举例:
# 导入模块
from sklearn.neighbors import KNeihborsClassifier
# 构造数据集
x = [[0],[1],[2],[3]]
y = [0,0,1,1]
# 机器学习--模型训练
# 实例化api
estimator = KNeighborsClassifier(n_neighbors=2)
# 使用fit方法进行训练
estimator.fit(x,y)
实际计算流程:
1)计算已知类别数据集中的点与当前点之间的距离
2)按距离递增次序排序
3)选取与当前点距离最小的k个点
4)统计前k个点所在的类别出现的频率
5)返回前k个点出现频率最高的类别作为当前点的预测分类
距离度量距离
1、欧式距离
就是通过平方,求和,然后开根号进行求解
2、曼哈顿距离
就是通过绝对值,求和进行求解
3、切比雪夫距离
就是通过绝对值,然后取最大值
4、闵可夫斯基距离
是前三个距离的一个综合称呼
p = 1时,就是曼哈顿距离;
p = 2时,就是欧式距离;
p = ∞时,就是切比雪夫距离。
前四个距离的总结:1)将各个分量的量纲,也就是“单位”相同的看待了;2)未考虑各个分量的分布(期望、方差等)可能是不用的。
5、马氏距离
是基于样本分布的一个距离,在计算过程中,与量纲无关。要求:总体样本数大于样本的维数(特征值)
6、标准化欧氏距离
在使用欧式距离计算之前把每个维度的特征求了标准化
7、汉明距离
就是计算字符串替换的一个长度(次数),【汉明重量】
8、杰卡德距离
通过数据的交集和并集进行求解
k值的选择
如果k值过小:
容易受到异常点的影响,意味着整体模型变得复杂,容易发生过拟合
若k值过大:
容易受到样本均衡的问题,k值增大就意味着整体模型变得简单,容易发生欠拟合
k=N(N为训练样本个数)
此时训练的模型完全失效,判断的类别只会选择样本中样本数据最多的类别
个人理解:这个k值的选择方面,可以把k值当做之前的特征,在模型训练时,特征过少会导致过拟合,特征过多会导致欠拟合。
kd树
目标:对训练数据进行快速k近邻搜索
实现思路:
1、构建树
1)构造根节点
2)通过递归方式不断的构造
3)直到子区域没有实例(节点)停止
2、最近领域搜索
1)构造一个队列,使遍历过的点在这个队列里面
2)进行是否过了超平面的判断,如果没有过,跳过,若过了,则需要把当前的子节点添加进去
3)循环操作,求得最近点
坐标系解释:找到对应的近邻点,与目标点距离画圆,判断圆形内是否还有其他节点,若有,则元缩小至最近的近邻点,替换掉上一个近邻点的最近距离,直至圆内不存在节点,最后一个近邻点则为最近的节点。
附加案例
鸢尾花种类预测
基本实现流程:
1、获取数据集
2、数据基本处理
1)数据集分隔
3、特征工程
4、机器学习
5、模型评估
# 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1、获取数据集
iris = load_iris()
# 2、数据的预处理
# x_train,x_test,y_train,y_test为训练集特征值,测试集特征值,训练值目标值,测试目标值
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)
# 3、特征工程标准化
transfer = StandardScaler()
x_train = trasfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=5)
estimator.fit(x_train,y_train)
# 5、模型评估
# 1)比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n",y_predict)
print("比对真实值和预测值:\n",y_predict == y_test)
# 2)直接 计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n",score)
交叉验证、网格搜索(模型选择与调优)API:
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
- 对估计器的指定参数值进行详尽搜索
- estimator:估计器参数(dict){“n_neighbors”:[1,3,5]}
- cv:指定几折交叉验证
- fit:输入训练数据
- score:准确率
- 结果分析:
- bestscore__:在交叉验证中验证的最好结果
- beststimator:最好的参数模型
- cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
鸢尾花案例增加K值调优
# 使用GridSearchCV构建估计器
# 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1、获取数据集
iris = load_iris()
# 2、数据的预处理
# x_train,x_test,y_train,y_test为训练集特征值,测试集特征值,训练值目标值,测试目标值
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)
# 3、特征工程标准化
transfer = StandardScaler()
x_train = trasfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、机器学习(模型训练)
# 1)KNN预估器流程
estimator = KNeighborsClassifier()
# 2)准备要调的参数
param_dict = {"n_neighbors":[1,3,5]}
estimator = GridSearchCV(estimaor, param_grid=param_dict, cv=3)
# 3)fit数据进行训练
estimator.fit(x_train,y_train)
# 5、模型评估
# 1)比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n",y_predict)
print("比对真实值和预测值:\n",y_predict == y_test)
# 2)直接 计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n",score)