当前位置: 首页 > news >正文

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

目录

引言

核心思想

优点

应用场景

建模步骤

数据集

结果

代码实现


引言

随机森林(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');

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java之网络面试经典题(一)
  • hcip暑假第二次作业
  • Elasticsearch 更新指定字段
  • C++类和对象(一)
  • C++ 定时器触发
  • 苹果电脑可以玩魔兽世界吗 魔兽世界有mac版本么 macbook 可以玩魔兽世界吗
  • Codeforces Round 957 (Div. 3)(A~E题解)
  • Flutter【组件】标签
  • 【数据结构】初探数据结构面纱:栈和队列全面剖析
  • uniapp中使用uni-ui组件库
  • NLP任务中三个概念标记、样本映射和偏移映射三个概念的浅析
  • 【MIT 6.5840/6.824】Lab1 MapReduce
  • 【记录】CSS|Tailwind 的主题定义的颜色的使用方法(--color啥的)
  • 昇思25天学习打卡营第17天|应用实践之SSD目标检测
  • GPT生成文本的实际案例 - Transformer教程
  • 深入了解以太坊
  • 《剑指offer》分解让复杂问题更简单
  • 3.7、@ResponseBody 和 @RestController
  • Date型的使用
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Idea+maven+scala构建包并在spark on yarn 运行
  • javascript 哈希表
  • JavaScript 基本功--面试宝典
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • node和express搭建代理服务器(源码)
  • PAT A1050
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-redux的原理以及使用
  • Redis的resp协议
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 排序(1):冒泡排序
  • 前端之React实战:创建跨平台的项目架构
  • 小程序测试方案初探
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 1.Ext JS 建立web开发工程
  • k8s使用glusterfs实现动态持久化存储
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • # 职场生活之道:善于团结
  • ## 1.3.Git命令
  • #{} 和 ${}区别
  • (175)FPGA门控时钟技术
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm码农论坛 毕业设计 231126
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)模仿学习-Action数据的模仿
  • (四)软件性能测试
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)