写在开头:
我是一个学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-近邻法的判错率较低。