频道栏目
首页 > 网络 > 云计算 > 正文

《数据挖掘:R语言实战》神经网络完整代码

2018-04-11 04:19:08      个评论    来源:mr_muli的博客  
收藏   我要投稿

《数据挖掘:R语言实战》神经网络完整代码

# class.ind()函数############################################
v1=c('a','b','a','c')
v2=c(1,2,1,3)

class.ind(v1)
class.ind(v2)

# 数据归一化方法 #############################################
scale01=function(x){
  # 提取预处理样本集中特征变量个数
  ncol=dim(x)[2]-1
  # 提取预处理样本的样本总量
  nrow=dim(x)[1]
  # 建立用于保存新样本集的矩阵
  new=matrix(0,nrow,ncol)

  for(i in 1:ncol){
    # 提取每个变量的最大值
    max=max(x[,i])
    # 提取每个变量的最小值
    min=min(x[,i])
    # 对每个变量的所有样本数据进行归一化处理
    for(j in 1:nrow){
      new[j,i]=(x[j,i]-min)/(max-min)
    }
  }
  new
}


# 数据集预处理#################################################
wine=read.csv("winequality-white.csv",head=TRUE,sep = ';')  
View(wine)
dim(wine)
summary(wine)

# 将quality结果分为3类
# 中间变量
cha=0   

# 对数据分类处理
for(i in 1:4898) 
{
  if(wine[i,12]>6)
  {
    cha[i]="good"
  }
  else if(wine[i,12]>5)
  {
    cha[i]="mid"    
  }
  else
  {
    cha[i]="bad"    
  }
}

# 分类
wine[,12]=factor(cha)   
# 查看对应类别的情况
summary(wine$quality)

# 重命名
names(wine)=c("fixed","volatile","citric","residual","chlorides","free","total","density","PH","sulphates","alcohol","quality")                                                     
View(wine)

# 随机抽样
set.seed(71)
samp=sample(1:4898,3000) 

# 对抽样的进行数据归一化处理,并提取前11列的变量
wine[samp,1:11]=scale01(wine[samp,])

# 确定参数 range的变化范围
r=1/max(abs(wine[samp,1:11]))   

# 第 1 种方式,建立神经网络模型
set.seed(101)
model1=nnet(quality~.,data=wine,subset=samp,size=4,rang=r,decay=5e-4,maxit=200)                                            


# 第 2 种方式,建立神经网络模型
x=subset(wine,select=-quality)      
y=wine[,12] 
# 建立类指标矩阵
y=class.ind(y)              
set.seed(101)
# 建立神经网络模型
model2=nnet(x,y,decay=5e-4,maxit=200,size=4,rang=r)     


# 模型结果分析###########################################
# 模型1
summary(model1)
# 模型2
summary(model2)


# 模型预测###############################################
# 第 1 种方法预测
x=wine[,1:11]       
# 预测
pred1=predict(model1,x,type="class")    
set.seed(110)
# 抽取8个样本,进行预测
sample(1:4898,8);pred1[sample(1:4898,8)]            


# 第 2 种方法预测
xt=wine[,1:11]
# 预测
pred=predict(model2,xt)     
dim(pred)   
# 得到的结果,是矩阵
sample(1:4898,8);pred[sample(1:4898,8),]            

# 确定3个类别的名称
name1=c("bad","good","mid") 
# 确定每行中最大值所在的列
prednew=max.col(pred)       
# 将每行取出的值,即由"1,2,3"组成
# name1[]:利用"过滤器"的方式,为每行的取值,“打标签”
prednewn=name1[prednew]     
# 随机抽样
set.seed(201)
sample(1:4898,8);prednewn[sample(1:4898,8)] 

# 构建混淆矩阵
# 将“类指标矩阵”的"1"提取出来,即是相应的判定类别
true=max.col(y) 
# 混淆矩阵
table(true,prednewn)            


# 模型差异分析##############################################
# 加载包
library(e1071)                  

# 数据集处理
data(iris)  
View(iris)
summary(iris)
dim(iris)

# 特征向量
x=iris[,-5]
# 结果变量
y=iris[,5]

# 将 x 转换为矩阵
x=as.matrix(x)
# 构建 类指标矩阵
y=class.ind(y)

# 对抽样的进行数据归一化处理,并提取前4列的变量
iris[x,1:4]=scale01(iris[x,])

# 建立神经网络模型
model1=nnet(x,y,size=4,maxit=500,decay=5e-4,rang=1/max(abs(x)))  
model2=nnet(x,y,size=4,maxit=500,decay=5e-4,rang=1/max(abs(x)))   

# 查看迭代次数是否达到最大值
model1$convergence
model2$convergence

# 模型迭代的最终值
model1$value
model2$value

# 为三个类别确定名称
name=c("setosa","versicolor","virginica")

# 模型的预测
pred1=name[max.col(predict(model1,x))]
pred2=name[max.col(predict(model2,x))]

# 混淆矩阵
table(iris$Species,pred1)                  
table(iris$Species,pred2)  


# 优化模型#######################################################
wine=read.csv("winequality-white.csv",head=TRUE,sep = ';')  
names(wine)=c("fixed","volatile","citric","residual","chlorides","free","total","density","PH","sulphates","alcohol","quality")                                                         
# 抽样
set.seed(71)
wine=wine[sample(1:4898,3000),]
# 样本数
nrow.wine=dim(wine)[1]

# 元数据归一化
scale01=function(x)
{
    ncol=dim(x)[2]-1
    nrow=dim(x)[1]
    new=matrix(0,nrow,ncol)
    for(i in 1:ncol)
    {
        max=max(x[,i])
        min=min(x[,i])
        for(j in 1:nrow)
        {
            new[j,i]=(x[j,i]-min)/(max-min)
        }
    }
    new
}

# 分类==>打标签
cha=0   
for(i in 1: nrow.wine) 
{
    if(wine[i,12]>6)
    {
        cha[i]="good"   
    }
    else if(wine[i,12]>5)
    {
        cha[i]="mid"    
    }
    else
    {
        cha[i]="bad"    
    }
}

# 打标签
wine[,12]=factor(cha)   

# 抽样
set.seed(444)
samp=sample(1:nrow.wine, nrow.wine*0.7)

# 归一化处理
wine[samp,1:11]=scale01(wine[samp,])        
wine[-samp,1:11]=scale01(wine[-samp,])

# 随机变量权重的范围
r=1/max(abs(wine[samp,1:11]))       

n=length(samp)
err1=0
err2=0

# 改变size的值,即隐藏层中的节点个数11*1.5=16.5,取17
# 取输入节点个数的1.2--1.5倍
for(i in 1:17)
{   
    set.seed(111)
    model=nnet(quality~.,data=wine,maxit=400,rang=r,size=i,subset=samp,decay=5e-4)
    err1[i]=sum(predict(model,wine[samp,1:11],type='class')!=wine[samp,12])/n
    err2[i]=sum(predict(model,wine[-samp,1:11],type='class')!=wine[-samp,12])/(nrow.wine -n)
}

plot(1:17,err1,'l',col=1,lty=1,ylab="模型误判率",xlab="隐藏层节点个数",ylim=c(min(min(err1),min(err2)),max(max(err1),max(err2))))
lines(1:17,err2,col=1,lty=3)
points(1:17,err1,col=1,pch="+")
points(1:17,err2,col=1,pch="o")
legend(1,0.53,"测试集误判率",bty="n",cex=1.5)
legend(1,0.35,"训练集误判率",bty="n",cex=1.5)


# maxit:控制的是 模型的最大迭代次数
err11=0
err12=0
for(i in 1:500)
{
    set.seed(111)   
    model=nnet(quality~.,data=wine,maxit=i,rang=r,size=3,subset=samp)
    err11[i]=sum(predict(model,wine[samp,1:11],type='class')!=wine[samp,12])/n
    err12[i]=sum(predict(model,wine[-samp,1:11],type='class')!=wine[-samp,12])/(nrow.wine-n)
}

plot(1:length(err11),err11,'l',ylab="模型误判率",xlab="训练周期",col=1,ylim=c(min(min(err11),min(err12)),max(max(err11),max(err12))))
lines(1:length(err11),err12,col=1,lty=3)
legend(250,0.47,"测试集误判率",bty="n",cex=1.2)
legend(250,0.425,"训练集误判率",bty="n",cex=1.2)

# 取迭代次数为300,隐藏节点为3
set.seed(111)
model=nnet(quality~.,data=wine,maxit=300,rang=r,size=3,subset=samp)
x=wine[-samp,1:11]          
pred=predict(model,x,type="class")  
table(wine[-samp,12],pred)
上一篇:hadoop2.6源码解读之RPCServer类高性能设计
下一篇:云计算k8s对外服务解析
相关文章
图文推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站