KNN算法原理:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
两个样本的距离一般是用欧式距离,即各变量之间的差值平方和再开方。由于各变量的数量级和离散程度都存在差异,在计算欧式距离前一定要进行标准化。
本文用常用的鸢尾花数据做来介绍KNN算法的实现。
加载库
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import preprocessing
import matplotlib.pyplot as plt
import pandas as pd
导入数据并进行标准化处理
df=pd.read_csv('iris.csv',encoding = "gbk")
X=df.drop(columns='种类')
y=df['种类']
minmax = preprocessing.MinMaxScaler()
# 标准化处理
Xn= minmax.fit_transform(X)
通过设置不同的K值进行运算
X_train,X_test,y_train,y_test = train_test_split(Xn,y,test_size=0.2,random_state=3)
dd=[]
for k in range(1,20):
knn=KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train,y_train)
scores=cross_val_score(knn,X_train,y_train,cv=3,scoring='accuracy')#进行三次运算
mm=round(scores.mean(),3)# 取平均值,保留三位小数
dd.append(scores.mean())
本例k取12为最优。
完整代码
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import preprocessing
import matplotlib.pyplot as plt
import pandas as pd
df=pd.read_csv('iris.csv',encoding = "gbk")
X=df.drop(columns='种类')
y=df['种类']
minmax = preprocessing.MinMaxScaler()# 标准化处理
Xn= minmax.fit_transform(X)
X_train,X_test,y_train,y_test = train_test_split(Xn,y,test_size=0.2,random_state=3)
dd=[]
for k in range(1,20):
knn=KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train,y_train)
scores=cross_val_score(knn,X_train,y_train,cv=3,scoring='accuracy')#进行三次运算
mm=round(scores.mean(),3)# 取平均值,保留三位小数
dd.append(scores.mean())
plt.plot(range(1,20),dd)
plt.xlabel('K')
plt.ylabel('Accuracy') #通过图像选择最好的参数(从图形看出准确率最高为12)
plt.show()
knnbest=KNeighborsClassifier(n_neighbors=12)
knnbest.fit(train_X,train_y) #训练模型
round(knnbest.score(test_X,test_y),3)
knn模型相对比较简单,也容易理解,大家都可以自己操作一下。