一、基本概念
KNN是有监督学习的分类算法,全称是K Nearest Neighbors,意思是K个最近的邻居。KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。计算 x和y两点的距离公式如下
二、代码实现
# 使用框架
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors= k) # 实例化
clf = clf.fit(X_train, y_train) # 用训练集数据训练模型
result = clf.score(X_test, y_test) #导入测试集,从接口中调用需要的信息,检验准确率
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris # 导入鸢尾花数据集
from sklearn.model_selection import train_test_split
data = load_iris()
X= data.data # 特征矩阵
y = data.target # 标签数组
# 可以把数据转成表格形式查看
# import pandas as pd
# pd.DataFrame(X,columns = data.feature_names)
# 查看y都有哪些类别
# import numpy as np
# np.unique(y)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 1)
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler() # 实例化一个标准化对象
X_train = transfer.fit_transform(X_train) #对训练集的特征值进行标准化
X_test = transfer.transform(X_test) # 对测试集的特征值进行标准化,不要加fit,不然两者数据不一致
clf = KNeighborsClassifier(n_neighbors=5)
clf = clf.fit(X_train,y_train)
result = clf.score(X_test,y_test)
result
三、为什么fit_transform用在训练数据,transform用在测试数据?
fit会计算出一些参数(均值、方差等训练集的固有属性),然后transform把这些转换(标准化、归一化、降维等)应用到输入的数据集中。
测试数据集是用来检测模型性能的,我们希望这是一个全新的数据集,这样才比较好的看出模型的泛化能力,模型在unseen的数据上表现怎么样。
如果在测试数据中用fit_transform,那么又重新的fit的一下,fit又计算新的均值和方差,相当于这些数据已经并不是未知的,并不是unseen的数据。所以在这个数据上的表现好并不能保证再新数据上表现好。