项目介绍 基于java+vue的银行客户流失预警系统设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
基于java+vue的银行客户流失预警系统设计与实现的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
银行客户流失预警系统的建设背景,源于金融行业竞争格局持续加剧、客户迁移成本显著降低以及数字化服务体验快速升级等多重因素共同作用。传统银行长期依赖网点覆盖、理财收益、授信额度与服务关系维系客户,但在移动互联网、互联网金融、第三方支付平台与智能投顾服务不断成熟的环境中,客户的选择空间大幅扩大,单一银行很难再凭借惯性优势留住用户。尤其在零售金融、信用卡、消费贷款和财富管理等业务场景中,客户流失不再是偶发事件,而是具有明显可观测特征的经营风险。客户一旦出现流失,通常意味着账户活跃度下降、产品使用频率减少、资金沉淀减少、交叉销售机会消失,并且会对银行的长期利润率、获客成本和品牌黏性造成持续影响。
从业务管理角度看,客户流失具有明显的前置预警价值。大量实践表明,客户在正式流失前往往会经历一系列行为变化,例如交易频率下降、账户余额波动异常、APP登录减少、客服电话投诉增加、产品持有数减少、授信使用率下降、活动参与率降低等。这些变化如果能够被及时识别,银行便有机会通过差异化营销、专属关怀、额度调整、手续费优惠、产品推荐或人工回访等方式进行挽留。传统依靠人工经验筛查的方式,通常存在样本覆盖不全、响应滞后、规则单一、误判较多等问题,难以适应海量客户与高频数据更新场景。因此,构建一个基于Java和Vue的银行客户流失预警系统,已经不只是技术升级问题,更是银行精细化运营、风险管理与客户生命周期管理的重要支撑。
从技术演进角度看,银行业务系统具备数据维度复杂、实时性要求高、权限控制严格、审计追踪要求强等特点。客户流失预警系统需要同时处理结构化业务数据、行为日志数据和标签化模型输出结果,还要兼顾高可用、可扩展、可维护和安全合规等要求。Java在企业级开发领域具有稳定成熟、生态完备、并发处理能力较强等优势,适合承载后端业务服务、模型管理服务与接口控制层。Vue则在前端交互、组件复用、页面响应、数据驱动视图等方面表现突出,适合构建可视化预警看板、客户画像界面、模型分析页面和营销决策页面。二者结合能够形成前后端分离、职责清晰、开发效率高且易于迭代的系统架构,为银行客户流失预警业务提供可靠的信息化基础。
从管理价值角度看,该系统不仅服务于客户流失识别,还能辅助银行建立面向客户生命周期的运营闭环。系统可将客户行为数据、账户特征数据、交易特征数据与历史流失标签进行综合分析,生成风险评分、流失等级和预警策略,为客服部门、营销部门、运营部门和管理层提供统一的数据依据。通过对高风险客户进行分层管理,银行能够将有限的人力资源集中投入到最值得挽留的客户群体中,显著提升营销投入产出比。同时,系统在长期运行过程中还可以积累大量历史样本,为后续模型优化、策略优化和业务规则迭代提供数据基础,逐步形成“识别—预警—干预—反馈—再训练”的闭环机制。
项目最核心的目标之一,是建立一套能够稳定识别客户流失风险的能力体系。系统并不局限于记录客户是否离开,而是进一步通过历史行为、账户变化、交易频率、产品持有情况和交互活跃度等多维信息,综合判断客户未来一段时间内的流失概率。相比传统依赖经验和人工筛查的模式,模型化识别具备更强的客观性与一致性,可以减少主观偏差,提升判断准确度。银行在实际经营中通常面对海量客户,若完全依靠人工判断,既难以覆盖全部客户,也无法及时捕捉微弱但关键的行为变化。通过建立风险识别能力,系统可以帮助银行更早发现潜在流失客户,为后续策略干预赢得时间窗口,从而提升客户留存率与资产稳定性。
项目的第二个目标,是将客户流失预警结果直接服务于银行的精细化运营。传统营销往往采用统一活动、广泛推送的方式,容易造成资源浪费,也会影响客户体验。流失预警系统能够将客户按照风险等级分层,例如低风险、中风险、高风险和极高风险客户,并针对不同层级制定差异化挽留策略。高风险客户可优先安排人工回访、专属福利或定制化理财建议,中风险客户可通过短信、APP推送或权益提醒进行激活,低风险客户则主要保持常规服务即可。这样的分层运营方式能够提高营销精准度,减少无效触达,并让每一次营销动作都更加接近客户真实需求。对于银行而言,这意味着更高的客户保留率、更低的营销成本以及更强的业务增长效率。
项目的第三个目标,是为银行管理层提供可视化、可追踪、可分析的决策支持。客户流失不是单点问题,而是与产品结构、服务体验、渠道活跃度、利率竞争、市场环境等多种因素相关。系统在运行过程中会持续沉淀流失样本、预警记录、挽留结果和客户反馈,借助Vue前端可视化界面和后端统计分析功能,管理人员可以清晰查看各类风险客户的分布情况、预警命中率、策略转化率和流失原因变化趋势。这类数据不仅有助于了解当前客户结构,也能用于评估各项业务策略是否有效,从而推动管理决策更加数据化、科学化和可量化。长期来看,这种能力能够帮助银行从“事后解释”转向“事前预防”,提升整体经营韧性。
项目的第四个目标,是形成一个具备持续演进能力的技术平台,而不是一次性完成的静态功能系统。客户流失预警本质上是一个不断变化的问题,随着市场环境、产品策略和客户偏好的变化,模型规则与特征权重也会不断调整。系统采用Java后端与Vue前端分离式架构,便于后续扩展更多数据源、引入新的模型算法、增加消息通知渠道或接入银行现有的业务中台。平台化设计能够让系统在后续升级中保持较强的兼容性和稳定性,例如可以接入定时任务实现日级、周级预警刷新,也可以增加模型训练模块实现自动更新。这样的设计意义在于,系统不只是解决当前问题,还能支持银行在未来进行更深层次的客户经营与智能决策建设。
银行客户流失预警的首要挑战,是数据来源多样且格式差异明显。客户信息可能分布在核心交易系统、信用卡系统、理财系统、APP日志系统和客服系统中,不同系统的数据粒度、字段命名和更新时间并不一致。部分数据是结构化表格数据,部分数据则是行为日志或文本记录,若直接用于建模,很容易出现缺失值多、噪声大、重复记录多等问题。针对这一挑战,系统需要建立统一的数据清洗与特征工程流程,将原始数据映射为模型可识别的标准特征,例如月交易次数、近30天登录次数、余额变化率、投诉次数、持有产品数等。通过特征聚合、归一化处理和异常值剔除,可以显著提升模型输入质量,为后续预测打下基础。
第二个挑战在于流失样本通常远少于未流失样本,存在明显类别不平衡问题。如果直接训练模型,模型很可能更倾向于预测为“未流失”,从而导致高准确率但低召回率的结果。对于预警系统而言,漏掉高风险客户的代价通常远高于误报少量低风险客户,因此需要特别关注召回能力和风险捕获能力。针对这一问题,系统可采用样本重采样、类别权重调整、阈值优化等方式进行处理。例如在训练阶段对少数类样本进行过采样,或者在分类器中提高流失类权重,使模型更加关注高风险样本。同时,评估指标不能只看准确率,还需结合精确率、召回率、F1值和AUC值综合判断模型效果,以保证预警结果真正具备业务价值。
第三个挑战是系统不仅要能预测,还要能稳定运行在银行业务场景中,满足实时性和安全合规要求。客户行为数据更新频率较高,预警结果如果不能及时刷新,就会失去运营价值。另一方面,银行数据属于敏感业务数据,系统必须具备严格的身份认证、权限控制、接口加密、操作审计和日志留痕能力。针对实时性问题,后端可通过定时任务、异步处理和缓存优化减少重复计算压力;针对安全问题,可通过Spring Security或自定义权限体系实现角色控制,并结合Token机制、接口校验和数据脱敏策略保护客户隐私。这样既能保证预警及时性,也能满足银行行业对数据安全、合规管理和审计追踪的要求。
数据采集层负责从多个业务系统中汇聚客户相关信息,包括基本身份信息、账户信息、交易记录、渠道行为、客服交互和营销触达结果等。这个层次的核心任务不是简单收集数据,而是对多源数据进行统一接入和初步对齐。银行系统中同一客户往往会在不同业务表中出现不同标识,因此需要通过客户号、证件号、手机号或统一客户ID进行关联。采集层通常采用定时同步、接口拉取或数据库视图方式实现,确保数据能够按周期进入分析链路。其基本原理是将分散在各业务域的数据集中到统一分析环境中,为后续特征工程和模型训练提供完整输入。若采集层缺失某些关键数据,模型容易出现信息不全的问题,直接影响预测质量。
数据清洗与特征工程层是整个模型架构中最重要的基础环节,决定了模型最终能够学习到什么样的规律。清洗过程包括缺失值处理、异常值识别、重复记录删除、时间窗口截取和字段标准化。特征工程则是从原始记录中提炼出能够反映客户行为变化的指标,例如近7天、近30天、近90天交易次数,账户余额波动率,产品持有数量变化,登录频率变化,投诉次数,活动参与率等。其基本原理在于:客户流失往往不是瞬间发生,而是长期行为模式改变的结果,因此通过时间窗口聚合可以把离散事件转化为稳定特征。机器学习模型通常不直接理解业务原始记录,而是通过这些加工后的数值特征学习流失规律。特征工程越合理,模型的解释能力与泛化能力通常越好。
流失预测模型层负责将加工后的特征输入算法模型,输出客户未来流失概率或风险等级。该层可以采用逻辑回归、随机森林、梯度提升树等常见算法,也可以进一步扩展到XGBoost、LightGBM等更强的集成学习方法。逻辑回归的基本原理是通过线性组合特征后经过Sigmoid函数输出概率,具有解释性较强、实现简单的优点;随机森林则通过多棵决策树进行投票,能够提升稳定性并减少过拟合;梯度提升树通过逐步拟合残差不断增强预测能力,通常在结构化业务数据中表现较好。对于银行客户流失场景而言,模型层的核心目标不是追求绝对复杂,而是追求稳定、可解释和可落地。系统在实际运行中可根据业务需要选择主模型和备用模型,并结合阈值策略输出不同级别预警。
预警策略与决策层负责把模型输出转化为可执行的业务动作。模型给出的只是概率值,但银行运营需要的是具体客户分层和触达建议,因此需要结合业务规则进行决策映射。例如流失概率大于0.8的客户可标记为高危客户,推送人工回访任务;概率介于0.6到0.8之间的客户可标记为重点关注客户,触发权益提醒或优惠券;低于0.6的客户则继续观察。其基本原理在于将统计学习结果和业务规则结合,形成更符合实际运营逻辑的策略体系。决策层还可以根据客户价值、资产规模、产品数量和历史贡献进行二次排序,使高价值高风险客户优先获得干预资源。这样做可以提升系统的业务可操作性,而不仅仅停留在算法输出层面。
前后端展示与闭环反馈层负责将预警结果以可视化方式呈现给业务人员,并收集干预后的反馈数据,形成持续优化闭环。Vue前端可以展示客户列表、风险分布、历史趋势、模型命中情况、挽留成功率等内容,帮助业务人员快速定位重点客户。Java后端则提供接口支持、权限控制和数据查询功能。闭环反馈的基本原理在于,预警不是终点,而是后续干预和效果评估的起点。当银行对高风险客户采取措施后,系统需要记录客户是否恢复活跃、是否继续流失、是否新增产品持有等信息,这些反馈又会进入后续训练样本中,持续提升模型能力。这样就构建了一个“数据采集、特征分析、模型预测、业务预警、策略执行、结果反馈”的完整闭环。
客户行为特征实体
package com.bank.churn.model; // 定义客户流失预警系统中的模型包,便于后续按职责区分业务实体
import java.math.BigDecimal; // 引入高精度数值类型,用于账户余额、交易金额等金融场景数据
import java.time.LocalDate; // 引入日期类型,用于记录时间窗口和统计周期
public class CustomerBehaviorFeature { // 定义客户行为特征实体类,用于承载模型输入数据
private Long customerId; // 客户唯一标识,作为后续关联和查询的主键字段
private Integer loginCount30d; // 近30天登录次数,反映客户对渠道的活跃程度
private Integer transactionCount30d; // 近30天交易次数,反映客户的实际使用频率
private BigDecimal balanceChangeRate30d; // 近30天余额变化率,反映客户资金留存趋势
private Integer complaintCount90d; // 近90天投诉次数,反映客户服务满意度变化
private Integer productHoldingCount; // 当前持有产品数量,反映客户黏性与综合价值
private Integer lastActiveDays; // 距离最近一次活跃的天数,反映客户沉默程度
private LocalDate statisticDate; // 特征统计日期,用于明确该特征属于哪个时间窗口
public Long getCustomerId() { return customerId; } // 提供客户编号读取方法,便于服务层调用
public void setCustomerId(Long customerId) { this.customerId = customerId; } // 提供客户编号设置方法,便于数据装配
public Integer getLoginCount30d() { return loginCount30d; } // 提供登录次数读取方法,便于模型输入构建
public void setLoginCount30d(Integer loginCount30d) { this.loginCount30d = loginCount30d; } // 设置近30天登录次数
public Integer getTransactionCount30d() { return transactionCount30d; } // 提供交易次数读取方法
public void setTransactionCount30d(Integer transactionCount30d) { this.transactionCount30d = transactionCount30d; } // 设置近30天交易次数
public BigDecimal getBalanceChangeRate30d() { return balanceChangeRate30d; } // 提供余额变化率读取方法
public void setBalanceChangeRate30d(BigDecimal balanceChangeRate30d) { this.balanceChangeRate30d = balanceChangeRate30d; } // 设置余额变化率
public Integer getComplaintCount90d() { return complaintCount90d; } // 提供投诉次数读取方法
public void setComplaintCount90d(Integer complaintCount90d) { this.complaintCount90d = complaintCount90d; } // 设置近90天投诉次数
public Integer getProductHoldingCount() { return productHoldingCount; } // 提供持有产品数读取方法
public void setProductHoldingCount(Integer productHoldingCount) { this.productHoldingCount = productHoldingCount; } // 设置产品持有数
public Integer getLastActiveDays() { return lastActiveDays; } // 提供最近活跃天数读取方法
public void setLastActiveDays(Integer lastActiveDays) { this.lastActiveDays = lastActiveDays; } // 设置最近活跃天数
public LocalDate getStatisticDate() { return statisticDate; } // 提供统计日期读取方法
public void setStatisticDate(LocalDate statisticDate) { this.statisticDate = statisticDate; } // 设置统计日期
} // 结束实体定义,便于在Controller、Service和Repository中统一传递
流失评分结果实体
package com.bank.churn.model; // 定义结果实体所在包,便于管理预测输出对象
import java.time.LocalDateTime; // 引入时间类型,用于记录预警生成时间
public class ChurnScoreResult { // 定义流失评分结果类,用于承载模型预测输出
private Long customerId; // 客户唯一标识,便于和原始客户信息关联
private Double churnProbability; // 流失概率,属于模型输出的核心数值
private String riskLevel; // 风险等级,便于前端展示和业务分层处理
private LocalDateTime predictTime; // 预测时间,便于审计和历史追踪
public Long getCustomerId() { return customerId; } // 读取客户编号
public void setCustomerId(Long customerId) { this.customerId = customerId; } // 设置客户编号
public Double getChurnProbability() { return churnProbability; } // 读取流失概率
public void setChurnProbability(Double churnProbability) { this.churnProbability = churnProbability; } // 设置流失概率
public String getRiskLevel() { return riskLevel; } // 读取风险等级
public void setRiskLevel(String riskLevel) { this.riskLevel = riskLevel; } // 设置风险等级
public LocalDateTime getPredictTime() { return predictTime; } // 读取预测时间
public void setPredictTime(LocalDateTime predictTime) { this.predictTime = predictTime; } // 设置预测时间
} // 结束结果实体定义,便于接口返回与数据库落库
逻辑回归评分服务
package com.bank.churn.service; // 定义服务层包,承载流失预测核心逻辑
import com.bank.churn.model.CustomerBehaviorFeature; // 导入客户行为特征实体,作为模型输入
import com.bank.churn.model.ChurnScoreResult; // 导入评分结果实体,作为模型输出
import org.springframework.stereotype.Service; // 引入服务注解,使类能够被Spring容器管理
import java.math.BigDecimal; // 引入高精度数值类型,处理特征权重运算
import java.time.LocalDateTime; // 引入时间类型,用于生成预测时间
@Service // 声明为业务服务组件,便于控制层直接注入调用
public class ChurnScoringService { // 定义客户流失评分服务,封装模型计算过程
public ChurnScoreResult score(CustomerBehaviorFeature feature) { // 定义评分方法,输入行为特征,输出流失结果
double z = 0.0; // 定义线性组合值,用于承载加权求和结果
z += -1.8; // 设置截距项,使基础流失倾向具备初始偏移
z += feature.getLoginCount30d() == null ? 0 : feature.getLoginCount30d() * -0.12; // 登录越少,流失倾向越高,因此权重为负
z += feature.getTransactionCount30d() == null ? 0 : feature.getTransactionCount30d() * -0.18; // 交易越少,风险越高,因此采用负向权重
BigDecimal balanceRate = feature.getBalanceChangeRate30d() == null ? BigDecimal.ZERO : feature.getBalanceChangeRate30d(); // 读取余额变化率并处理空值
z += balanceRate.doubleValue() * 1.25; // 余额变化率若为正,说明资金沉淀改善,可降低流失概率
z += feature.getComplaintCount90d() == null ? 0 : feature.getComplaintCount90d() * 0.35; // 投诉越多,满意度越低,流失风险越大
z += feature.getProductHoldingCount() == null ? 0 : feature.getProductHoldingCount() * -0.22; // 产品越多,黏性越强,故权重为负
z += feature.getLastActiveDays() == null ? 0 : feature.getLastActiveDays() * 0.08; // 沉默天数越长,风险越高,因此采用正向权重
double probability = 1.0 / (1.0 + Math.exp(-z)); // 通过Sigmoid函数将线性值映射为0到1之间的概率
String riskLevel; // 定义风险等级变量,便于后续业务分层
if (probability >= 0.8) { // 判断是否达到高风险阈值
riskLevel = "高危"; // 将极高流失概率客户标记为高危
} else if (probability >= 0.6) { // 判断是否达到中高风险阈值
riskLevel = "关注"; // 将较高风险客户标记为关注
} else if (probability >= 0.4) { // 判断是否达到中低风险阈值
riskLevel = "观察"; // 将中等风险客户标记为观察
} else { // 低于0.4时进入低风险区域
riskLevel = "稳定"; // 标记为稳定客户,暂不触发强干预
} // 完成风险分层判断
ChurnScoreResult result = new ChurnScoreResult(); // 创建结果对象,用于装配输出数据
result.setCustomerId(feature.getCustomerId()); // 回填客户编号,保证结果可追溯
result.setChurnProbability(probability); // 设置流失概率,供前端和业务系统展示
result.setRiskLevel(riskLevel); // 设置风险等级,供策略引擎分流
result.setPredictTime(LocalDateTime.now()); // 记录当前预测时间,便于审计和统计
return result; // 返回最终评分结果
} // 结束评分方法
} // 结束服务定义,形成可被控制层调用的业务组件
预警控制接口
package com.bank.churn.controller; // 定义控制器所在包,负责接收前端请求
import com.bank.churn.model.CustomerBehaviorFeature; // 导入客户行为特征实体
import com.bank.churn.model.ChurnScoreResult; // 导入评分结果实体
import com.bank.churn.service.ChurnScoringService; // 导入评分服务类
import org.springframework.web.bind.annotation.PostMapping; // 引入Post映射注解,用于处理提交请求
import org.springframework.web.bind.annotation.RequestBody; // 引入RequestBody注解,用于接收JSON请求体
import org.springframework.web.bind.annotation.RequestMapping; // 引入RequestMapping注解,用于定义接口路径前缀
import org.springframework.web.bind.annotation.RestController; // 引入RestController注解,使返回值直接序列化为JSON
import org.springframework.beans.factory.annotation.Autowired; // 引入自动注入注解
@RestController // 声明为REST风格控制器,便于前后端分离调用
@RequestMapping("/api/churn") // 设置统一接口前缀,方便路径管理
public class ChurnController { // 定义客户流失预警控制器
@Autowired // 注入评分服务实例,避免手动创建对象
private ChurnScoringService churnScoringService; // 声明评分服务依赖
@PostMapping("/score") // 定义评分接口路径,前端可通过POST提交客户特征
public ChurnScoreResult score(@RequestBody CustomerBehaviorFeature feature) { // 接收前端传入的特征对象并返回评分结果
return churnScoringService.score(feature); // 调用服务层完成模型评分,并返回结果
} // 结束评分接口方法
} // 结束控制器定义,承担请求路由职责
Vue前端请求页面
<template>
<div class="page"> <!-- 定义页面容器,承载表单与结果展示 -->
<h2>客户流失预警评分</h2> <!-- 页面主功能提示,便于业务人员快速识别用途 -->
<el-form :model="form" label-width="160px"> <!-- 使用Element Plus表单组件,提升输入体验 -->
<el-form-item label="客户编号"> <!-- 定义客户编号输入项 -->
<el-input v-model="form.customerId" /> <!-- 双向绑定客户编号,方便请求提交 -->
</el-form-item> <!-- 结束客户编号表单项 -->
<el-form-item label="近30天登录次数"> <!-- 定义登录次数输入项 -->
<el-input v-model="form.loginCount30d" /> <!-- 输入登录次数,作为风险特征之一 -->
</el-form-item> <!-- 结束登录次数表单项 -->
<el-form-item label="近30天交易次数"> <!-- 定义交易次数输入项 -->
<el-input v-model="form.transactionCount30d" /> <!-- 输入交易频次,作为模型输入 -->
</el-form-item> <!-- 结束交易次数表单项 -->
<el-form-item label="近30天余额变化率"> <!-- 定义余额变化率输入项 -->
<el-input v-model="form.balanceChangeRate30d" /> <!-- 输入余额变化率,反映资金留存趋势 -->
</el-form-item> <!-- 结束余额变化率表单项 -->
<el-form-item label="近90天投诉次数"> <!-- 定义投诉次数输入项 -->
<el-input v-model="form.complaintCount90d" /> <!-- 输入投诉频次,反映满意度波动 -->
</el-form-item> <!-- 结束投诉次数表单项 -->
<el-form-item label="当前持有产品数"> <!-- 定义产品持有数输入项 -->
<el-input v-model="form.productHoldingCount" /> <!-- 输入产品数量,反映客户黏性 -->
</el-form-item> <!-- 结束产品持有数表单项 -->
<el-form-item label="距离最近活跃天数"> <!-- 定义最近活跃天数输入项 -->
<el-input v-model="form.lastActiveDays" /> <!-- 输入沉默天数,反映流失倾向 -->
</el-form-item> <!-- 结束最近活跃天数表单项 -->
<el-form-item> <!-- 定义按钮区域 -->
<el-button type="primary" @click="submitScore">开始评分</el-button> <!-- 点击后提交评分请求 -->
</el-form-item> <!-- 结束按钮区域 -->
</el-form> <!-- 结束输入表单 -->
<div v-if="result"> <!-- 当评分结果存在时展示结果卡片 -->
<p>流失概率:{{ result.churnProbability }}</p> <!-- 展示模型输出的概率值 -->
<p>风险等级:{{ result.riskLevel }}</p> <!-- 展示分层后的风险等级 -->
<p>预测时间:{{ result.predictTime }}</p> <!-- 展示评分生成时间 -->
</div> <!-- 结束结果展示区域 -->
</div> <!-- 结束页面容器 -->
</template> <!-- 结束模板区域 -->
<script setup> // 使用组合式API编写页面逻辑
import { reactive, ref } from 'vue' // 引入响应式数据方法
import axios from 'axios' // 引入HTTP请求库,便于与后端交互
const form = reactive({ // 定义表单响应式对象,存放输入内容
customerId: '', // 初始化客户编号
loginCount30d: '', // 初始化登录次数
transactionCount30d: '', // 初始化交易次数
balanceChangeRate30d: '', // 初始化余额变化率
complaintCount90d: '', // 初始化投诉次数
productHoldingCount: '', // 初始化产品数量
lastActiveDays: '' // 初始化最近活跃天数
}) // 结束表单对象定义
const result = ref(null) // 定义结果响应式变量,初始为空
const submitScore = async () => { // 定义提交评分方法,支持异步请求
const res = await axios.post('/api/churn/score', { // 向后端评分接口提交JSON数据
customerId: Number(form.customerId), // 将客户编号转换为数字,保证后端接收一致
loginCount30d: Number(form.loginCount30d), // 将登录次数转换为数字
transactionCount30d: Number(form.transactionCount30d), // 将交易次数转换为数字
balanceChangeRate30d: Number(form.balanceChangeRate30d), // 将余额变化率转换为数字
complaintCount90d: Number(form.complaintCount90d), // 将投诉次数转换为数字
productHoldingCount: Number(form.productHoldingCount), // 将产品数量转换为数字
lastActiveDays: Number(form.lastActiveDays) // 将最近活跃天数转换为数字
}) // 完成请求发送并接收响应
result.value = res.data // 将响应结果写入页面状态,用于展示评分结果
} // 结束提交方法
</script> <!-- 结束脚本区域 -->
<style scoped> <!-- 启用作用域样式,避免影响全局页面 -->
.page { padding: 24px; } <!-- 设置页面内边距,增强布局舒适度 -->
</style> <!-- 结束样式区域 -->
预警结果阈值工具类
package com.bank.churn.util; // 定义工具类包,便于管理公共逻辑
public class RiskLevelUtil { // 定义风险等级工具类,用于统一风险映射规则
public static String mapLevel(double probability) { // 定义概率到风险等级的映射方法
if (probability >= 0.8) { // 判断是否属于最高风险区间
return "高危"; // 返回高危等级
} // 结束最高风险判断
if (probability >= 0.6) { // 判断是否属于较高风险区间
return "关注"; // 返回关注等级
} // 结束较高风险判断
if (probability >= 0.4) { // 判断是否属于中等风险区间
return "观察"; // 返回观察等级
} // 结束中等风险判断
return "稳定"; // 低于阈值则返回稳定等级
} // 结束映射方法
} // 结束工具类定义,便于多个模块复用






更多详细内容请访问
http://金融科技基于Java+Vue的银行客户流失预警系统设计与实现基于java+vue的银行客户流失预警系统设计与实现的详细项目实例(含完整的程序,数据库和GUI设计,代码详解)资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/92850736
https://download.csdn.net/download/xiaoxingkongyuxi/92850736
https://download.csdn.net/download/xiaoxingkongyuxi/92850736
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)