数据分享|R语言决策树和随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化|附代码数据

news/2024/11/17 14:28:45/文章来源:https://www.cnblogs.com/tecdat/p/18304225

原文链接:http://tecdat.cn/?p=26868

最近我们被客户要求撰写关于电信公司用户流失的研究报告,包括一些图形和统计输出。

在本教程中,我们将学习覆盖决策树和随机森林。这些是可用于分类或回归的监督学习算法

下面的代码将加载本教程所需的包和数据集。

 
 
library(tidyverse)# 电信客户流失率数据
churn <- read_rds(chuata.rds))

数据

花点时间探索下面的这个数据集  查看文末了解数据获取方式  。

此数据框中的一行代表一家电信公司的客户。每个客户都从该公司购买了电话和互联网服务。

此数据中的因变量变量 canceled 指示客户是否终止了他们的服务。

图片

决策树

为了演示拟合决策树,我们将使用 churn数据集并使用所有可用的预测变量进行预测。

数据拆分

我们将数据分成训练集和测试集。训练数据将进一步分为 5 折进行超参数调优。

 
 
 # 记住一定要设置你的随机数种子。chuit <- iniplit(cdf)chining <- chulit %>% trang()chuest <- chuplit %>% tesg()#在训练数据集上创建交叉验证的
##这些将被用于调整模型的超参数chds <- vfcv(chung, v = 5)

特征工程

我们将在训练数据上进行以下转换。

  • 消除数值预测变量的偏度
  • 标准化所有数字预测变量
  • 为所有名义预测变量创建虚拟变量
 
 
chu_rep <- recipe(cace_srce ~ ., data = chutann) %>% 
                       stepYeonon(al_nmeric(), -al_utcoms()) %>% 
                       ste_nomaze(all_umic(), -al_oucoes()) %>% 
                       ste_dumy(all_inal(), -al_otcomes())

让我们检查一下特征工程步骤是否正确执行。

模型规格

接下来,我们指定具有以下超参数的决策树分类器:

  • 成本复杂度参数(又名 Cp 或 λ)
  • 树的最大深度
  • 节点中进一步拆分所需的最小数据点数。

工作流程

接下来,我们将模型组合到一个工作流中,以轻松管理模型构建过程。

 
 
treow <- workflow()

超参数调优

我们将对决策树超参数进行网格搜索,并在交叉验证期间根据 ROC 曲线下的面积选择性能最佳的模型。

请参见下面的示例,我们在其中创建 tree_grid 对象。

 
 
## 创建一个超参数值的网格来测试
tr_gid <- girular(cotolty(),
                          teedeth(),
                          mnn(), 
                          lvs = 2)

调整超参数 tune_grid()

为了从我们的调整网格中找到超参数的最佳组合,我们将使用该 tune_grid() 函数。

在我们的 KNN 示例中,此函数将模型对象或工作流作为第一个参数,将交叉验证折叠作为第二个参数,将调整网格数据框作为第三个参数。

 
 
## 调整决策树工作流程
set.seed(314)tre_tig <- trewolow %>%
               tue_rid(rsampes = chrnols,
                         grid = reegid)

查看我们的超参数调整的结果。

从下面的结果中,我们看到对于我们网格中的每个超参数组合。

下面 mean 结果中的列表示获得的性能指标的平均值。

我们可以使用该 select_best() 模型从我们的调优结果中选择具有最佳整体性能的模型。在下面的代码中,我们指定根据 roc_auc 指标选择性能最佳的模型。

我们看到成本复杂度为 1-10、树深度为 15、最小 n 为 40 的模型产生了最佳模型。

 
 
## 根据roc_auc选择最佳模型
besree <- te_uin %>%

完成工作流程

超参数调整的最后一步是 将我们的最佳模型添加到我们的工作流对象中。

可视化结果

为了可视化我们的决策树模型,我们需要使用该 fit() 函数手动训练我们的工作流对象。

此步骤是可选的,因为并非所有应用程序都需要可视化模型。但是,如果目标是了解 模型预测某些值的原因 ,那么建议这样做。

下一节将展示如何拟合模型以 自动获得测试集的性能。

拟合模型

接下来,我们将工作流程与训练数据相匹配。这是通过将我们的工作流对象传递给 fit() 函数来完成的。

 
 
               fit(data = chning)

探索我们的训练模型变量的重要性

一旦我们在训练数据上训练了我们的模型,我们就可以使用该 vip 函数研究变量的重要性。

 
 
teeit <- tree__it %>% 
            pull_orfowit()

变量重要性

接下来我们传递 tree_fit 给 vip() 函数。

我们从下面的结果中看到最重要的预测因子。

 
 
vip(teeit)

图片


点击标题查阅往期内容

图片

PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像

图片

左右滑动查看更多

图片

01

图片

02

图片

03

图片

04

图片

决策树图

我们可以可视化训练好的决策树。

这种可视化是一种工具,用于传达经过训练的决策树的预测规则。

很多时候,决策树图会很大并且难以阅读。有专门的软件包 R 用于放大决策树图的区域。

图片

训练和评估 

接下来,我们将最终模型工作流程拟合到训练数据并评估测试数据的性能。

该 函数将使我们的工作流程适合训练数据,并根据我们的 chuplit 对象定义的测试数据生成预测。

 
 
tre_latit <- fil_tewklow %>% 
                 last_fit(chnpit)

我们可以在测试数据上查看我们的性能指标

 
 
tre_lft %>% collect_metrics()

ROC曲线

我们可以绘制 ROC 曲线来可视化我们调整的决策树的测试集性能

 
 
treatft %>% collect_predictions() %>%

图片

混淆矩阵

我们看到我们的模型在我们的测试数据集上产生了 80 个假阴性和 57 个假阳性。

 
 
tre_pcis <- tre_s_t %>% collect_predictions()

图片

随机森林

在本节中,我们将为 chudf 数据拟合一个随机森林模型。随机森林采用决策树并在预测准确性方面构建更强大的模型。支持该算法的主要机制是对训练数据进行重复采样(替换)以生成一系列决策树模型。然后对这些模型进行平均以获得预测空间中给定值的单个预测。

随机森林模型选择预测变量的随机子集,用于在树构建过程中分割预测空间。算法的每次迭代都会这样做,通常是 100 到 2,000 次。

数据特征工程

我们已经将我们的数据分成训练、测试和交叉验证集,并训练了我们的特征工程,  chucipe. 这些可以在我们的随机森林工作流程中重复使用。

模型

接下来,我们指定具有以下超参数的随机森林分类器:

  • mtry:创建树模型时在每次拆分时随机抽样的预测变量的数量
  • trees:要拟合并最终平均的决策树的数量
  • min_n: 节点进一步分裂所需的最小数据点数

要指定具有 的随机森林模型 ,我们需要该 ranorest() 函数。

工作流程

接下来,我们将我们的模型和配方组合到一个工作流中,以轻松管理模型构建过程。

 
 
f_orkflw <- workflow() %>%

超参数调优

随机网格搜索

我们将对随机森林超参数进行网格搜索,并在交叉验证期间根据 ROC 曲线下的面积选择性能最佳的模型。

在上一节中,我们曾经 gridlar() 创建一个超参数值网格。这创建了推荐默认值的常规网格。

另一种进行超参数调整的方法是创建一个 随机 的值网格。许多研究表明,这种方法比常规网格方法做得更好。

在下面的代码中,我们将范围设置为 4 到 12。

 
 
## 创建一个超参数值的网格来测试set.sd(314)rf_gd <- grid_random(mry() %>% range_set

图片

调整超参

为了从我们的调整网格中找到超参数的最佳组合,我们将使用该 tugid() 函数。

 
 
## 调整随机森林工作流程
set.seed(314)rftin <- rfwoflow %>% 
             tune_grid(resamples = cu_olds,
                       grid = r_id)

查看我们的超参数调整的结果。

我们可以使用模型从我们的调优结果中选择具有最佳整体性能的模型。在下面的代码中,我们指定根据 rocauc 指标选择性能最佳的模型。

 
 
## 根据roc_auc选择最佳模型
berf <- rftunng %>% 
           select_best

完成工作流程

超参数调整的最后一步是 将我们的最佳模型添加到我们的工作流对象中。

 
 
fina_rkflow <- rfow %>% 
                     finaflow(betrf)

变量重要性

为了可视化随机森林模型的可变重要性分数。

拟合模型

接下来,我们将工作流程与训练数据相匹配。这是通过将我们的工作流对象传递给 fit() 函数来完成的。

 
 
rf_it <- fnalrfrlow %>% 
             fit(data = crnranng)

一旦我们在训练数据上训练了我们的模型,我们就可以研究变量的重要性。

第一步是从我们的工作流拟合中提取训练好的模型。

 
 
rf <- ft %>% 
          pll_orfow_fit()

变量重要性

从我们的模型返回一个 ggplot 具有可变重要性分数的对象。重要性分数基于通过超参数随机选择的具有最大预测能力的预测变量。

图片

训练和评估

接下来,我们将最终模型工作流程拟合到训练数据并评估测试数据的性能。

使我们的工作流程拟合训练数据,并根据测试数据生成预测。

我们可以在测试数据上查看我们的性能指标

 
 
rf_tfit %>% cole_trcs()

ROC曲线

我们可以绘制 ROC 曲线来可视化随机森林模型的测试集性能。

 
 
rflafit %>% collepedions() %>% 
                roc_ve(trth  = cncele_srice, estimate = .rd_es) %>% 
                autplot()

图片

混淆矩阵

我们看到我们的模型在我们的测试数据集上产生了 61 个假阴性和 48 个假阳性,优于我们的决策树模型。

 
 
conf_mat(predis, truth = cncervice, estimate = .prd_las)

图片

数据获取

在下面公众号后台回复“流失数据”,可获取完整数据。

图片

点击文末 “阅读原文”

获取全文完整资料。

本文选自《R语言决策树和随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化》。

点击标题查阅往期内容

从决策树到随机森林:R语言信用卡违约分析信贷数据实例
PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化
R语言基于树的方法:决策树,随机森林,Bagging,增强树
R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测
spss modeler用决策树神经网络预测ST的股票
R语言中使用线性模型、回归决策树自动组合特征因子水平
R语言中自编基尼系数的CART回归决策树的实现
R语言用rle,svm和rpart决策树进行时间序列预测
python在Scikit-learn中用决策树和随机森林预测NBA获胜者
python中使用scikit-learn和pandas决策树进行iris鸢尾花数据分类建模和交叉验证
R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
R语言ISLR工资数据进行多项式回归和样条回归分析
R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
R语言用泊松Poisson回归、GAM样条曲线模型预测骑自行车者的数量
R语言分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测R语言样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化
如何用R语言在机器学习中建立集成模型?
R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测在python 深度学习Keras中计算神经网络集成模型R语言ARIMA集成模型预测时间序列分析R语言基于Bagging分类的逻辑回归(Logistic Regression)、决策树、森林分析心脏病患者
R语言基于树的方法:决策树,随机森林,Bagging,增强树
R语言基于Bootstrap的线性回归预测置信区间估计方法
R语言使用bootstrap和增量法计算广义线性模型(GLM)预测置信区间
R语言样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析
R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化
Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线
matlab使用分位数随机森林(QRF)回归树检测异常值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目中使用axios(自用)

————流程参考在vscode的集成终端中输入npm install axios回车安装重启项目(重新运行) 在script中导入axiosimport axios from axios; 在default中的data同级mounted()中按如下获取数据mounted(){// 发送异步请求,获取数据// 输入thenc可用自动生成回调axios.get(数据地…

onnxruntime无法使用GPU加速 加速失败 解决方法【非常详细】

CreateExecutionProviderInstance CUDA_PATH is set but CUDA wasnt able to be loaded. Please install the correct version of CUDA andcuDNN as mentioned in the GPU requirements page onnxruntime GPU加速onnx 无法使用GPU加速 加速失败 解决方法【非常详细】应该是自目…

jsAPIS-DomEvent

APIs 申明变量const优先 对于变量申明,常见的申明方式包括:var、let、conts。由于var老旧,我们避免使用和var进行变量声明。 那么在定义变量时如何判断使用let还是const? 对于常量(后续不会改变)变量,使用const进行申明。对于会发生变化的变量,使用let进行声明。常见情…

泰山派学习14--pinctr、gpio子系统控制设备树LED

1、在泰山派设备树的/根节点上添加zbl_led子节点(路径:Z:\sdk\linux\kernel\arch\arm64\boot\dts\rockchip)打开tspi-rk3566-user-v10-linux.dts设备树源文件在根目录下添加gpioled子节点2、在SDK上编译kernel(./build.sh kernel)执行内核编译:./build.sh kernel内核编译…

JavaScript全解析——本地存储✔(localStorage~sessionStorage~cookie)

●就是浏览器给我们提供的可以让我们在浏览器上保存一些数据●常用的本地存储(localStorage~sessionStorage~cookie)1-localStorage => 特点:-> 长期存储,除非手动删除否则会一直保存在浏览器中 清除缓存或者卸载浏览器也就没有了-> 可以跨页面通讯, 也就是说在一个…

三种交换方式的比较

一、互联网的核心部分 网络核心部分是互联网中最复杂的部分。 网络中的核心部分要向周围网络边缘的大量主机提供连通性,使边缘部分任何一个主机都能够向其他主机通信。 在网络核心部分起特殊作用的是路由器。 路由器是实现分组交换的关键构件,其任务是转发收到的分组,这是网…

gateway 使用细节

spring:cloud:gateway:routes:- id: test_my_provider # 自定义,全局唯一即可uri: http://localhost:8081 # 实际调用的地址predicates:- Path=/test/** # 请求匹配规则- id: test_my_consumeruri: http://localhost:8082predicates:- Path=/feign/**上一篇文章 gateway 快速入…

长链剖分笔记

与轻重链剖分相似. dfs1:高度 \(h\)、\(son\);dfs2:\(top\). 性质 1:到根最多 \(O(\sqrt n)\) 条轻边. (证明:长链长度最坏情况:1, 2, 3...) 性质 2:\(x\) 的 \(k\) 级祖先 \(y\) 所在的长链长度 \(\ge k\).(证明:若非,则 \(y-x\) 是一条更长的链,矛盾.) 树上 \(…

【漏洞分析】DoughFina 攻击事件分析:不做任何参数检查的去杠杆合约

背景介绍 2024 年 7 月 12 日,DoughFina 协议遭受了黑客攻击,造成本次攻击的主要原因是 ConnectorDeleverageParaswap 合约没有对输入参数进行检查,且该合约为 DSA 合约的 owner。攻击者可以构造恶意参数窃取 DSA 合约的资金。 攻击交易 https://app.blocksec.com/explorer/…

SpringCloud启动报错Did you forget to include spring-cloud-starter-loadbalancer?

当我在gateway项目中添加了feign依赖时,报错:   原因:因为在springcloudFeign在Hoxton.M2 RELEASED版本之后就不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错解决办法:引入依赖即可1 <dependency> 2 …

圆方树

一些概念 割点:无向图中,若删除点x及其连边,连通块变多,那么x为割点。 点双连通:若点对x和y,删除任意非x和非y节点后,x和y仍然联通,称x和y点双连通。 点双联通子图:无向图中的一个子图G,G中任意两点都是点双连通的,那么G为原图的一个点双连通子图。 点双联通分量:无…

链表引用——约瑟夫问题

约瑟夫问题Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环…