KNN算法

作者: 蓝色滑行 | 来源:发表于2018-12-10 21:30 被阅读0次

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

    1.1算法原理

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


    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<-as.factor(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.row[2,2] #召回率 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算法

          本文链接:https://www.haomeiwen.com/subject/xsqkhqtx.html