全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
2379 0
2016-11-22
###使用knn进行判别分析
> library(ISLR)
> #范例中所使用的数据集Caravan在这个包里,因此要先加载
> library(class)
> #所使用的knn函数在这个包里,因此要先加载
> attach(Caravan)
The following objects are masked from Caravan (pos = 3):

    AAANHANG, ABESAUT, ABRAND, ABROM, ABYSTAND, AFIETS, AGEZONG, AINBOED,
    ALEVEN, AMOTSCO, APERSAUT, APERSONG, APLEZIER, ATRACTOR, AVRAAUT, AWABEDR,
    AWALAND, AWAOREG, AWAPART, AWERKT, AZEILPL, MAANTHUI, MAUT0, MAUT1, MAUT2,
    MBERARBG, MBERARBO, MBERBOER, MBERHOOG, MBERMIDD, MBERZELF, MFALLEEN,
    MFGEKIND, MFWEKIND, MGEMLEEF, MGEMOMV, MGODGE, MGODOV, MGODPR, MGODRK,
    MHHUUR, MHKOOP, MINK123M, MINK3045, MINK4575, MINK7512, MINKGEM, MINKM30,
    MKOOPKLA, MOPLHOOG, MOPLLAAG, MOPLMIDD, MOSHOOFD, MOSTYPE, MRELGE, MRELOV,
    MRELSA, MSKA, MSKB1, MSKB2, MSKC, MSKD, MZFONDS, MZPART, PAANHANG,
    PBESAUT, PBRAND, PBROM, PBYSTAND, PFIETS, PGEZONG, PINBOED, PLEVEN,
    PMOTSCO, PPERSAUT, PPERSONG, PPLEZIER, PTRACTOR, Purchase, PVRAAUT,
    PWABEDR, PWALAND, PWAOREG, PWAPART, PWERKT, PZEILPL

> #这个命令可以使读取这个数据集里的某列数据时,可以直接写出列名称就可以,就像下面的summary(Purchase)
> #命令一样
> dim(Caravan)
[1] 5822   86
> #通过这个命令查看这个数据集的维度(变量或是列的个数)以及观察值数(行的个数)
> summary(Purchase)
  No  Yes
5474  348
> #这里将数据集重的purchase列作为因变量,即要进行预测的变量,这个命令可以看到
> #purchase里的yes,no的个数情况
> p1<-348/5822
> p1
[1] 0.05977327
> #计算出这个列里面的yes的比例为p1。
> #由于knn算法是基于距离的算法,即将距离选定点最近的数据作为同一个类别,因此在求取距离时
> #某个点的数值有一个很大的话,就会导致这个距离变大,然后产生很大的影响。
> #这里的问题主要时讨论不同量纲对于数据的影响,假如数据包含两列,一列是1000美元,一列是50岁
> #假设选定的点是(0,0)点,那么距离就是(1000^2+50^2)^1/2因此1000将会产生非常大的影响,而年龄变量
> #的影响则会被降低,因此在进行非统一量纲分析的时候,首先要进行标准化,即去量纲
> standardize.x<-scale(Caravan[,-86])
> #将这个数据集中,除了第86列之外的数据全部去标准化,第86列是因变量即Purchase列。
> var(standardize.x[,1])
[1] 1
> #查看第一列的标准差,进行标注化以后标注差变为1
> var(standardize.x[,2])
[1] 1
> #第二列同样,进行标注化以后标注差变为1
> #下面将数据分为两部分,一部分做训练样本,一部分用作检测样本
> test<-1:1000
> train.x<-standardize.x[test,]
> #前1000行作为训练样本,剩下部分作为检测样本
> test.x<-standardize.x[-test,]
> train.y<-Purchase[test]
> #前1000行的因变量作为训练样本的因变量。剩下部分做检测样本的因变2量
> test.y<-Purchase[-test]
> set.seed(1)
> knn.pred<-knn(train.x,test.x,train.y,k=1)
> #使用k=1进行knn分析
> head(knn.pred)
[1] No  No  No  No  Yes No
Levels: No Yes
> #使用这个命令查看通过训练样本进行预测情况
> summary(knn.pred)
  No  Yes
4502  320
> p2<-320/(320+4502)
> p2
[1] 0.06636251
> #可以从这个预测的结果来看,同之前得出的总体样本中yes的比例基本差不太多
> #总体的比例情况我们并不是特别关心,我们关心的是对于每一个特定的值预测的准确情况
> table(knn.pred,test.y)
        test.y
knn.pred   No  Yes
     No  4251  251
     Yes  282   38
> #这个表中可以看到,no的情况下,预测正确为4251,yes的预测正确为38,因此可以计算出
> #预测正确的比例情况
> p3<-(4251+38)/(4251+251+282+38)
> p3
[1] 0.889465
> #可以看到这个模型的预测准确率还是很高的,我们再看一下对于yes的预测准确率情况
> p4<-38/(38+282)
> p4
[1] 0.11875
> #可以看到大概准确率在11.875%左右。
> #下面我们写一个循环,来看一下当k的取值不同时,准确率变动情况。
> p<-c()
> for(k in 1:10){
+   knn.pred1<-knn(train.x,test.x,train.y,k=k)
+   p[k]<-table(knn.pred1,test.y)[2,2]/(table(knn.pred1,test.y)[2,2]+table(knn.pred1,test.y)[2,1])
+   cat(".........................k==",k,"....................\n")
+   cat(".........................p",k,"==",p[k],"............\n")
+   
+ }
.........................k== 1 ....................
.........................p 1 == 0.1183801 ............
.........................k== 2 ....................
.........................p 2 == 0.1261261 ............
.........................k== 3 ....................
.........................p 3 == 0.2066116 ............
.........................k== 4 ....................
.........................p 4 == 0.2058824 ............
.........................k== 5 ....................
.........................p 5 == 0.2702703 ............
.........................k== 6 ....................
.........................p 6 == 0.1842105 ............
.........................k== 7 ....................
.........................p 7 == 0.1111111 ............
.........................k== 8 ....................
.........................p 8 == 0.3333333 ............
.........................k== 9 ....................
.........................p 9 == 0 ............
.........................k== 10 ....................
.........................p 10 == 0 ............
> #从上面循环中可以看到,当k=5时,能够取得最大的预测准确程度,能够达到27%左右。
>

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群