R语言:tidymodels机器学习应用流程

1: R语言tidymodels系列包简介
R之所以功能强大,是因为它具有功能丰富的扩展包。例如基于 ggplot2包 及其拓展包的数据可视化。基于 tidyverse系列包 进行数据整理、清洗与探索。基于 tidymodels系列包 进行数据分析、统计分析、机器学习等算法的应用等。

tidyverse系列与tidymodels系列包
2: 基于tidymodels的数据预处理过程
基于 tidymodels 的数据预处理过程,可以参考下图,尤其是基于 recipe() 函数的数据预处理操作有很多种函数可以调用,包括数据缺失值插补、离散化、虚拟变量和编码、归一化、多元变换、过滤器等功能。

3: tidymodels工作流程示意图
基于 tidymodels 在分类、回归等问题上的工作流程示意图可以参考下图。

该流程是基于 tidymodels 的通用流程,针对回归问题以及分类问题都可使用这样的流程进行数据建模分析。
3: 实战案例应用
下面使用泰坦尼克号数据集,进行随机森林分类算法的实战应用。使用的数据集是已经过数据清洗的数据集,下面的程序是导入会使用到的R包以及数据集。
library(tidymodels);library(tidyverse);library(rpart.plot)
library(vip);library(embed)
## 数据导入
Titanic <- read_csv("data/chap05/Titanic_train_clear.csv")
## 相关变量转化为因子变量
Titanic <- Titanic%>%mutate_at(c("Survived","Pclass","Name","Sex",
"Parch","Embarked"),factor)
head(Titanic)
## # A tibble: 6 × 11
## Survived Pclass Name Sex Age SibSp Parch Fare Embarked FamilySize
## <fct> <fct> <fct> <fct> <dbl> <dbl> <fct> <dbl> <fct> <dbl>
## 1 0 3 2 1 22 1 0 7.25 2 2
## 2 1 1 3 0 38 1 0 71.3 0 2
## 3 1 3 1 0 26 0 0 7.92 2 1
## 4 1 1 3 0 35 1 0 53.1 2 2
## 5 0 3 2 1 35 0 0 8.05 2 1
## 6 0 3 2 1 22.7 0 0 8.46 1 1
## # … with 1 more variable: Age_Pclass <dbl>
在导入的数据集中,一个有11个特征,大部分是因子变量,其中待预测的变量为Survived。导入数据后在下面的程序中通过5个步骤对随机森林模型进行参数搜索,寻找最合适的建模参数,这些步骤为:
(1) 将数据集随机切分为训练集和测试集,其中75%的数据用于训练,剩余的用于测试;
(2) 为数据集添加特征预处理过程,定义模型的形式,与使用的训练数据;
(3) 定义一个随机森林分类模型,需要进行搜索的参数有:节点中用于二叉树的变量个数(参数mtry = tune())、树的数量(参数trees = tune());
(4) 定义工作流,并且为工作流添加数据预处理过程与分类模型;
(5) 通过crossing()函数生成两个待搜索参数的网格数据,并对工作流进行参数网格搜索;最后可视化出参数搜索的结果。
使用的程序如下所示:
## 1:将数据切分为训练数据和测试数据
set.seed(222)
data_split <- initial_split(Titanic, prop = 3/4)
train_data <- data_split%>%training()
test_data <- data_split%>%testing()
## 2:添加数据特征处理过程, 定义模型的形式
Titanic_rec <- recipe(Survived ~ ., data = train_data)
## 3: 定义一个随机森林分类模型,并进行参数搜索
## 需要搜索的参数是树的深度和树的数量
rf_model <- rand_forest(mtry = tune(),trees = tune()) %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
## 4:定义模型的工作流程
rf_workflow <- workflow()%>%add_model(rf_model)%>%
add_recipe(Titanic_rec) # 添加数据预处理过程
## 5:进行参数搜索
set.seed(123)
mtry <- 1:5
trees <- c(50,100,200,300,400,500,800,1000)
rf_grid <- crossing(mtry = mtry,trees = trees)
## 进行搜索
rf_tuning = tune_grid(
rf_workflow,resamples = vfold_cv(train_data, v = 5), grid = rf_grid)
## 查看参数搜索的结果
collect_metrics(rf_tuning) %>% mutate(mtry = factor(mtry)) %>%
ggplot(aes(trees, mean, color = mtry,shape = mtry)) +
geom_line() +geom_point(size = 2) +
facet_wrap(~ .metric, scales = "free", nrow = 2) +
scale_x_continuous(breaks = trees,labels = trees) +
scale_shape_manual(values = c(15,16,17,23,24))+
scale_color_viridis_d(option = "plasma", begin = .9, end = 0)+
ggtitle("随机森林参数搜索")
运行上面的程序后可获得如下图所示图像,从结果中可知:当树的数量为200,节点中用于二叉树的变量个数为5时,能够获得精度较高的随机森林分类器。

下面的程序则是通过select_best()函数,找到最优的参数组合,并使用finalize_workflow()函数定义最优情况下的工作流,使用last_fit()函数进行最终的模型训练,获取在测试数据集上的预测精度,从输出的结果中可知,在测试集上的预测精度为0.852。
## 找到精度最高时使用的参数
best_tree <- rf_tuning %>% select_best("accuracy")
## 定义最终的模型流程
final_rf_workflow <- rf_workflow%>%finalize_workflow(best_tree)
## 6: 在训练数据训练最终的模型,并查看在测试集上的预测效果
rf_fit <- final_rf_workflow%>%last_fit(split = data_split)
rf_metrics <- rf_fit%>%collect_metrics()
rf_metrics
## .metric .estimator .estimate .config
## 1 accuracy binary 0.852 Preprocessor1_Model1
## 2 roc_auc binary 0.892 Preprocessor1_Model1
参考书籍:《R语言数据分析:基础、算法与实战》 作者:孙玉林 编著 出版社:化学工业出版社

书籍封面
学习交流群
《R语言数据分析:基础、算法与实战》在编写时使用相关资源的最新版本,欢迎加入QQ群一起交流,QQ群号:689669836。
欢迎关注我们的微信公众号获取更多内容

| 今天的分享就到这里了,敬请期待下一篇! |
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)