一、KNN算法概述
- KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学习算法),但却是有本质区别的。
二、KNN算法介绍
- KNN的全称是K Nearest Neighbors,意思是K个最近的邻居,从这个名字我们就能看出一些KNN算法的蛛丝马迹了。K个最近邻居,毫无疑问,K的取值肯定是至关重要的。那么最近的邻居又是怎么回事呢?其实啊,KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。
- 上图中绿色的点就是我们要预测的那个点,假设K=3。那么KNN算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就归类到蓝三角了。
- 但是,当K=5的时候,判定就变成不一样了。这次变成红圆多一些,所以新来的绿点被归类成红圆。从这个例子中,我们就能看得出K的取值是很重要的。明白了大概原理后,我们就来说一说细节的东西吧,主要有两个,K值的选取和点距离的计算
三、距离计算
- 要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算,欧式距离计算等等。不过通常KNN算法中使用的是欧式距离,这里只是简单说一下,拿二维平面为例,二维空间两个点的欧式距离计算公式如下:
- 其实就是计算(x1,y1)和(x2,y2)的距离。拓展到多维空间,则公式变成这样:
四、K值的选择
- 通过上面那张图我们知道K的取值比较重要,那么该如何确定K取多少值好呢?答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如8:2拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。
五、代码案例
5.1、案例介绍
- 现有十部电影根据电影中kiss和action的数量,判定该电影的类型。取8部电影为训练数据,2部电影为验证数据,最终判定两部电影的类型是否与真实类型相同,k取多少时模型评估的准确性最高。
5.2、数据准备
- 在本地磁盘中含有一个movie.csv数据文件,内容为:
5.3、代码讲解
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import LabelEncoder
if __name__=='__main__':
#读取本地磁盘中的csv文件的电影信息数据
df = pd.read_csv('D:/BigDataStudy/Python/data/movie.csv',encoding='gbk')
#knn算法要求target数据集为数字类型,所以先将目标字符串列转为数字
label = LabelEncoder().fit_transform(df['type'])
#将所有的电影进行82分组,
#取前8个电影的kiss和action列为特征列作为训练数据
#取后2个电影的kiss和action列为特征列作为验证数据
train,test = df.iloc[:8,1:3],df.iloc[8:,1:3]
#设置前8个电影为训练目标数据,后2个电影为真实值
train_target, test_real_target = label[:8],label[8:]
#开启knn模型进行模型训练,假设近邻k=5
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(train,train_target)
#利用留下的两个电影进行测试验证
pred = knn.predict(test)
print(pred) #预测值
print('-----------')
print(test_real_target) #真实值
print('-----------')
print(1-abs(pred-test_real_target).sum()/len(pred)) #精确读
- 结果:
[0 1] #预测值
-----------
[0 1] #真实值
-----------
1.0 #精确读
- 结论:结果发现我们建立的模型预测的结果和真实值完全相同,准确性100%,说明k值选择很合理,在该案例中,由于外部数据较少,所以对于k的选择较为简单,不需要进行交叉验证。在之后会为大家介绍鸢尾花数据集,进行交叉验证,选择合适的k值,建立评估模型。