我們拿一個婚戀網站的數據來做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值,有時需要召回率高,有時需要准確率高。