r语言 tunerf函数_R语言之-caret包应用
R语言之-caret包应用
caret包应用之一:数据预处理
在使用时,我们依赖于R中的众多扩展包库,每个都有其独特的功能和用途.通过整合这些工具能够显著提升工作效率. caret 包(Classification )是一个强大的分类模型训练工具,提供了多种算法选择.
and Regression
Training)特别设计用于应对分类和回归问题的数据训练需求,并作为一个全面的数据工具包。以下将通过涉及数据挖掘的关键步骤来展示其应用实例。
本例所涉及的数据属于医学实验数据的一种,在加载数据后可观察到样本数量共计528个;自变量的数量则达到342个;其中mdrrDescr即代表自变量的数据框;而mdrrClass即代表因变量。
library(caret)
data(mdrr)
本例中的样本数据所包含的变量数量较多,在进行初步降维时需要注意哪些问题?其中一种需要删除的是那些常数自变量或者是方差极小的自变量子类,在具体操作时应使用命令nearZeroVar这一工具来进行识别和处理;经过上述操作后可观察到处理后的新数据集中自变量数量降至297个左右的情况
zerovar=nearZeroVar(mdrrDescr)
newdata1=mdrrDescr[,-zerovar]
还有其他自变量之间存在较强相关性的那些变量也需要被剔除出去。可用find_correlation来执行这一操作以识别并剔除这些高度相关的自变量。在完成此操作后发现还可能存在多重共线性问题,则可用find_linear_combos命令来检测哪些自变量间存在这种关系并加以修正。经过上述处理后剩余的有效自变量数量减少至94个
descrCorr = cor(newdata1)
highCorr = findCorrelation(descrCorr, 0.90)
newdata2 = newdata1[, -highCorr]
comboInfo = findLinearCombos(newdata2)
newdata2=newdata2[, -comboInfo$remove]
对于数据预处理阶段来说,标准化处理与缺失值补充是不可或缺的步骤。在这一阶段中,默认情况下会首先对数据进行标准化处理,并通过预处理模块完成这一操作。除了上述基本功能外,在高级版本中还集成了一种基于K近邻算法与集成学习的随机森林模型来辅助填补缺失数据。此外该系统还可以通过幂等变换技术以及主成分分析方法进一步优化数据特征
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’)

caret包应用之二:特征选择
在数据挖掘的过程中,并不需要将所有自变量都用于建模过程。相反,在众多候选中筛选出关键变量更为有效。
该算法采用后向选择策略,在初始状态下将所有候选变量纳入模型框架中进行分析。随后系统性地计算模型效能(例如误差率、预测精度)以及各变量的重要性排序,并筛选出表现最优的关键变量。通过不断重复此优化过程直至确定最优自变量数量目标。值得注意的是,在应用该方法时通常需搭配数据集分层采样的策略以规避过拟合问题带来的影响,在 caret 包中的 rfe 命令正是用于实现这一功能的工具。
首先定义几个整数,程序必须测试这些数目的自变量.
subsets = c(20,30,40,50,60,70,80)
随后设定控制变量 functions 用于指定用于自变量排序的模型类型,在本例中我们采用随机森林模型 rfFuncs;还可以选择线性回归 lmFuncs、朴素贝叶斯 nbFuncs、袋装决策树 treebagFuncs 或者定制化的训练模型 caretFuncs。
在研究中, method是用来确定采用哪种抽样方法的, 在本例中我们采用了cv即cross validation的方法, 并结合了boosting技术以及leave-one-out cross-validation (LOOCV)
ctrl= rfeControl(指定功能集为rfFuncs, 采用交叉验证方法, 设置为不输出冗余信息, 仅返回最终样本)
最后使用rfe命令进行特征选择,计算量很大,这得花点时间
Profile = rfe(newdata3, mdrrClass, sizes = subsets, rfeControl = ctrl)
观察结果选择50个自变量时,其预测精度最高
print(Profile)
Variables Accuracy Kappa AccuracySD KappaSD Selected
20 0.8200 0.6285 0.04072 0.08550
30 0.8200 0.6294 0.04868 0.10102
40 0.8295 0.6487 0.03608 0.07359
50 0.8313 0.6526 0.04257 0.08744 *
60 0.8277 0.6447 0.03477 0.07199
70 0.8276 0.6449 0.04074 0.08353
80 0.8275 0.6449 0.03991 0.08173
94 0.8313 0.6529 0.03899 0.08006
用图形也可以观察到同样结果
plot(Profile)

特征选择
下面的命令则可以返回最终保留的自变量
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", times: 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时精度最高
interaction.depth n.trees Accuracy Kappa Accuracy SD Kappa SD
1 50 0.822 0.635 0.0577 0.118
1 100 0.824 0.639 0.0574 0.118
1 150 0.826 0.643 0.0635 0.131
1 200 0.824 0.64 0.0605 0.123
1 250 0.816 0.623 0.0608 0.124
1 300 0.824 0.64 0.0584 0.119
3 50 0.816 0.621 0.0569 0.117
3 100 0.82 0.631 0.0578 0.117
3 150 0.815 0.621 0.0582 0.117
3 200 0.82 0.63 0.0618 0.125
3 250 0.813 0.617 0.0632 0.127
3 300 0.812 0.615 0.0622 0.126
同样的图形观察
plot(gbmFit1)

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)
obs pred model dataType object
1 Active Active gbm Training Object1
2 Active Active gbm Training Object1
3 Active Inactive gbm Training Object1
4 Active Active gbm Training Object1
5 Active Active gbm Training Object1
从中可提取检验样本的预测结果
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(Pred1pred, Pred1obs)
confusionMatrix(Pred2pred, Pred2obs)
结果如下,可见第一个模型在准确率要比第二个模型略好一些
Reference
Prediction Active Inactive
Active 65 12
Inactive 9 45
Accuracy : 0.8397
Reference
Prediction Active Inactive
Active 63 12
Inactive 11 45
Accuracy : 0.8244
最后是利用ROCR包来绘制ROC图
prob1 = subset(testProbs, model == “gbm”)
prob2 = subset(testProbs, model == “treebag”)
library(ROCR)
prob1lable=ifelse(prob1obs==’Active’,yes=1,0)
pred1 = prediction(prob1Active,prob1lable)
perf1 = performance(pred1, measure=”tpr”, x.measure=”fpr” )
plot( perf1 )

完 谢谢观看
