R语言使用k值近邻分类算法

来源:互联网 发布:雅思精听 知乎 编辑:程序博客网 时间:2024/06/05 15:16

说明

k近邻(knn)算法属于一种无参惰性算法,无参类算法不会对数据的分布做任何假设,而惰性学习方法则不要求算法具备显性学习过程。
本节将介绍如何应用k近邻算法对churn数据集进行处理。

操作

载入class包

library(class)

将训练和测试数据中的voice_mail_plan,international_plan属性原来的值yes和no分别用1和0代替。

levels(trainset$international_plan) = list("0"="no","1"="yes")levels(trainset$voice_mail_plan) = list("0"="no","1"="yes")levels(testset$international_plan) = list("0"="no","1"="yes")levels(testset$voice_mail_plan) = list("0"="no","1"="yes")

使用KNN分类算法处理训练和测试数据集

churn.knn = knn(trainset[,! names(trainset) %in% c("churn")],testset[,!names(testset) %in% c("churn")],trainset$churn,k=3) summary(churn.knn)yes  no  77 941 

调用table函数得到分类矩阵

table(testset$churn,churn.knn)     churn.knn      yes  no  yes  44  97  no   33 844

调用confusionMatrix函数得到混淆矩阵:

 confusionMatrix(testset$churn,churn.knn)Confusion Matrix and Statistics          ReferencePrediction yes  no       yes  44  97       no   33 844               Accuracy : 0.8723                           95% CI : (0.8502, 0.8922)    No Information Rate : 0.9244              P-Value [Acc > NIR] : 1                                 Kappa : 0.339            Mcnemar's Test P-Value : 3.286e-08                   Sensitivity : 0.57143                     Specificity : 0.89692                  Pos Pred Value : 0.31206                  Neg Pred Value : 0.96237                      Prevalence : 0.07564                  Detection Rate : 0.04322            Detection Prevalence : 0.13851               Balanced Accuracy : 0.73417                'Positive' Class : yes  

正确率有0.8723
####说明
knn算法采用相似性(距离)测量来训练所有样例并对新到达样例进行分类标记,相似性测量可以采用以下公式:欧式距离与曼哈顿距离。
下图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
knn图
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。

优点
1.简单,易于理解,易于实现,无需估计参数,无需训练;
2. 适合对稀有事件进行分类;
3.特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。
4.无参意味着用户不需要假设数据的分布模型。
5.只要对给定的样例选择合适的距离测量方法,算法就可以处理任何类型的数据。
缺点
1.可理解性差,无法给出像决策树那样的规则。
2.该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
3.算法的性能依赖于数据集维度的大小,如果要处理高维的数据,应该先对数据进行降维操作以提高算法的过程性能。
4.该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。

knn算法的调用与前述基于树的分类方法没有明显差别,基于树的算法能够向用户展示一颗决策树模型,而knn算法的输出仅包括分类信息因素。使用knn算法构建模型之前,应该首先将数据集中的字符类型属性预处理成整形,因为k近邻算法要计算样例之间有距离。通过指定k = 3,意味样例可能被分配到距离最近的三个相邻簇中。分类模型建好后,就可以借助测试数据集和预测因子作为输入来生成分类表,并基于分类表得到混淆矩阵,精度比之前差一点,仅凭精度还不能区分模型优势,用户还应该进一步比较算法的特异性和灵敏度。

原创粉丝点击