R語言-KNN鄰近算法


我們拿一個婚戀網站的數據來做knn模型:


自變量收入、吸引力、資產,教育和是否約會成功。我們利用這些數據做一個小的預測約會是否成功的模型

> ##加載數據集
> Data<-read.csv("date_data2.csv")
> #數據需要標准化
> x<-scale(Data[,c(1,2,3,4)])
> y<-Data[,5]
> data<-data.frame(cbind(y,x))
> #y需要變為等級變量
> data$y<-as.factor(data$y)
> #選擇訓練集和測試集
> set.seed(123)
> sample<-sample(1:nrow(data),length(data$y)*0.7)
> train<-data[sample,-1]
> train.y<-data[sample,1]
> test<-data[-sample,-1]
> test.y<-data[-sample,1]

 

隨機選擇一個k值

> #使用KNN算法,設定k=10
> library(class)
> predict.y<-knn(train = train,test = test,cl=train.y,k=10)
> #模型驗證,將預測的類別與實際類別對比。
> accuracy<-sum(predict.y==test.y)/length(test.y)
> accuracy
[1] 0.8666667
> #召回率和精確度
> require(gmodels)
> table<-CrossTable(x =test.y, y = predict.y,prop.chisq=FALSE)

 
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  30 

 
             | predict.y 
      test.y |         0 |         1 | Row Total | 
-------------|-----------|-----------|-----------|
           0 |        12 |         2 |        14 | 
             |     0.857 |     0.143 |     0.467 | 
             |     0.857 |     0.125 |           | 
             |     0.400 |     0.067 |           | 
-------------|-----------|-----------|-----------|
           1 |         2 |        14 |        16 | 
             |     0.125 |     0.875 |     0.533 | 
             |     0.143 |     0.875 |           | 
             |     0.067 |     0.467 |           | 
-------------|-----------|-----------|-----------|
Column Total |        14 |        16 |        30 | 
             |     0.467 |     0.533 |           | 
-------------|-----------|-----------|-----------|

 
> table$prop.row[2,2]#召回率
[1] 0.875
> table$prop.col[2,2]#精確度
[1] 0.875

其實k值的選擇非常關鍵,下面我們寫一個循環來確定較好的k值

 

> outdata<-data.frame()
> for (i in seq(from=1,to=20,by=1)){
+         predict.y<-knn(train=train,test = test,cl=train.y,k=i)
+         accuracy<-sum(predict.y==test.y)/length(test.y)
+         require(gmodels)
+         table<-CrossTable(x =test.y,y = predict.y,prop.chisq=FALSE)
+         out<-data.frame(i,accuracy,table$prop.row[2,2],table$prop.col[2,2])
+         outdata<-rbind(outdata,out)
+         
+ }
> names(outdata)<-c("n","accuracy","Recall","Precision")
> head(outdata)
  n  accuracy Recall Precision
1 1 0.9333333 1.0000 0.8888889
2 2 0.9333333 0.9375 0.9375000
3 3 0.9333333 1.0000 0.8888889
4 4 0.9333333 1.0000 0.8888889
5 5 0.9000000 0.9375 0.8823529
6 6 0.9000000 1.0000 0.8421053

我們可以根據需求選擇一個較好的k值,有時需要召回率高,有時需要准確率高。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM