KNN算法

1.最邻近域法(KNN算法)

1.1算法原理

特点是不必事先建立全局的判别公示或规则,当新数据需要分类时,根据每个样本和原有样本之间的距离,取最近K个样本点的众数或均值作为新样本的预测值,这种算法的思路体现了一句老话“近朱者赤近墨者黑”。
KNN算法注意点:(1)一般使用欧氏距离计算观测距离;(2)需要对数据进行无量纲处理;(3)选取合适的k值,可以使用AUC(Area Under Carve)抽取k值;


KNN算法_第1张图片
KNN.png

1.2 R中实现KNN算法

Problem:如何判定一个新客户在婚恋网上注册相亲的成功率?
Solution:寻找和新客户情况特别相仿的男士对比,看看他们相亲成功率有多大,由彼推其。

加载数据集

setwd("D:/《用商业案例学R语言数据挖掘》教材代码及数据/data) #设定工作路径
orgData<-read.csv("date_data2.csv") #读入数据
y<-orgData[,c("Dated")] #取出因变量
x<-orgData[,c(1,2,3,4)] #取出“income”、“attractive“”assets”和 “educlass”自变量

定义极差标准化函数标准化数据

normalize <- function(x) {
return((x - min(x)) / (max(x) - min(x)))
}
x<- as.data.frame(lapply(x, normalize)) #使用lapply循环赋值x
data<-cbind(y,x) #使用cbind函数将y和x合并
datay) #目标变量(因变量)factor型处理
summary(data)

构建训练集和测试集

set.seed(110) #设定种子值
select<-sample(1:nrow(data),length(data$y)*0.7) # 使用sample抽样函数,从全数据中抽取目标变量数值的70%样本
train=data[select,-1] #获得抽取样本(70%)中不包括第一列(y目标变量)的数值列表作为train
test=data[-select,-1] #获得非抽取样本(30%)中不包括第一列(y目标变量)的数值列表作为test
train.y=data[select,1] #获得抽取样本(70%)中第一列(y目标变量)列表
test.y=data[-select,1] #获得非抽取样本(70%)中第一列(y目标变量)列表

使用KNN算法,设定k=10

library(class)
y_hat<-knn(train = train,test = test,cl=train.y,k=10)

模型验证,将预测的类别与实际类别对比。

accuracy.knn<-sum(y_hat==test.y)/length(test.y)
accuracy.knn
agreement_KNN<- y_hat==test.y
table(agreement_KNN)

召回率和精确度

require(gmodels)
t<-CrossTable(x =test.y, y = y_hat,prop.chisq=FALSE)

tprop.col[2,2] #精确度

使用循环选择合适的k值,参考指标为混淆矩阵的准确率、精准率和召回率

ROC<-data.frame()
for (i in seq(from =1,to =15,by =1)){
y_hat<-knn(train = train,test = test,cl=train.y,k=i)
require(gmodels)
t<-CrossTable(x =test.y, y = y_hat,prop.chisq=FALSE)
accuracy.knn<-sum(y_hat==test.y)/length(test.y)#准确率

t$prop.row[2,2]#召回
t$prop.col[2,2]#精确度、命中率
out<-data.frame(i,accuracy.knn,t$prop.row[2,2],t$prop.col[2,2])
ROC<-rbind(ROC,out)

}
names(ROC)<-c("n","accuracy","Recall","Precision")

你可能感兴趣的:(KNN算法)