##统计预测与决策第三章代码重现
#神经网络模型训练
library(doParallel)
registerDoParallel(4)
nnetGrid=expand.grid(decay=c(0,0.01,0.1),
size=c(1,3,5,7,9,11,13),
bag=FALSE) #创建参数网格
set.seed(100)
nnetTune=train(x=solTrainXtrans,y=solTrainY,
method="avNNet",
tuneGrid=nnetGrid,
trControl=ctrl,
preProc=c("center","scale"),
linout=TRUE, #输出线性模型系数
trace=FALSE, #不输出详细训练过程
MaxNWts=13*(ncol(solTrainXtrans)+1)+13+1, #最大权重数量
maxit=1000, #最大迭代次数
allowParallel=FALSE) #禁用并行计算
nnetTune
plot(nnetTUne)
testResults=data.frame(obs=solTestY,
NNet=predict(nnetTune,solTestXtrans))
##MARS模型训练
set.seed(100)
marsTune=train(x=solTrainXtrans,y=solTrainY,
method="earth",
tuneGrid = expand.grid(degree=1,nprune=2:38),
trControl = ctrl)
marsTune
##绘制不同参数的结果
plot(marsTune)
#重要性排序绘图
testResults$MARS=predict(marsTune,solTestXtrans)
marsImp=varImp(marsTune,scale=FALSE)
plot(marsImp,top=25)
##SVMR模型训练
set.seed(100)
svmRTune=train(x=solTrainXtrans,y=solTrainY,
method="svmRadial", # 指定使用径向基核函数的支持向量机模型
preProc=c("center","scale"),
tuneLength=14, # 调参的长度,即尝试不同的参数组合数量
trControl=ctrl)
svmRTune
# 绘制调参结果的图形,横坐标采用对数刻度
plot(svmRTune,scales = list(x=list(log=2)))
##SVMP模型训练
svmGrid=expand.grid(degree=1:2,
scale=c(0.01,0.005,0.001),
c=2~(-2,5))
set.seed(100)
svmPTune=train(x=solTrainXtrans,y=solTrainY,
method = "svmPoly", # 指定使用多项式核函数的支持向量机模型
preProc=c("center","scale"),
tuneGrid=svmGrid,
trControl = ctrl)
svmPTune
# 绘制调参结果的图形,横坐标采用对数刻度,纵坐标采用线性刻度
plot(svmPTune,
scales=list(x=list(log=2),
between=list(x=0.5,y=1)))
##模型对比
testResults$SVMr=predit(svmRTune,solTestXtrans)
testResults$SVMp=predict(svmPTune,solTestXtrans)
##knn算法
# 去除训练数据中方差接近于零的列
knnDescr=solTrainXtrans[,-nearZeroVar(solTrainXtrans)]
set.seed(100)
knnTune=train(x=knnDescr,y=solTrainY,
method="knn", # 指定使用KNN模型
preProc=c("center","scale"),
tuneGrid=data.frame(k=1:20),
trControl=ctrl)
knnTune
plot(knnTune)
testResults$Knn=predict(knnTune,solTestXtrans[,names(knnDescr)])