R语言之-caret包应用


来源 | R友

caret包应用之一:数据预处理

在进行数据挖掘时,我们会用到R中的很多扩展包,各自有不同的函数和功能。如果能将它们综合起来应用就会很方便。caret包(Classification and Regression Training)就是为了解决分类和回归问题的数据训练而创建的一个综合工具包。下面的例子围绕数据挖掘的几个核心步骤来说明其应用。


本例涉及到的数据是一个医学实验数据,载入数据之后可以发现其样本数为528,自变量数为342,mdrrDescr为自变量数据框,mdrrClass为因变量。

library(caret)
data(mdrr)

本例的样本数据所涉及到的变量非常多,需要对变量进行初步降维。其中一种需要删除的变量是常数自变量,或者是方差极小的自变量,对应的命令是nearZeroVar,可以看到新数据集的自变量减少到了297个。

zerovar=nearZeroVar(mdrrDescr)
newdata1=mdrrDescr[,-zerovar]

另一类需要删除的是与其它自变量有很强相关性的变量,对应的命令是findcorrelation。自变量中还有可能存在多重共线性问题,可以用findLinearCombos命令将它们找出来。这样处理后自变量减少为94个。

descrCorr = cor(newdata1)
highCorr = findCorrelation(descrCorr, 0.90)
newdata2 = newdata1[, -highCorr]
comboInfo = findLinearCombos(newdata2)
newdata2=newdata2[, -comboInfo$remove]

我们还需要将数据进行标准化并补足缺失值,这时可以用preProcess命令,缺省参数是标准化数据,其高级功能还包括用K近邻和装袋决策树两种方法来预测缺失值。此外它还可以进行cox幂变换和主成分提取。

Process = preProcess(newdata2)
newdata3 = predict(Process, newdata2)

最后是用createDataPartition将数据进行划分,分成75%的训练样本和25%检验样本,类似的命令还包括了createResample用来进行简单的自助法抽样,还有createFolds来生成多重交叉检验样本。

inTrain = createDataPartition(mdrrClass, p = 3/4, list = FALSE)
trainx = newdata3[inTrain,]
testx = newdata3[-inTrain,]
trainy = mdrrClass[inTrain]
testy = mdrrClass[-inTrain]

在建模前还可以对样本数据进行图形观察,例如对前两个变量绘制箱线图

featurePlot(trainx[,1:2],trainy,plot=’box’)

640?wx_fmt=png

caret包应用之二:特征选择

在进行数据挖掘时,我们并不需要将所有的自变量用来建模,而是从中选择若干最重要的变量,这称为特征选择(feature selection)。一种算法就是后向选择,即先将所有的变量都包括在模型中,然后计算其效能(如误差、预测精度)和变量重要排序,然后保留最重要的若干变量,再次计算效能,这样反复迭代,找出合适的自变量数目。这种算法的一个缺点在于可能会存在过度拟合,所以需要在此算法外再套上一个样本划分的循环。在caret包中的rfe命令可以完成这项任务。


首先定义几个整数,程序必须测试这些数目的自变量.

subsets = c(20,30,40,50,60,70,80)

然后定义控制参数,functions是确定用什么样的模型进行自变量排序,本例选择的模型是随机森林即rfFuncs,可以选择的还有lmFuncs(线性回归),nbFuncs(朴素贝叶斯),treebagFuncs(装袋决策树),caretFuncs(自定义的训练模型)。
method是确定用什么样的抽样方法,本例使用cv即交叉检验, 还有提升boot以及留一交叉检验LOOCV

ctrl= rfeControl(functions = rfFuncs, method = “cv”,verbose = FALSE, returnResamp = “final”)

最后使用rfe命令进行特征选择,计算量很大,这得花点时间

Profile = rfe(newdata3, mdrrClass, sizes = subsets, rfeControl = ctrl)

观察结果选择50个自变量时,其预测精度最高

print(Profile)

Variables Accuracy Kappa AccuracySD KappaSD Selected

 
 

用图形也可以观察到同样结果

plot(Profile)

640?wx_fmt=png

下面的命令则可以返回最终保留的自变量

Profile$optVariables

caret包应用之三:建模与参数优化

在进行建模时,需对模型的参数进行优化,在caret包中其主要函数命令是train。


首先得到经过特征选择后的样本数据,并划分为训练样本和检验样本

newdata4=newdata3[,Profile$optVariables]
inTrain = createDataPartition(mdrrClass, p = 3/4, list = FALSE)
trainx = newdata4[inTrain,]
testx = newdata4[-inTrain,]
trainy = mdrrClass[inTrain]
testy = mdrrClass[-inTrain]

然后定义模型训练参数,method确定多次交叉检验的抽样方法,number确定了划分的重数, repeats确定了反复次数。

fitControl = trainControl(method = “repeatedcv”, number = 10, repeats = 3,returnResamp = “all”)

确定参数选择范围,本例建模准备使用gbm算法,相应的参数有如下四项

gbmGrid = expand.grid(.interaction.depth = c(1, 3),.n.trees = c(50, 100, 150, 200, 250, 300),.shrinkage = 0.1,.n.minobsinnode = 10)

利用train函数进行训练,使用的建模方法为提升决策树方法,

gbmFit1 = train(trainx,trainy,method = “gbm”,trControl = fitControl,tuneGrid = gbmGrid,verbose = FALSE)

从结果可以观察到interaction.depth取1,n.trees取150时精度最高

 
 

同样的图形观察

plot(gbmFit1)

640?wx_fmt=png

caret包应用之四:模型预测与检验

模型建立好后,我们可以利用predict函数进行预测,例如预测检测样本的前五个


predict(gbmFit1, newdata = testx)[1:5]

为了比较不同的模型,还可用装袋决策树建立第二个模型,命名为gbmFit2

gbmFit2= train(trainx, trainy,method = “treebag”,trControl = fitControl)
models = list(gbmFit1, gbmFit2)

另一种得到预测结果的方法是使用extractPrediction函数,得到的部分结果如下显示

predValues = extractPrediction(models,testX = testx, testY = testy)
head(predValues)

 
 

从中可提取检验样本的预测结果

testValues = subset(predValues, dataType == “Test”)

如果要得到预测概率,则使用extractProb函数

probValues = extractProb(models,testX = testx, testY = testy)
testProbs = subset(probValues, dataType == “Test”)

对于分类问题的效能检验,最重要的是观察预测结果的混淆矩阵

Pred1 = subset(testValues, model == “gbm”)
Pred2 = subset(testValues, model == “treebag”)
confusionMatrix(Pred1$pred, Pred1$obs)
confusionMatrix(Pred2$pred, Pred2$obs)

结果如下,可见第一个模型在准确率要比第二个模型略好一些

 
 

Reference

 
 

最后是利用ROCR包来绘制ROC图

prob1 = subset(testProbs, model == “gbm”)
prob2 = subset(testProbs, model == “treebag”)
library(ROCR)
prob1$lable=ifelse(prob1$obs==’Active’,yes=1,0)
pred1 = prediction(prob1$Active,prob1$lable)
perf1 = performance(pred1, measure=”tpr”, x.measure=”fpr” )
plot( perf1 )

 

640?wx_fmt=png

640?wx_fmt=png

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PSO-SVR是将粒子群优化算法(Particle Swarm Optimization,PSO)和支持向量回归(Support Vector Regression,SVR)相结合的一种回归算法。下面是一个简单的R语言实现PSO-SVR的代码示例: 首先需要安装并加载以下三个R:e1071、caret和pso。可以使用以下命令进行安装和加载: ```R install.packages("e1071") install.packages("caret") install.packages("pso") library(e1071) library(caret) library(pso) ``` 接下来,我们使用e1071中自带的svr函数训练模型,并使用caret中的train函数进行交叉验证。代码如下: ```R # 加载数据 data <- read.csv("data.csv") # 定义SVR参数范围 tuneGrid <- expand.grid(C = seq(0.1, 10, by = 0.1), epsilon = seq(0.01, 1, by = 0.01), sigma = seq(0.1, 10, by = 0.1)) # 定义交叉验证控制参数 ctrl <- trainControl(method = "repeatedcv", # 交叉验证方法,这里使用重复的k折交叉验证 repeats = 3, # 重复次数 summaryFunction = defaultSummary, # 总结函数 search = "grid") # 使用网格搜索法进行参数调优 # 定义PSO-SVR函数 pso_svr <- function(x, Y, xtest, C, epsilon, sigma) { # 训练SVR模型 model <- svm(x, Y, type = "eps-regression", kernel = "radial", cost = C, epsilon = epsilon, gamma = 1/(2*sigma^2)) # 预测测试集 ypred <- predict(model, xtest) # 计算MSE mse <- mean((ypred - Y)^2) return(mse) } # 定义PSO参数范围 lb <- c(rep(0.1, 3)) ub <- c(rep(10, 3)) control <- list(maxit = 100) # 运行PSO-SVR算法 result <- psoptim(lb, ub, pso_svr, x = data$x, Y = data$y, xtest = data$xtest, control = control, tuneGrid = tuneGrid, method = "gbest", swarmSize = 50, controlPar = list(pso.control = list(trace = FALSE))) # 输出最佳参数和MSE bestParams <- result$par bestMSE <- result$value cat("Best parameters: C =", bestParams[1], "epsilon =", bestParams[2], "sigma =", bestParams[3], "\n") cat("Best MSE:", bestMSE, "\n") ``` 在以上代码中,我们使用了一个简单的数据集(data.csv),含了一个自变量x和一个因变量y,以及一个测试集xtest。在定义SVR参数范围(tuneGrid)和交叉验证控制参数(ctrl)后,我们定义了一个PSO-SVR函数(pso_svr),其中使用了svm函数训练SVR模型,并计算了MSE作为优化目标。最后使用psoptim函数运行PSO-SVR算法,并输出最佳参数和MSE。 需要注意的是,以上代码只是一个简单的PSO-SVR实现示例,实际应用中可能需要对代码进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值