R小盐准备介绍R语言机器学习与预测模型的学习笔记
你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】
01 什么是knn算法
KNN(K-NearestNeighbor)是机器学习入门级的分类算法,是一种有监督算法。
我们有一堆样本点,类别已知,如下图左,蓝色为一类,黄色为另一类。现在有个新样本点,也就是图中黑色的叉叉,需要判断它属于哪一类。KNN做的就是选出距离目标点黑叉叉距离最近的k个点,看这k个点的大多数颜色是什么颜色。这里的距离怎么定义?当然还是可以用我们的老朋友——欧氏距离来度量。
给定两个样本 X=(x1,x2,...,xn)X=(x_{1},x_{2},...,x_{n})X=(x_{1},x_{2},...,x_{n}) 和 Y=(y1,y2,...,yn)Y=(y_{1},y_{2},...,y_{n})Y=(y_{1},y_{2},...,y_{n}) ,其中n表示特征数 ,X和Y两个向量间的欧氏距离(Euclidean Distance)表示为:
KNN的全称是K Nearest Neighbors,意思是K个最近的邻居。K个最近邻居,毫无疑问,K的取值肯定是至关重要的。那么最近的邻居又是怎么回事呢?其实啊,KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别
KNN是一种非参的,惰性的算法模型。
非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。
惰性又是什么意思呢?想想看,同样是分类算法,逻辑回归需要先对数据进行大量训练(tranning),最后才会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。
KNN算法的优势和劣势
KNN算法优点
- 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
- 模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
- 预测效果好。
- 对异常值不敏感
KNN算法缺点
- 对内存要求较高,因为该算法存储了所有训练数据
- 预测阶段可能很慢
- 对不相关的功能和数据规模敏感
02 knn算法分类预测实现① class包
train<-iris[index,-5]
test<-iris[-index,-5]
cl<-iris[index,5]#设置类别变量
k<-7#以最近的几个点来投票
#测试集上的预测
pre_test<-knn(train=train,test=test,cl=cl,k=k,pro=T) #分类结果
t<-table(iris[-index,5],pre_test)
accu_test<-sum(diag(t))/sum(t) #测试集准确率
#训练集上的预测
pre_train<-knn(train=train,test=train,cl=cl,k=k,pro=T) #分类结果
t<-table(iris[index,5],pre_train)
accu_train<-sum(diag(t))/sum(t) #训练集准确率
效果如下:
03 knn算法分类预测②kknn包
# kknn包可以处理带有因子型变量的数据集
library(kknn)
train<-iris[index,]
test<-iris[-index,]
#测试集上的预测
pre_test<-kknn(Species~.,train, test)
fit_test<- fitted(pre_test) #分类结果
t<-table(test$Species, fit_test)
accu_test<-sum(diag(t))/sum(t) #测试集准确率
#训练集上的预测
pre_train<-kknn(Species~.,train, train)
fit_train <- fitted(pre_train) #分类结果
t<-table(train$Species, fit_train)
accu_train<-sum(diag(t))/sum(t) #训练集准确率
效果如下:
关注R小盐,关注科研私家菜(VX_GZH: SciPrivate),有问题请联系R小盐。让我们一起来学习 R语言机器学习与临床预测模型