【matlab】随机森林客户流失预测

news2024/10/8 13:08:26

目录

引言

核心思想

优点

应用场景

建模步骤

数据集

结果

代码实现


引言

随机森林(Random Forest)是一种集成学习算法,它通过构建多个决策树并将它们的预测结果进行汇总来提高整体模型的预测准确率、稳定性和泛化能力。随机森林属于“bagging”(Bootstrap Aggregating)方法的一种实现,它结合了决策树的强大分类能力和集成学习的优势。

核心思想

  1. 构建多棵决策树:随机森林通过自助抽样法(bootstrap sampling)从原始数据集中随机抽取多个样本集,每个样本集都是原始数据集的一个有放回抽样版本。然后,基于每个样本集独立地训练一棵决策树。由于是有放回抽样,原始数据集中的某些样本可能会在多个样本集中出现,而有些样本则可能一次都不出现。

  2. 随机选择特征:在构建每棵决策树的过程中,不是使用数据集中的所有特征来寻找最佳划分,而是随机选择一部分特征(通常是总特征数的一个子集)来进行节点划分。这种特征选择的随机性进一步增加了模型的多样性,有助于减少过拟合并提高模型的泛化能力。

  3. 集成预测:对于分类问题,随机森林中的每棵决策树都会给出一个预测结果(即类别的投票)。最终,随机森林的预测结果是所有决策树预测结果的众数(即出现次数最多的类别)。对于回归问题,则取所有决策树预测结果的平均值作为最终预测。

优点

  • 准确率高:由于集成了多棵决策树的预测结果,随机森林通常比单棵决策树具有更高的预测准确率。
  • 鲁棒性强:随机森林对噪声和异常值具有较好的容忍度,不易受单个样本或特征的影响。
  • 易于使用:随机森林算法实现简单,参数较少,容易在各种数据集上应用。
  • 能够评估特征重要性:随机森林在训练过程中可以评估每个特征对预测结果的重要性,有助于特征选择和解释模型。

应用场景

随机森林广泛应用于各种分类和回归任务中,包括但不限于:

  • 客户流失预测
  • 欺诈检测
  • 图像识别
  • 文本分类
  • 医学诊断
  • 股票价格预测

建模步骤

  1. 数据预处理
    • 清洗数据:处理缺失值、异常值和重复项。
    • 转换数据类型:如将TotalCharges从字符串转换为浮点数。
    • 编码分类变量:使用独热编码(One-Hot Encoding)或标签编码(Label Encoding)处理分类变量(如genderInternetServiceContract等)。
  2. 特征选择
    • 识别与流失预测相关的特征。
    • 可能需要进行特征工程,如创建新特征(如服务年限的类别、费用等级等)。
  3. 划分数据集
    • 将数据集划分为训练集和测试集(或进一步划分为训练集、验证集和测试集)。
  4. 选择模型
    • 根据问题的性质(二分类问题),可以选择逻辑回归、决策树、随机森林、梯度提升树(如XGBoost、LightGBM)、神经网络等模型。
  5. 训练模型
    • 使用训练集数据训练选定的模型。
  6. 评估模型
    • 使用测试集评估模型的性能,常用指标包括准确率、召回率、F1分数、AUC-ROC等。

数据集

数据集如下图所示:

  • customerID: 客户的唯一标识符
  • gender: 性别
  • SeniorCitizen: 是否为老年人
  • Partner: 是否有伴侣
  • Dependents: 是否有受抚养人
  • tenure: 客户服务年限(通常以月为单位)
  • PhoneService: 是否订阅了电话服务
  • MultipleLines: 是否有多条电话线
  • InternetService: 互联网服务提供商类型
  • OnlineSecurity: 是否订阅了在线安全服务
  • OnlineBackup: 是否订阅了在线备份服务
  • DeviceProtection: 是否订阅了设备保护服务
  • TechSupport: 是否订阅了技术支持服务
  • StreamingTV: 是否订阅了流媒体电视服务
  • StreamingMovies: 是否订阅了流媒体电影服务
  • Contract: 合同类型(如月付、年付等)
  • PaperlessBilling: 是否采用无纸化账单
  • PaymentMethod: 支付方式
  • MonthlyCharges: 每月费用
  • TotalCharges: 总费用
  • Churn: 是否流失

结果

代码实现

%  数据加载  
data = readtable('WA_Fn-UseC_-Telco-Customer-Churn.csv');  
  
%  转换二分类特征为数值型  
data.Churn = strcmp(data.Churn, 'Yes'); % 'Yes'为1,'No'为0  
data.gender = strcmp(data.gender, 'Male');   
data.Partner = strcmp(data.Partner, 'Yes');   
data.Dependents = strcmp(data.Dependents, 'Yes');  
data.PhoneService = strcmp(data.PhoneService, 'Yes'); 
data.PaperlessBilling = strcmp(data.PaperlessBilling, 'Yes');
 
% 填充缺失值
data.TotalCharges(isnan(data.TotalCharges)) = 0;  

% % 独热编码列  
% categoricalVars = {'MultipleLines', 'OnlineSecurity','OnlineBackup','DeviceProtection','TechSupport','StreamingTV','StreamingMovies',...  
%                    'InternetService', 'Contract', 'PaymentMethod'};  
  
% 提取特征列  
allFeatures = data{:, {'SeniorCitizen', 'tenure', 'MonthlyCharges', 'TotalCharges', 'gender', 'Partner', 'Dependents', 'PhoneService', 'PaperlessBilling'}};  
  
% 提取目标变量  
target = data.Churn;   
target = table(target, 'VariableNames', {'Churn'});  
  
% 划分数据集为训练集和测试集  
cv = cvpartition(height(allFeatures), 'HoldOut', 0.3); % 70%训练,30%测试  
idx = cv.test;  
XTrain = allFeatures(~idx, :);  
YTrain = target(~idx, :);  
XTest = allFeatures(idx, :);  
YTest = target(idx, :);  

% 训练随机森林模型回归预测
rfModel = TreeBagger(50, XTrain, YTrain.Churn, 'Method', 'classification');

% 预测
YTestPredicted = predict(rfModel, XTest);

% 评估模型
YTestPredicted = str2double(YTestPredicted);
accuracyRF = sum(YTestPredicted == YTest.Churn) / numel(YTest.Churn);
fprintf('Random Forest Accuracy: %.2f%%\n', accuracyRF * 100);


% 获取概率预测  
[~, scores] = predict(rfModel, XTest); 
% 绘制ROC曲线  
[X,Y,T,AUC] = perfcurve(YTest.Churn, scores(:,2), 1); % 假设scores(:,2)是正类的预测概率  
figure;  
plot(X,Y);  
xlabel('False positive rate'); ylabel('True positive rate');  
title(['ROC Curve, AUC = ', num2str(AUC)]);  
grid on;

% 转换预测结果为逻辑值
YTestPredicted_logical = logical(YTestPredicted);

% 计算混淆矩阵
confMat = confusionmat(YTest.Churn, YTestPredicted_logical);

% 显示混淆矩阵
figure;
confusionchart(confMat, {'Not Churn', 'Churn'});
title('Confusion Matrix - Random Forest');

% 预测图
figure;  
gscatter(XTest(:,1), XTest(:,2), YTestPredicted); 
xlabel('Feature 1');  
ylabel('Feature 2');  
title('Random Forest Predicted Classes');  
legend('Class 0', 'Class 1', 'Location', 'best');

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7安装部署git和gitlab

安装Git 在Linux系统中是需要编译源码的,首先下载所需要的依赖: yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker方法一 下载: wget https://mirrors.edge.kernel.org/pub/s…

软考高项论文备考论

软考高项论文备考是一个系统而全面的过程,需要考生从多个方面进行准备。以下是一份详细的备考策略,供考生参考: 一、明确考试要求 首先,考生需要详细了解软考高项论文的考试要求,包括字数限制、结构要求、评分标准等…

Monaco Editor 中文文档整理(超详细、超全面、带demo示例)

地址 Monaco Editor 中文官网,欢迎大家体验。 网站采用 github pages 部署,可能因网络等原因,响应较慢,请耐心等待~ 也欢迎大家对译文内容进行纠正,如果有误,可本文留言、提 ISSUE、亦或直接在内容页的在 …

苹果手机信号为什么比安卓手机信号差,原因你知道吗?

不知道你有没有过这种体会,在使用苹果手机时,信号要比安卓的信号差的一些,这到底是怎么回事呢?接下来,小编从多个角度深入分析下这一问题,给出相应的解决方案,希望能帮助到大家哈! ​…

Mac视频录制神器推荐,让你的创作更高效

“mac可以视频录制吗?最近我开始对录制和编辑视频产生了浓厚的兴趣。然而,由于我主要使用的是mac电脑,我发现关于在mac上录制视频的教程和资源相对较少。大家知道如何在mac上录制视频吗?如果有的话,请告诉我具体方法&a…

[WMCTF2020]easy_re

CTF逆向-[WMCTF2020]easy_re-WP_虚机-perl加载器截取_逆向分析ctf实战 百度网盘-CSDN博客 参考博客 收获 perl,反正这个东西流程和upx壳很像,(高级的SMC?) 它会加载一个脚本,来解密源代码,期间call 一个 script 题解: 运行为第一步! 输入类型 输入类型一般就是加密,(期间…

电商之订单价税拆分实现方案

文章目录 案例数据实现思路1、计算出平均金额2、计算每个商品的金额 实现方案1、订单 order 实体2、订单明细 orderDetail 实体3、实现类4、测试启动5、实现结果 在做电商项目的时候,会遇到要对订单明细进行纳税金额拆分,即将税额拆分到每个商品上&#…

最优化(10):牛顿类、拟牛顿类算法

4.4 牛顿类算法——介绍了经典牛顿法及其收敛性,并介绍了修正牛顿法和非精确牛顿法; 4.5 拟牛顿类算法——引入割线方程,介绍拟牛顿算法以及拟牛顿矩阵更新方式,然后给出了拟牛顿法的全局收敛性,最后介绍了有限内存BFG…

【漏洞复现】宏景HCM-LoadOtherTreeServlet SQL注入

声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 宏景HCM人力资源信息管理系统是一个全面的人力资源管理软件,它覆盖了人力资源管理的各个模块…

龙蜥Anolis OS基于开源项目制作openssh 9.8p1 rpm包 —— 筑梦之路

环境信息 制作过程和centos 7几乎没有区别,此处就不再赘述。 CentOS 7基于开源项目制作openssh9.8p1 rpm二进制包修复安全漏洞CVE-2024-6387 —— 筑梦之路_cve-2024-6387修复-CSDN博客 制作成果展示 tree RPMS/ RPMS/ └── x86_64├── openssh-9.8p1-1.an7.…

【Python 基础】第一个程序

第一个程序 虽然交互式环境对于一次运行一条 Python 指令很好,但要编写完整的 Python程序,就需要在文件编辑器中输入指令。“文件编辑器”类似于 Notepad 或 TextMate这样的文本编辑器,它有一些针对输入源代码的特殊功能。要在 IDLE 中打开文…

常用知识碎片 Vue3 ref和reactive (内含其他常用知识)

目录 ref和reactive ref reactive 总结: setup语法糖 语法糖是啥? Vue3 setup语法糖 Vue3 不使用setup语法糖示例: Vue3 使用setup语法糖示例: ref和eative主要区别 ref和reactive 在 Vue 3 中,ref 和 reac…

linux radix-tree 基数树实现详解

radix tree,又称做基数树,是一种适合于构建key(index)与value(item)相关联的数据结构。内核中使用非常广泛。本文主要聚焦linux内核基数树的代码实现,大量注释过的代码。 radix-tree组织结构如下: 1、数据结构 /** The bottom two bits of the slot de…

SQL 针对上面的salaries表emp_no字段创建索引idx_emp_no

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 针对salaries…

LabVIEW滤波器性能研究

为了研究滤波器的滤波性能,采用LabVIEW设计了一套滤波器性能研究系统。该系统通过LabVIEW中的波形生成函数,输出幅值及频率可调的正弦波和白噪声两种信号,并将白噪声与正弦波叠加,再通过滤波器输出纯净的正弦波信号。系统通过FFT&…

RFID技术革新养猪业,构建智能化养殖场

RFID技术作为无线射频识别技术的一种,凭借着非接触、高效识别的特性,在养殖业行业中得到了广泛的应用,为构建智能化、高效化的养殖场提供了强大的技术支持,给传统养殖业带来了一场前所未有的技术变革。以下是RFID技术在养猪行业不…

【Oracle】实验三 Oracle数据库的创建和管理

【实验目的】 掌握Oracle数据库的创建方法使用DBCA创建数据库在数据库中装入SCOTT用户及其表 【实验内容】 使用DBCA创建数据库,名为MYDB,找到其初始化文件(文本型和服务器型文件都要找到),查看各类默认位置并记录下来(包括物理文件所在目…

SpringBoot源码阅读(8)——系统环境创建

SpringBoot创建系统应用上下文是在run方法,第301行。 ConfigurableEnvironment environment prepareEnvironment(listeners, bootstrapContext, applicationArguments);private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listen…

windows远程桌面到 Linux系统(Ubuntu:22.04)—— 安装xrdp软件

1、在Linux系统上安装xrdp软件 sudo apt update sudo apt install xrdp2、安装完成后,需要开启xrdp服务 sudo systemctl start xrdp sudo systemctl enable xrdp打印返回 Synchronizing state of xrdp.service with SysV service script with /lib/systemd/system…

【VSCode】设置背景图片

1.下载background插件:拓展程序→background→install安装→设置: 2.点击在 settings.json 中编辑: 3.将settings.json文件中所有代码注释,添加以下代码: {// 是否开启背景图显示"background.enabled": t…