【机器学习算法-K近邻(KNN)】

  • Post author:
  • Post category:其他




K近邻算法


什么是k近邻算法

(k近邻算法又叫做knn算法):大概意思就是根据你的邻居来判断的的类别。

如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

这里面相似性的度量可以根据欧式距离来计算。欧式距离也就是高中学的两点之间的距离。


算法流程:


1.计算已知类别数据集中的点与当前点之间的距离

2.按距离递增次序排序

3.选取与当前点距离最小的k个点

4.统计前k个点所在的类别出现的频率

5.返回前k个点出现频率最高的类别作为当前点的预测分类


总结:


k近邻算法就是计算未知点和已知点之间的距离,距离通过欧式距离来计算,然后找相近的来判断自己属于类别的概率。



scikit-learn

scikit-learn包含的内容:

分类、聚类、回归

特征工程

模型选择、调优



K近邻算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)



案例



机器学习算法步骤

1)获取数据集

2)数据预处理

3)特征工程

4)机器学习

5)模型评估



k值的选择

k值过小:容易受到异常值的影响

k值过大:受到样本均衡的影响(每个类别的数据多少不一样)

k值的减小模型整体变得复杂,容易过拟合

k值增大则模型整体变得简单,使得预测错误。

实际应用中一般取较小的k值

近似误差:关注训练集,容易过拟合

估计误差:关注测试集,模型本身接近最佳模型



鸢尾花数据集种类预测

获取数据集

from sklearn.datasets import load_iris
iris=load_iris()


特征预处理


特征的单位或者大小相差较大的话,容易影响目标结果。

主要包含归一化和标准化

归一化:将原始数据进行变化映射到[0,1]之间。(通过最大值最小值让数据变化)

最大最小值容易受到异常点的影响,鲁棒性较差,只适合传统精确小数据场景。

from sklearn.preprocessing import MinMaxScaler
ma=MinMaxScaler()
data=ma.fit_transform(data)

标准化:通过对原始数据进行变化把原始数据变化到均值为0,标准差为1的范围内。

from sklearn.preprocessing import StandardScaler

标准化:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景



鸢尾花数据集案例实现

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=train_test_split(iris.data,iris,target,test_size=0.2,random_state=22)
#3.特征工程
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#4,机器学习(模型训练)
estimator=KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train,y_train)
#5,模型评估
y_predict=estimator.predict(x_test)
#计算准确率
score=estimator.score(x_test,y_test)



交叉验证

交叉验证:将拿到的训练数据,分为训练集和验证集(将书分为4份,其中一份作为验证集。然后经过四组测试,每次更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证)

交叉验证的目的:为了让被评估的模型更加准确可信。


网格搜索

:通过交叉验证评估模型的一些参数。

from sklearn.model_selection import GridSearchCV

estimator=KNeighborsClassifier()
#准备要调的超参数
param_dict={'n_neighbors':[1,3,5]}
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)
estimator.fit(x_train,x_test)


#在交叉验证中最好的结果
estimator.best_score_
#最好的参数模型
estimator.best_estimator_
#每次验证后的准确率结果
estimator.cv_results_



版权声明:本文为m0_51607165原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。