目录
前言:
K最近邻算法(KNN,K-NearestNeighbor)是一个非常经典而且原理十分容易理解的算法。本项目介绍K最近邻算法的原理和使用方法,讲解K最近邻分类和K最近邻回归,,并且使用K最近邻算法解决一个实际分类问题。
案例一 、K近邻算法在二分类中的应用
手动生成有两个类别的数据集,把它作为机器学习的训练数据集,用KNN算法进行模型训练,然后对新的未知数据进行分类。
1.生成训练集
由于python中sklearn.darasets用pip原址安装很慢,所以我建议大家使用清华源下载,比较高效快捷,代码如下
pip install sklearn.darasets -i https://pypi.tuna.tsinghua.edu.cn/simple
#导入数据集生成器
from sklearn.datasets import make_blobs
#导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
#导入绘图工具
import matplotlib.pyplot as plt
#导入numpy
import numpy as np
#生成样本数为200、分类数为2的数据集
data = make_blobs(n_samples=200,centers = 2,random_state=8)
#大写的X表示数据的特征,小写的y表示数据对应的标签。
X,y = data
#将生成的数据集进行可视化
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.autumn,edgecolor='k')
![](/i/ll/?i=direct/3ac45f5e636a44148ae84ac2869dabf7.png)
如果大家想要实现中文标题,我们可以加入以下代码,用来进行汉化
# 设置matplotlib以使用中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
![](/i/ll/?i=direct/f22ce4546a0a40ffbad958292afba547.png)
2.用KNN算法拟合这些数据
#创建模型
clf = KNeighborsClassifier()
#训练模型
clf.fit(X,y)
3.绘出分类边界,创建分类模型,新数据分类预测
#下面的代码用于画图
x_min,x_max = X[:,0].min()-1,X[:,0].max()+1
y_min,y_max = X[:,1].min()-1,X[:,1].max()+1
#用不同的背景色表示不同的分类
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
Z = clf.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Pastel1_r)
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.autumn,edgecolor='k')
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:KNN")
#把新的数据点用五边形表示出来
plt.scatter(7.75,4.72,marker='p',c='blue',s=200)
plt.show()
4.验证KNN算法的分类结果
#对数据点分类进行预测
print('代码运行结果:')
print('====================================')
print('新数据点的分类是:',clf.predict([[7.75,4.72]]))
print('====================================')
代码运行结果:
====================================
新数据点的分类是: [1]
====================================
案例二、K近邻算法在多分类中的应用
1.生成多分类任务数据集
#导入数据集生成器
from sklearn.datasets import make_blobs
#导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
#导入绘图工具
import matplotlib.pyplot as plt
#导入numpy
import numpy as np
#生成样本数为300、分类数为3的数据集
data2 = make_blobs(n_samples=300,centers = 4,random_state=4)
# 设置matplotlib以使用中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
#大写的X表示数据的特征,小写的y表示数据对应的标签。
X2,y2 = data2
#将生成的数据集进行可视化
plt.scatter(X2[y2==0,0],X2[y2==0,1],cmap=plt.cm.spring,edgecolor='k',marker='o')
plt.scatter(X2[y2==1,0],X2[y2==1,1],cmap=plt.cm.spring,edgecolor='k',marker='^')
plt.scatter(X2[y2==2,0],X2[y2==2,1],cmap=plt.cm.spring,edgecolor='k',marker='s')
plt.scatter(X2[y2==3,0],X2[y2==3,1],cmap=plt.cm.spring,edgecolor='k',marker='D')
2.用KNN算法拟合这些数据
#创建模型
clf = KNeighborsClassifier()
#训练模型
clf.fit(X2,y2)
3.绘出分类边界,创建分类模型,新数据分类预测
#下面的代码用于画图
x_min,x_max = X2[:,0].min()-1,X2[:,0].max()+1
y_min,y_max = X2[:,1].min()-1,X2[:,1].max()+1
#用不同的背景色表示不同的分类
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
Z = clf.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Set3)
plt.scatter(X2[y2==0,0],X2[y2==0,1],cmap=plt.cm.spring,edgecolor='k',marker='o')
plt.scatter(X2[y2==1,0],X2[y2==1,1],cmap=plt.cm.spring,edgecolor='k',marker='^')
plt.scatter(X2[y2==2,0],X2[y2==2,1],cmap=plt.cm.spring,edgecolor='k',marker='s')
plt.scatter(X2[y2==3,0],X2[y2==3,1],cmap=plt.cm.spring,edgecolor='k',marker='D')
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.autumn,edgecolor='k')
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:KNN")
plt.show()
5.验证KNN算法的分类结果
#对数据点分类进行预测
print('代码运行结果:')
print('====================================')
print('模型准确率:{:.2f}'.format(clf.score(X2,y2)))
print('====================================')
代码运行结果:
====================================
模型准确率:0.99
====================================
案例三、K近邻算法在回归分析中的应用
K近邻算法不仅可以用于分类,还可以用于回归。其原理是通过找出一个样本的k个最近邻居,将这些邻居的某个属性的平均值赋给该样本,就可以得到该样本对应属性的值。
1.生成回归分析任务数据集
在scikit-learn的数据集生成器中,有一个使用方便的、用于回归分析的数据集生成器——make_regression函数。这里使用make_regression函数生成的数据集来进行试验。
#导入数据集生成器
from sklearn.datasets import make_regression
#导入绘图工具
import matplotlib.pyplot as plt
#导入numpy
import numpy as np
# 设置matplotlib以使用中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
#生成样本数为200、分类数为2的数据集
data = make_regression(n_features=1,n_informative=1,noise=30,random_state=5)
#大写的X表示数据的特征,小写的y表示数据对应的标签。
X,y = data
#将生成的数据集进行可视化
plt.scatter(X,y,c='b',edgecolor='r')
plt.show()
2. 用KNN算法进行回归分析
from sklearn.neighbors import KNeighborsRegressor
#创建模型
reg = KNeighborsRegressor()
#训练模型
reg.fit(X,y)
z = np.linspace(-2.5,2.5,200).reshape(-1,1)
plt.scatter(X,y,c='b',edgecolor='k')
plt.plot(z,reg.predict(z),c='r',linewidth=3)
plt.title("Classifier:KNN")
plt.show()
3.对模型准确率进行评分及模型优化
#对模型准确率进行评分
print('代码运行结果:')
print('====================================')
print('模型准确率:{:.2f}'.format(reg.score(X,y)))
print('====================================')
代码运行结果:
====================================
模型准确率:0.78
====================================
模型评分只有0.78,这是一个差强人意的结果。为了提高模型的评分,可以尝试对K最近邻算法的近邻数进行调整。在默认情况下,K最近邻算法的n_neighbors为5,可以先尝试将它减小。
from sklearn.neighbors import KNeighborsRegressor
#创建模型
reg2 = KNeighborsRegressor(n_neighbors=2)
#训练模型
reg2.fit(X,y)
#重新可视化
plt.scatter(X,y,c='b',edgecolor='k')
plt.plot(z,reg2.predict(z),c='r',linewidth=3)
plt.title("KNN regressor:n_neighbors=2")
plt.show()
#对数据点分类进行预测
print('代码运行结果:')
print('====================================')
print('模型准确率:{:.2f}'.format(reg2.score(X,y)))
print('====================================')
代码运行结果:
====================================
模型准确率:0.85
====================================
从评分结果可以看出,模型的评分从0.78提升到了0.85,有了较为显著的提升。这说明对K最近邻值进行调整,能够有效改善模型的准确率。
标签:KNN,基于,plt,回归,分类,算法,X2,y2 From: https://blog.csdn.net/weixin_49816293/article/details/139719027