R机器学习:机器学习的首选工具caret包的详细介绍

360影视 2025-01-12 21:58 3

摘要:caret(Classification And Regression Training)是R语言中最广泛使用的机器学习包之一,最初由 Max Kuhn 开发,目的是为了简化机器学习流程,为用户提供一个统一的接口来处理不同模型、调参和验证。

caret(Classification And Regression Training)是R语言中最广泛使用的机器学习包之一,最初由 Max Kuhn 开发,目的是为了简化机器学习流程,为用户提供一个统一的接口来处理不同模型、调参和验证。

在传统机器学习中,模型的训练和验证通常需要处理多个步骤(如数据预处理、特征工程、模型选择、参数调优等),且不同模型的接口不一致。caret 将这些步骤封装在一个统一的框架内,大大降低了使用不同机器学习算法的复杂性。

由于 caret 的广泛应用和功能的全面性,它到目前仍然是许多R用户的首选工具,尤其在快速构建机器学习模型时表现优异。

数据预处理: 包括缺失值处理、数据标准化、数据转换、创建哑变量等。数据分割: 将数据集划分为训练集、测试集、验证集等。特征选择: 选择重要的特征,提高模型性能。模型训练: 提供统一的接口训练各种机器学习模型。参数调优: 自动搜索最佳的模型参数。模型评估: 使用多种指标评估模型性能。模型比较: 比较不同模型的性能。

后面的文章就是按照上面顺序一步一步来给大家详细讲的:

preProcess 函数用于数据预处理。包括缺失值处理、特征缩放、标准化、哑变量编码、去除高度相关的特征等等。主要涉及到preProcess 函数的 method 参数。根据数据类型和特点选择合适的预处理方法: "center" 和 "scale":中心化和标准化,适用于大多数连续型数据,尤其是在使用需要计算距离的算法(如 KNN、svm)时。 "BoxCox" 和 "YeoJohnson":幂变换,用于处理偏态数据,使其更接近正态分布。YeoJohnson 适用于包含负值的数据。 "pca" 和 "ica":降维,用于处理高维数据,减少特征数量,提高模型训练速度,并可能提高模型泛化能力。 "knnImpute" 和 "bagImpute":缺失值插补,用于处理数据中的缺失值。knnImpute 使用 K 近邻算法进行插补,bagImpute 使用 bagging 方法进行插补。下面的代码就对数据进行分割,然后分别对训练集和测试集进行了"center", "scale", "pca",然后生成主成分:

train_index

运行代码后就成了下面了两个主成分,后面就直接用这两个主成分当作预测变量去训练模型即可:

createDataPartition 函数用于创建数据分割。下面代码便是一个7:3比例划分训练集和测试集的例子:

# 创建训练集和测试集set.seed(123)index

特征选择的过程在caret包中也可以轻松实现。主要包括3种特征选择方法:

第一种是递归特征消除(RFE, Recursive Feature Elimination),rfe 是一种基于模型的特征选择方法,它通过以下步骤进行:

使用所有特征训练模型。通过某种重要性指标(如变量重要性)评估每个特征对模型性能的贡献。逐步去除贡献较低的特征,并重复训练模型,直到达到预设的特征数。

RFE 是一种迭代的过程,因此适合对少量特征进行选择,不适合高维数据集。

第二种是基于过滤器的方法(Filter Methods)过滤器方法通过统计特征和目标变量之间的关系(如相关性、卡方检验、互信息等),评估特征的重要性,并过滤掉不显著的特征。

第三种是嵌入式方法(Embedded Methods):嵌入式方法直接结合机器学习算法(如随机森林、LASSO 回归等)中的变量重要性,筛选出重要的特征。

现在我有一个数据集有60个自变量,相当多了,这个时候必须筛掉一波,那么我要用RFE方法的话就可以写出如下代码:

control

输出结果如下:

可以看到结果中展示了特征选择过程中性能指标的详细表格,每个子集大小(变量数量)对应一组模型性能指标,同时最后一行输出了Top variables:显示被选中的特征名称,通常按重要性排序。这里60个预测变量选出可5个最重要的。

再看基于过滤器的方法(Filter Methods),比如过滤相关性大的变量,可以用下面代码:

findCorrelation 函数可以用于剔除高度相关的特征。# 计算特征间的相关性cor_matrix

运行后就可以知道60个预测变量中其实有32个是高度相关的,那么这32个变量我们只需要留下一个,所以这个样子筛选下来就只剩29个变量了。

我们接着看嵌入式方法。典型的就是变量重要性,caret 提供了 varImp 函数,用于提取模型中各特征的重要性。许多模型(如随机森林、线性模型)支持变量重要性评估。一个随机森林模型输出变量重要性的代码如下:

# 训练随机森林模型set.seed(123)rf_model

运行后输出如下:

可以看到最重要的20个变量都被筛出来了。同时还输出了变量重要性的图:

以上就是在caret中进行特征选择的操作示意。接着看模型训练。

模型训练:

train 函数用于训练模型。基本结构如下:

要注意的是method参数,支持

"rf":随机森林"glm":广义线性模型"svmRadial":支持向量机(径向核)"xgbTree":梯度提升树

还可通过 modelLookup 查看所有支持的模型。train 函数是 caret 包的核心,封装了数据预处理、模型训练、超参数调优和交叉验证等功能。通过调整 train 的参数,我们可以快速实现多种机器学习算法的建模和优化,适用于从简单的线性模型到复杂的非线性模型。

caret包中参数调优主要依赖于trainControl 函数,用来设置模型训练过程的控制参数,尤其是在交叉验证、重采样方法、性能评估和模型保存等方面作用重大,基本写法如下:

给大家写一个使用 trainControl结合train 进行 5 折交叉验证训练随机森林模型的例子:

# 设置训练控制参数control

运行后输出如下:

可以看到输出了不同超参mtry下的随机森林模型表现,一应俱全。

confusionMatrix 函数用于计算混淆矩阵和各种评估指标。

# 混淆矩阵confusionMatrix(predictions, test_data$Species)模型比较:

resamples 函数用于比较不同模型的性能。比如我同样的数据训练3个模型,分别是随机森林、支持向量机、和KNN,这三个模型放在一起比较的话代码如下:

# 训练多个模型rf_model

运行后即可得到三个模型的性能比较结果

可以看到还是支持向量机模型的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数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

R数据分析:净重新分类(NRI)和综合判别改善(IDI)指数的理解

R数据分析:反事实框架和因果中介的理论理解

R数据分析:广义估计方程式GEE的做法和解释

R数据分析:潜类别轨迹模型LCTM的做法,实例解析

R数据分析:潜变量与降维方法(主成分分析与因子分析)

R数据分析:如何给结构方程画路径图,tidySEM包详解

R数据分析:生存分析与有竞争事件的生存分析的做法和解释

R机器学习:朴素贝叶斯与支持向量机的原理与实现

R数据分析:混合效应模型的可视化解释,再不懂就真没办法

R数据分析:tableone包的详细使用介绍

R数据分析:如何用lavaan包做结构方程模型,实例解析

R机器学习:分类算法之K最邻进算法(KNN)的原理与实现

来源:Codewar

相关推荐