R语言实现模型构建

2021-05-20 10:23:55 浏览数 (3)

在创建模型的时候,需要从筛选变量、模型,数据分组,评估模型等一系列的过程才能创建一个有实际意义的模型。今天就给大家介绍在R语言中一个工具包caret(Classificationand Regression Training)。此包是为了解决分类和回归问题的数据训练而创建的一个综合工具包。首先看下包的安装:
代码语言:javascript复制
install.packages("caret")

接下来我们看下在这个包中几个主要的功能:

1. 数据的分割。createDataPartition()对数据进行训练集和测试集的简单无放回分割;bootstrap samples()进行有放回的分组;createFolds()用于进行交叉验证的K分组;groupKFold()基于分组因子的交叉分组。其中times指的组数;list指的是否以列表形式输出。我们直接看下实例:

data(oil)

2. 数据的预处理。需要用的函数是preProcess(),此函数可以通过中心化和标准化两个方法对数据进行前期的预处理。其中主要的参数是x数据,其需要注意的是预测值如果包含非数字化的字符,会被忽略。另外就是方法的选择:"BoxCox","YeoJohnson", "expoTrans", "center","scale", "range", "knnImpute","bagImpute", "medianImpute", "pca","ica", "spatialSign", "corr", "zv", "nzv",and "conditionalX"。需要根据自己的数据进行选择。基本步骤是首先构建当前数据的预处理模型,然后利用predict函数进行参照此模型进行数据的预处理。接下来看一下实例:

代码语言:javascript复制
data(BloodBrain)
preProc <- preProcess(bbbDescr[1:100,-3])
training <- predict(preProc,bbbDescr[1:100,-3])

3. 特征的选择。在这里用到了rfe函数。此函数主要用来对特征值进行筛选。其主要的参数size需要提供一个数字向量代表需要保留的特征的数量;rfeControl则是需要我们进行特征筛选模型的参数设置。我们直接看一个实例:

代码语言:javascript复制
data(BloodBrain)
 
x <-scale(bbbDescr[,-nearZeroVar(bbbDescr)])
x <- x[, -findCorrelation(cor(x),.8)]
x <- as.data.frame(x,stringsAsFactors = TRUE)
 
set.seed(1)
lmProfile <- rfe(x, logBBB,
                 sizes = c(2:25, 30, 35, 40,45, 50, 55, 60, 65),
                 rfeControl =rfeControl(functions = lmFuncs,
                                         number= 200))
代码语言:javascript复制
set.seed(1)
lmProfile2 <- rfe(x, logBBB,
                 sizes = c(2:25, 30, 35, 40,45, 50, 55, 60, 65),
                 rfeControl =rfeControl(functions = lmFuncs,
                                         rerank = TRUE,
                                         number= 200))
###模型之间的比较
xyplot(lmProfile$results$RMSE  lmProfile2$results$RMSE  ~
      lmProfile$results$Variables,
      type = c("g", "p", "l"),
      auto.key = TRUE)
代码语言:javascript复制
lmProfile$variables#查看对应的每个数量的变量名称。

4. 模型的训练预测。在这里需要用到train函数进行模型的构建具体参数如下:

其中主要的几个参数:

X可以为数据矩阵或者数据框,其中行为特征,列为样本。也可以作为recipe导入。所谓recipe指的是一个带有数据并对预测值和特征进行描述的参数数据集。其构建实例如下:

代码语言:javascript复制
library(modeldata)
library(recipes)
data(biomass)
 
# split data
biomass_tr <- biomass[biomass$dataset== "Training",]
biomass_te <- biomass[biomass$dataset== "Testing",]
 
# When only predictors and outcomes, asimplified formula can be used.
rec <- recipe(HHV ~ carbon   hydrogen  oxygen   nitrogen   sulfur,
              data = biomass_tr)

preProcess 此参数就是对数据预处理的参数,可以在这里选择对应的方法对导入模型的数据进行前期的预处理。

method 指的是模型的选择,这里作者提供了官方的文档见链接:http://topepo.github.io/caret/train-models-by-tag.html。

trControl 此参数需要借助trainControl函数进行模型参数的限制,从官方文档可以看到每个模型都有自己对应的参数选择。

metric 指定用于选择最佳模型的汇总度量的字符串。默认情况下,回归的可能值是“RMSE”和“Rsquared”,分类的可能值是“Accuracy”和“Kappa”。如果使用了自定义性能指标(通过trainControl中的summaryFunction参数,指标的值应该与其中一个参数匹配。如果没有,则发出一个警告,并使用summaryFunction给出的第一个指标。

接下来我们直接看下实例:

代码语言:javascript复制
data(iris)
TrainData <- iris[,1:4]
TrainClasses <- iris[,5]
 
knnFit1 <- train(TrainData,TrainClasses,
                method ="knn",
                 preProcess =c("center", "scale"),
                 tuneLength = 10,
                 trControl =trainControl(method = "cv"))
代码语言:javascript复制
ggplot(knnFit1)
代码语言:javascript复制
Classes <- predict(knnFit1, newdata =TrainData)##模型的预测

当然我们可以看下具体的预测情况:

代码语言:javascript复制
Classes <- predict(knnFit1, newdata =TrainData,type = "prob")

当然如果我们跑了好几个模型想一起看下每个预测情况,我们需要用到另外一个函数extractPrediction。此函数可以展示所有模型的预测结果。我们看下实例:

代码语言:javascript复制
bothModels <- list(knn = knnFit1)
Classes <-extractPrediction(bothModels, testX = TrainData)

那么怎么获取预测结果的混合矩阵呢,在这里我们用来另外一个函数confusionMatrix。看下实例:

代码语言:javascript复制
Pred1=subset(Classes)
confusionMatrix(Pred1$pred, Pred1$obs)

以上只是一个实例,如果想用其他模型只需要对应的修改相关的方法就可以构建模型。并对模型进行后期的评估。

0 人点赞