生信学习R绘图机器学习算法

R语言机器学习-caret

2019-09-28  本文已影响0人  nnlrl

介绍

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

上一篇下一篇

猜你喜欢

热点阅读