R机器学习:机器学习的首选工具caret包的详细介绍
caret(Classification And Regression Training)是R语言中最广泛使用的机器学习包之一,最初由 Max Kuhn 开发,目的是为了简化机器学习流程,为用户提供一个统一的接口来处理不同模型、调参和验证。
在传统机器学习中,模型的训练和验证通常需要处理多个步骤(如数据预处理、特征工程、模型选择、参数调优等),且不同模型的接口不一致。caret 将这些步骤封装在一个统一的框架内,大大降低了使用不同机器学习算法的复杂性。
由于 caret 的广泛应用和功能的全面性,它到目前仍然是许多R用户的首选工具,尤其在快速构建机器学习模型时表现优异。
caret 包的主要功能:
- 数据预处理: 包括缺失值处理、数据标准化、数据转换、创建哑变量等。
- 数据分割: 将数据集划分为训练集、测试集、验证集等。
- 特征选择: 选择重要的特征,提高模型性能。
- 模型训练: 提供统一的接口训练各种机器学习模型。
- 参数调优: 自动搜索最佳的模型参数。
- 模型评估: 使用多种指标评估模型性能。
- 模型比较: 比较不同模型的性能。
后面的文章就是按照上面顺序一步一步来给大家详细讲的:
数据预处理:
preProcess() 函数用于数据预处理。包括缺失值处理、特征缩放、标准化、哑变量编码、去除高度相关的特征等等。主要涉及到preProcess() 函数的 method 参数。根据数据类型和特点选择合适的预处理方法: "center" 和 "scale":中心化和标准化,适用于大多数连续型数据,尤其是在使用需要计算距离的算法(如 KNN、SVM)时。 "BoxCox" 和 "YeoJohnson":幂变换,用于处理偏态数据,使其更接近正态分布。YeoJohnson 适用于包含负值的数据。 "pca" 和 "ica":降维,用于处理高维数据,减少特征数量,提高模型训练速度,并可能提高模型泛化能力。 "knnImpute" 和 "bagImpute":缺失值插补,用于处理数据中的缺失值。knnImpute 使用 K 近邻算法进行插补,bagImpute 使用 bagging 方法进行插补。下面的代码就对数据进行分割,然后分别对训练集和测试集进行了"center", "scale", "pca",然后生成主成分:
train_index <- createDataPartition(iris$Species, p = 0.7, list = FALSE)
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]
# 创建预处理方法
preprocess <- preProcess(train_data[, -5], method = c("center", "scale", "pca"), thresh = 0.95)
# 应用预处理
train_processed <- predict(preprocess, train_data[, -5])
test_processed <- predict(preprocess, test_data[, -5])运行代码后就成了下面了两个主成分,后面就直接用这两个主成分当作预测变量去训练模型即可:
数据分割:
createDataPartition() 函数用于创建数据分割。下面代码便是一个7:3比例划分训练集和测试集的例子:
# 创建训练集和测试集
set.seed(123)
index <- createDataPartition(iris$Species, p = 0.7, list = FALSE)
train_data <- iris[index,]
test_data <- iris[-index,]特征选择
特征选择的过程在caret包中也可以轻松实现。主要包括3种特征选择方法:
第一种是递归特征消除(RFE, Recursive Feature Elimination),RFE 是一种基于模型的特征选择方法,它通过以下步骤进行:
- 使用所有特征训练模型。
- 通过某种重要性指标(如变量重要性)评估每个特征对模型性能的贡献。
- 逐步去除贡献较低的特征,并重复训练模型,直到达到预设的特征数。
RFE 是一种迭代的过程,因此适合对少量特征进行选择,不适合高维数据集。
第二种是基于过滤器的方法(Filter Methods)过滤器方法通过统计特征和目标变量之间的关系(如相关性、卡方检验、互信息等),评估特征的重要性,并过滤掉不显著的特征。
第三种是嵌入式方法(Embedded Methods):嵌入式方法直接结合机器学习算法(如随机森林、LASSO 回归等)中的变量重要性,筛选出重要的特征。
现在我有一个数据集有60个自变量,相当多了,这个时候必须筛掉一波,那么我要用RFE方法的话就可以写出如下代码:
control <- rfeControl(
functions = rfFuncs, # 使用随机森林评估特征
method = "cv", # 使用交叉验证
number = 5 # 5折交叉验证
)
# 递归特征消除
rfe_model <- rfe(
x = Sonar[, -ncol(Sonar)], # 自变量(剔除最后一列 "Class")
y = Sonar$Class, # 因变量(分类标签)
sizes = c(1:10, 15, 20), # 特征子集大小
rfeControl = control # 控制参数
)
# 查看 RFE 的结果
print(rfe_model)输出结果如下:
可以看到结果中展示了特征选择过程中性能指标的详细表格,每个子集大小(变量数量)对应一组模型性能指标,同时最后一行输出了Top variables:显示被选中的特征名称,通常按重要性排序。这里60个预测变量选出可5个最重要的。
再看基于过滤器的方法(Filter Methods),比如过滤相关性大的变量,可以用下面代码:
findCorrelation() 函数可以用于剔除高度相关的特征。
# 计算特征间的相关性
cor_matrix <- cor(Sonar[, -ncol(Sonar)]) # 计算自变量的相关性矩阵
# 找到相关性较高的特征
highly_correlated <- findCorrelation(cor_matrix, cutoff = 0.75) # 设置相关性阈值
# 剔除相关性较高的特征
reduced_data <- Sonar[, -highly_correlated]
# 查看结果
cat("剔除的特征索引:", highly_correlated, "\n")
cat("剔除后的特征数:", ncol(reduced_data), "\n")运行后就可以知道60个预测变量中其实有32个是高度相关的,那么这32个变量我们只需要留下一个,所以这个样子筛选下来就只剩29个变量了。
我们接着看嵌入式方法。典型的就是变量重要性,caret 提供了 varImp() 函数,用于提取模型中各特征的重要性。许多模型(如随机森林、线性模型)支持变量重要性评估。一个随机森林模型输出变量重要性的代码如下:
# 训练随机森林模型
set.seed(123)
rf_model <- randomForest(Class ~ ., data = Sonar, importance = TRUE)
# 提取变量重要性
importance <- varImp(rf_model)
# 查看变量重要性
print(importance)
# 可视化变量重要性
plot(importance)运行后输出如下:
可以看到最重要的20个变量都被筛出来了。同时还输出了变量重要性的图:
以上就是在caret中进行特征选择的操作示意。接着看模型训练。
模型训练:
train() 函数用于训练模型。基本结构如下:
要注意的是method参数,支持:
- "rf":随机森林
- "glm":广义线性模型
- "svmRadial":支持向量机(径向核)
- "xgbTree":梯度提升树
还可通过 modelLookup() 查看所有支持的模型。train 函数是 caret 包的核心,封装了数据预处理、模型训练、超参数调优和交叉验证等功能。通过调整 train 的参数,我们可以快速实现多种机器学习算法的建模和优化,适用于从简单的线性模型到复杂的非线性模型。
参数调优:
caret包中参数调优主要依赖于trainControl() 函数,用来设置模型训练过程的控制参数,尤其是在交叉验证、重采样方法、性能评估和模型保存等方面作用重大,基本写法如下:
给大家写一个使用 trainControl()结合train ()进行 5 折交叉验证训练随机森林模型的例子:
# 设置训练控制参数
control <- trainControl(
method = "cv", # 交叉验证
number = 5, # 5 折
verboseIter = TRUE, # 显示训练过程
savePredictions = "final", # 保存预测结果
classProbs = TRUE, # 计算分类概率
summaryFunction = multiClassSummary # 多分类评估
)
# 训练随机森林模型
set.seed(123)
rf_model <- train(
Species ~ .,
data = iris,
method = "rf",
trControl = control,
tuneLength = 3
)
# 查看结果
print(rf_model)
# 绘制调优结果
plot(rf_model)运行后输出如下:
可以看到输出了不同超参mtry下的随机森林模型表现,一应俱全。
模型评估:
confusionMatrix() 函数用于计算混淆矩阵和各种评估指标。
# 混淆矩阵
confusionMatrix(predictions, test_data$Species)模型比较:
resamples() 函数用于比较不同模型的性能。比如我同样的数据训练3个模型,分别是随机森林、支持向量机、和KNN,这三个模型放在一起比较的话代码如下:
# 训练多个模型
rf_model <- train(Species ~ ., data = iris, method = "rf", trControl = control)
svm_model <- train(Species ~ ., data = iris, method = "svmLinear", trControl = control)
knn_model <- train(Species ~ ., data = iris, method = "knn", trControl = control)
# 比较模型性能
results <- resamples(list(RF = rf_model, SVM = svm_model, KNN = knn_model))
# 查看汇总结果
summary(results)运行后即可得到三个模型的性能比较结果
可以看到还是支持向量机模型的Accuracy最好。
技巧总结
1. 数据预处理技巧,选择合适的预处理方法:
- 使用 nearZeroVar() 移除近零方差变量: 近零方差变量对模型训练没有帮助,反而可能导致模型不稳定。使用 nearZeroVar() 函数可以快速检测并移除这些变量。
- 创建哑变量时注意基线类别: 使用 dummyVars() 函数创建哑变量时,默认会创建一个基线类别。在某些情况下需要手动指定基线类别,或者直接不创建基线类别。
- 在 train() 函数中直接进行预处理: 可以直接在 train() 函数中使用 preProcess 参数进行预处理,这样可以避免在训练集和测试集上重复进行相同的预处理步骤,并确保预处理的一致性。例如:
train(Species ~ ., data = train_data, method = "rf", preProcess = c("center", "scale"))。2. 模型训练技巧:
- 选择合适的模型: caret 支持大量的机器学习算法,通过 getModelInfo() 函数可以查看所有支持的算法。根据问题的类型(分类、回归、聚类等)和数据的特点选择合适的模型。
- 使用 tuneLength 或 tuneGrid 进行参数调优: tuneLength 用于指定随机搜索的次数,tuneGrid 用于指定网格搜索的参数网格。对于计算资源有限的情况,可以先使用 tuneLength 进行初步的参数搜索,然后再使用 tuneGrid 在更小的范围内进行精细的搜索。
- 使用合适的评估指标: metric 参数用于指定评估模型的指标。根据问题的类型选择合适的指标: 分类问题:"Accuracy"(准确率)、"Kappa"(Kappa 系数)、"ROC"(ROC 曲线下面积)等。 回归问题:"RMSE"(均方根误差)、"Rsquared"(R 方)、"MAE"(平均绝对误差)等。
- 使用交叉验证或其他重采样方法: trainControl() 函数的 method 参数用于指定重采样方法,常用的方法包括: "cv":K 折交叉验证。 "repeatedcv":重复 K 折交叉验证。 "LOOCV":留一交叉验证。 "boot":自助法。
- 使用 verboseIter 参数查看训练过程: 在 trainControl() 函数中设置 verboseIter = TRUE 可以查看模型训练的详细过程,包括每次迭代的性能指标。这对于调试模型和了解模型的训练情况非常有帮助。
3. 参数调优技巧:
- 了解模型参数的含义: 在进行参数调优之前,需要了解每个模型参数的含义和作用,才能更好地设置参数的搜索范围。
- 先粗略搜索,再精细搜索: 可以先使用较大的 tuneLength 或较粗的 tuneGrid 进行粗略的参数搜索,找到一个大致的参数范围,然后再使用较小的 tuneLength 或较细的 tuneGrid 在该范围内进行精细的搜索。
- 使用 tuneGrid 预定义参数网格: 对于一些常用的模型,caret 已经预定义了一些参数网格,可以通过 getModelInfo() 函数查看。例如,对于随机森林模型,可以使用 modelLookup("rf") 查看预定义的参数网格。
- 使用自定义的参数网格: 如果预定义的参数网格不满足需求,可以自己创建参数网格。使用 expand.grid() 函数可以方便地创建参数网格。
4. 模型评估技巧:
- 使用多种评估指标: 不要只关注单一的评估指标,应该综合考虑多个指标来评估模型的性能。
- 使用混淆矩阵进行分类问题评估: confusionMatrix() 函数可以计算混淆矩阵和各种评估指标,包括准确率、精确率、召回率、F1 值等。
- 绘制 ROC 曲线和 AUC: ROC 曲线和 AUC 可以直观地展示分类模型的性能。
- 使用 resamples() 函数比较不同模型的性能: resamples() 函数可以比较不同模型在相同重采样条件下的性能,并进行统计检验。
5. 其他技巧:
- 使用 train() 函数的 importance 参数获取变量重要性: 一些模型(如随机森林、梯度提升机)可以计算变量的重要性,通过设置 importance = TRUE 可以在模型训练后获取变量的重要性信息。
- 使用 varImp() 函数可视化变量重要性: varImp() 函数可以将变量的重要性信息可视化。
- 使用 predict() 函数的 type 参数获取不同类型的预测结果: 例如,对于分类问题,可以使用 type = "prob" 获取每个类别的概率,使用 type = "raw" 获取预测的类别。
- 保存和加载模型: 使用 saveRDS() 和 readRDS() 函数可以保存和加载训练好的模型,方便后续使用。
小结
今天给大家介绍了caret包。感谢大家耐心看完,自己的文章都写的很细,重要代码都在原文中,希望大家都可以自己做一做。如果对您有用请先记得收藏,再点赞分享。也欢迎大家的意见和建议,大家想了解什么统计方法都可以在文章下留言,说不定我看见了就会给你写教程哦,有疑问欢迎私信,有合作意向请直接滴滴我。
如果你是一个大学本科生或研究生,如果你正在因为你的统计作业、数据分析、模型构建,科研统计设计等发愁,如果你在使用SPSS, R,Mplus中遇到任何问题,都可以联系我。因为我可以给您提供最好的,最详细和耐心的数据分析服务。
如果你对Z检验,t检验,方差分析,多元方差分析,回归,卡方检验,相关,多水平模型,结构方程模型,中介调节,量表信效度等等统计技巧有任何问题,请私信我,获取详细和耐心的指导。
如果你或你的团队需要专业的科研数据清洗,建模服务,教学培训需求等等。请联系我。
If you are a student and you are worried about you statistical #Assignments, #Data #Analysis, #Thesis, #Reports, #Composing, #Quizzes, Exams.. And if you are facing problem in #SPSS, #R-Programming, #Excel, Mplus, then contact me. Because I could provide you the best services for your Data Analysis.
Are you confused with statistical Techniques like z-test, t-test, ANOVA, MANOVA, Regression, Logistic Regression, Chi-Square, Correlation, Association, SEM, multilevel model, mediation and moderation etc. for your Data Analysis...??
Then Contact Me. I will solve your Problem...
If You or Your Research Team Need Professional Scientific Data Cleaning, Model Building Services or Statistical Consulting... Please Contact Me.
往期精彩
R机器学习:神经网络算法的理解与实操,实例解析
R数据分析:工具变量回归的做法和解释,实例解析
R机器学习:决策树算法的理解与实操
R数据分析:临床研究样本量计算、结果解读与实操
R数据分析:网状meta分析的理解与实操
R数据分析:非劣效性研究设计的统计处理方法,原理和实例
R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析
R数据分析:净重新分类(NRI)和综合判别改善(IDI)指数的理解
R数据分析:反事实框架和因果中介的理论理解
R数据分析:广义估计方程式GEE的做法和解释
R数据分析:潜类别轨迹模型LCTM的做法,实例解析
R数据分析:潜变量与降维方法(主成分分析与因子分析)
R数据分析:如何给结构方程画路径图,tidySEM包详解
R数据分析:生存分析与有竞争事件的生存分析的做法和解释
R机器学习:朴素贝叶斯与支持向量机的原理与实现
R数据分析:混合效应模型的可视化解释,再不懂就真没办法
R数据分析:tableone包的详细使用介绍
R数据分析:如何用lavaan包做结构方程模型,实例解析
R机器学习:分类算法之K最邻进算法(KNN)的原理与实现