300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > R语言笔记:机器学习【K近邻】

R语言笔记:机器学习【K近邻】

时间:2021-03-13 06:14:32

相关推荐

R语言笔记:机器学习【K近邻】

写在开头:

我是一个学R的小白,因为读研老师要求开始接触R。

记一记笔记留给自己以后回顾,顺便分享出来嘻嘻。

我把需要深入的的函数进行介绍~方便了解这些函数的用法,一些简单的函数我就不放出来啦

之前笔记:R语言笔记:画图(1)【主要plot()函数】

理论知识

我把这一章节需要的理论知识写在本子上拍下来啦~如果缺少这部分知识的可以找书来康康。

1.K-近邻

knn()函数

用于实现K-近邻法,使用前需library(class)。

格式

knn(train=,test=,cl=,k=,prob=FALSE,use.all=TRUE)

参数含义

train——用于指定训练样本集

test——用于指定测试样本集

cl——指定训练样本集中的哪个变量为输出变量

k——用于指定参数K

prob——逻辑参数。取TRUE表示函数返回值是预测类别的概率值,FALSE函数返回值是预测类别值。回归预测中,prob应设置为FALSE。

use.all——逻辑参数。取TRUE表示当有多个等距离的近邻而使得实际近邻个数大于K时,所有近邻参与预测。取FALSE表示再多个等距离近邻中随机抽取近邻,确保实际近邻个数等于K。

knn1()函数

1-近邻法的专用函数。

格式

knn1(train=,test=,cl=)

knn.cv()函数

将K-近邻法和留一法“打包”成一体的函数,无需指定测试样本集。

格式

knn.cv(train=,cl=,k=)

一个栗子

library(class)##指定训练集train<-read.table("D:/R/《R语言数据挖掘方法及应用》案例数据/天猫Train1.txt",header=T,sep=",")train$BuyOrNot<-as.factor(train$BuyOrNot)##指定测试集test<-read.table("D:/R/《R语言数据挖掘方法及应用》案例数据/天猫Test1.txt",header=T,sep=",")test$BuyOrNot<-as.factor(test$BuyOrNot)set.seed(123456)errratio<-vector()for(i in 1:30){knnfit<-knn(train=train[,-1],test=test[,-1],cl=train[,1],k=i,prob=F)CT<-table(test[,1],knnfit)errratio<-c(errratio,(1-sum(diag(CT))/sum(CT))*100)}plot(errratio,type="b",xlab="近邻个数K",ylab="错判率(%)",main="天猫成交顾客分类预测中的近邻数K与错判率",cex.main=0.7)abline(v=7,col="gray")

出现的结果如下:

结合上图并兼顾K-紧邻分析的稳健性考虑,考虑采用K=7。

##得出k=7时的错判率errration[7]

此时测试样本集的错判率为3.3%。

2.基于变量重要性的的加权K-近邻法

一个栗子

利用上面例子数据errdeltex<-errratio[7]##逐个剔除输入变量for(i in -2:-5){fit<-knn(train=train[,c(-1,i)],test=test[,c(-1,i)],cl=train[,1],k=7)CT<-table(test[,1],fit)errdeltex<-c(errdeltex,(1-sum(diag(CT))/sum(CT))*100)}plot(errdeltex,type="l",xlab="剔除变量",ylab="剔除错判率%",main="剔除变量与错判率(K=7)",cex.main=0.8)xtitle=c("1:全体变量","2:消费活跃度","3:活跃度","4:成交有效度","5:活动有效度")legend("topright",legend = xtitle,title = "变量说明",lty=1,cex=0.6)##第i个变量的重要性fi<-errdeltex[-1]+1/4wi<-fi/sum(fi)##画出各变量所占权重的饼图glabs<-paste(c("消费活跃度","活跃度","成交有效度","活动有效度"),round(wi,2),sep=":")pie(wi,labels = glabs,clockwise = T,main="输入变量权重",cex.main=0.8)

出现的结果如下:

由上知,剔除消费活跃度后,错判概率明显增加,说明消费活跃度对预测的影响巨大。

3.基于观测相似性的加权K-近邻法

kknn()函数

用于加权K-近邻法,使用前library(kknn)。

格式

kknn(formula=,train=,test=,na.action=na.omit(),k=,distance=,kernel=)

参数含义

formula——以R公式的形式指定训练样本集中的输入变量和输出变量。写法:输出变量名~输入变量名

na.action=na.omit()——表示带有缺失值的观测不参与分析

k——用于指定近邻个数K,默认值为7

distance——用于指定闵科夫斯基距离中的参数k,默认值为2,即欧式距离

kernel——用于指定核函数,可取值包括”rectangular”(均匀核),”triangular”,”epanechnikov”,”biweight”,”triweight”,”cos”,”gaussian”,”optimal”(研究表明,出均匀核之外的其他核函数,无论选用那种核,预测误差差异均不明显。所以应用中选择哪种核函数都可以,核函数值即为权重。

函数返回值

fitted.values:数值型向量,存放测试样本集中输出变量的预测值

CL:nxk矩阵(n为测试样本集数量,k为近邻个数),存放各观测的各自k个近邻所属类别

W:nxk矩阵(n为测试样本集数量,k为近邻个数),存放各观测的各自k个近邻的权重

D:nxk矩阵(n为测试样本集数量,k为近邻个数),存放各观测的各自k个近邻的闵科夫斯基距离

prob:数值型向量,存放测试样本集中各观测属于预测类别的概率

train.kknn()函数

将加权K-近邻法和留一法“打包”成一体的函数,使用前library(kknn)。

格式

train.kknn(formula=,data=,kmax=m,k=,distance=,kernel=)

参数含义

kmax——用于指定近邻个数K的最大可能取值(默认值11),近邻个数K的取值范围1~m

函数返回值

MISCLASS:kmax x n的矩阵(n为指定的核函数个数),存放不同核函数下当近邻个数K一次取1至kmax时,分类预测的留一法错判率

MEAN.ABS:kmax x n的矩阵(n为指定的核函数个数),存放不同核函数下当近邻个数K一次取1至kmax时,分类预测的留一法平均绝对误差

MEAN.SQU:kmax x n的矩阵(n为指定的核函数个数),存放不同核函数下当近邻个数K一次取1至kmax时,分类预测的留一法均方误差

fitted.values:以列表方式给出不同核函数下当近邻个数K依次取1至kmax时,各个观测的预测类别

best.parameters:为一个列表,存放最优(留一法预测误差最小)核函数名以及最优核函数下的最优邻个数K

一个栗子

继续利用上面数据嘿嘿library(kknn)##对比三种核函数,利用留一法的判错率train<-read.table("D:/R/《R语言数据挖掘方法及应用》案例数据/天猫Train1.txt",header=T,sep=",")train$BuyOrNot<-as.factor(train$BuyOrNot)fit<-train.kknn(formula = BuyOrNot~.,data=train,kmax=11,distance = 2,kernel = c("rectangular","triangular","gaussian"),na.action=na.omit())plot(fit$MISCLASS[,1]*100,type="l",main="不同核函数和近邻个数K下的错判率曲线图",cex.main=0.8,xlab="近邻个数k",ylab="错判率(%)",col=1,lty=1)lines(fit$MISCLASS[,2]*100,col=2,lty=2)lines(fit$MISCLASS[,3]*100,col=3,lty=3)legend("topleft",legend=c("rectangular","triangular","gaussian"),col=c(1,2,3),lty=c(1,2,3),cex=0.7)##可见,均匀核的错判率高于其他两种核选择高斯核函数,,设置近邻个数K=7##利用加权K-近邻分类test<-read.table("D:/R/《R语言数据挖掘方法及应用》案例数据/天猫Test1.txt",header=T,sep=",")test$BuyOrNot<-as.factor(test$BuyOrNot)fit1<-kknn(formula=BuyOrNot~.,train=train,test = test,k=7,distance=2,kernel="gaussian",na.action = na.omit())CT1<-table(test[,1],fit1$fitted.values)errratio1<-(1-sum(diag(CT1))/sum(CT1))*100##利用K近邻分类library(class)fit2<-knn(train=train[,-1],test=test[,-1],cl=train[,1],k=7)CT2<-table(test[,1],fit2)errratio2<-(1-sum(diag(CT2))/sum(CT2))*100##比较二者errratio<-c(errratio1,errratio2)errgraph<-barplot(errratio,main="加权K近邻法与K近邻法的错判率对比图(K=7)",cex.main=0.8,xlab="分类方法",ylab="判错率(%)",axes=FALSE)##自定义坐标轴axis(side=1,at=c(0,errgraph,3),labels=c("","加权K近邻法","K近邻法",""),tcl=0.25)axis(side=2,tcl=0.25)

出现的结果如下:

可以看出加权K-近邻法的判错率较低。

/12/12.今日笔记结束,上课去啦~撒花!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。