小伙伴们好!今天在后台收到一位小伙伴的留言,问有没有KNN模型的代码。我才意识到,还没跟大家介绍过这个模型呢!
今天咱们就来唠唠,K近邻(k-Nearest Neighbor,KNN)模型。
1、模型原理——简单版
K近邻(k-Nearest Neighbor,KNN)是一种分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
该方法的思路是:近朱者赤,近墨者黑。在特征空间中,如果一个样本附近的k个最近样本的大多数属于某一个类别,则该样本也属于这个类别。
比如说,下图中有两个类别,蓝色的圆点和橙色的三角形,"X"是未知。
我们要想预测X的类别,就选择X最近的几个样本,红色圆圈里有4个样本,其中3个为蓝色的圆点,只有一个是橙色三角形。那么X类别大概率为蓝色圆点。

2、R语言实战
了解了原理之后,K近邻用R语言怎么实现呢?话不多说,我们直接上代码。
library(caret)data("iris") #加载R自带的鸢尾花数据集set.seed(666)l <- caret::createDataPartition(iris$Species,p=0.8,times = 1,list =FALSE)trainset <- iris[l,]testset <- iris[-l,]set.seed(3333)knn_train <- knn3(as.matrix(trainset[,-5]),as.factor(trainset$Species),k = 5)
还是以iris鸢尾花数据集为例,我们首先划分训练集、测试集,比例为8:2。
然后调用caret包里的knn3功能。KNN模型只有一个可调整的参数,那就是K的个数,一般为3-10。可根据实际情况进行调整。
注意:
1. knn3中要求x为矩阵,所以我们需要用as.matrix把训练集变为矩阵。
2. x不能包含因变量,所以这里用到了trainset[,-5],把因变量所在列剔掉。
knn_test <- predict(knn_train, testset[,-5])

接下来我们在测试集上进行预测,可以看出,各个类别上的概率都预测出来了。再取概率最大的类别,作为预测的结果。
knn_test <- apply(knn_test, 1, which.max)
衡量模型效果:
#3.confusion matrixknn_cf <- caret::confusionMatrix(as.factor(knn_test), as.factor(as.numeric(testset$Species)))print(knn_cf)

KNN模型在测试集上的准确率达到了93%,其中Class 1预测全对,Class 2准确率为95%,Class 3准确率为90%。总体来说达到了不错的效果。
以上就是今天想要分享的全部内容。如果觉得有帮助,别忘了分享给更多的小伙伴们,同时右下角“在看”点一下哦~
每天进步一点点,我们一起加油!

