R语言机器学习-caret
介绍
caret包(Classification and Regression Training)是一系列函数的集合,它试图对创建预测模型的过程进行流程化。本系列将就数据预处理、特征选择、抽样、模型调参等进行介绍学习。
主要包括图形可视化,数据预处理,特征选择,数据分割,模型的构建与预测等方面,caret包为 R 中超过 200 个包提供了统一的接口,方便了我们的使用。
大家可以去caret官方网站查看每种方法可以调试的参数http://topepo.github.io/caret/available-models.html
caret包的应用
首先我们使用的数据是一个医学实验数据,载入数据之后可以发现其样本数为528,自变量数为342,mdrrDescr为自变量数据框,mdrrClass为因变量。
#载入包以及读入数据
library(caret)
data(mdrr)
dim(mdrrDescr)
[1] 528 342
数据预处理
当我们想要进行建模时,首先需要对数据进行预处理,包括标准化,删除缺失值,合并变量等等操作,在caret
中都存在对应的函数帮助我们处理数据。
#删除方差为0的变量
zerovar=nearZeroVar(mdrrDescr)
newdata1=mdrrDescr[,-zerovar]
#可以发现现在只剩下297个变量了
dim(newdata1)
[1] 528 297
另一类需要删除的是与其它自变量有很强相关性的变量,对应的命令是findcorrelation
。自变量中还有可能存在多重共线性问题,可以用findLinearCombos
命令将它们找出来。
#首先删除强相关的变量
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)
特征选择
在进行数据挖掘时,我们并不需要将所有的自变量用来建模,而是从中选择若干最重要的变量,这称为特征选择(feature selection)。一种算法就是后向选择,即先将所有的变量都包括在模型中,然后计算其效能(如误差、预测精度)和变量重要排序,然后保留最重要的若干变量,再次计算效能,这样反复迭代,找出合适的自变量数目。这种算法的一个缺点在于可能会存在过度拟合,所以需要在此算法外再套上一个样本划分的循环。在caret包中的rfe命令可以完成这项任务。
ctrl= rfeControl(functions = rfFuncs, method = "repeatedcv",verbose = FALSE, returnResamp = "final")
#functions是确定用什么样的模型进行自变量排序,本例选择的模型是随机森林即rfFuncs,可以选择的
#还有lmFuncs(线性回归),nbFuncs(朴素贝叶斯),treebagFuncs(装袋决策树),caretFuncs
#(自定义的训练模型)。method是确定用什么样的抽样方法,本例使用cv即交叉检验, 还有提升boot以及
#留一交叉检验LOOCV
最后使用rfe命令进行特征选择
Profile = rfe(newdata3, mdrrClass, rfeControl = ctrl)
print(Profile)
plot(Profile)
数据建模及预测
预处理完成后,我们就需要使用train
函数选择合适的机器学习算法进行训练以及使用predict
函数对结果进行预测
#首先按照比例划分训练集与测试集
newdata4=newdata3[,Profile$optVariables]
inTrain = createDataPartition(mdrrClass, p = 3/4, list = FALSE)
trainx = newdata4[inTrain,]
testx = newdata4[-inTrain,]
trainy = mdrrClass[inTrain]
testy = mdrrClass[-inTrain]
#作图查看前6个变量的分布情况
featurePlot(trainx[,1:6],trainy,plot='box')
在正式训练前,首先需要使用trainControl
函数定义模型训练参数,method确定多次交叉检验的抽样方法,number确定了划分的重数, repeats确定了反复次数。
fitControl = trainControl(method = "repeatedcv", number = 10, repeats = 3,returnResamp = "all")
使用train
训练模型,本例中使用的时gbm
算法,我们可以对一些参数进行手动调优,包括interaction.depth,n.trees,shrinkage,n.minobsinnode等参数,也可以使用默认参数
gbmFit = train(trainx,trainy,method = "gbm",trControl = fitControl,verbose = FALSE)
随后预测模型准确度
predict(gbmFit1, newdata = testx)
#或者使用extractPrediction
predValues = extractPrediction(models,testX = testx, testY = testy)
head(predValues)
#如果要得到预测概览,则使用extractProb函数
probValues = extractProb(models,testX = testx, testY = testy)
testProbs = subset(probValues, dataType == "Test")
#对于分类问题的效能检验,最重要的是观察预测结果的混淆矩阵
Pred1 = subset(testValues, model == "gbm")
confusionMatrix(Pred1$pred, Pred1$obs)
Confusion Matrix and Statistics
Reference
Prediction Active Inactive
Active 68 14
Inactive 6 43
Accuracy : 0.8473
95% CI : (0.7741, 0.9042)
No Information Rate : 0.5649
P-Value [Acc > NIR] : 4.442e-12
Kappa : 0.6843
Mcnemar's Test P-Value : 0.1175
Sensitivity : 0.9189
Specificity : 0.7544
Pos Pred Value : 0.8293
Neg Pred Value : 0.8776
Prevalence : 0.5649
Detection Rate : 0.5191
Detection Prevalence : 0.6260
Balanced Accuracy : 0.8367
'Positive' Class : Active
最后使用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 )
查看原文https://blog.csdn.net/jiabiao1602/article/details/44975741