news 2025/12/28 7:25:08

机器学习---基于随机森林算法的客户流失预测模型+可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习---基于随机森林算法的客户流失预测模型+可视化

一、数据集基本信息

  1. 数据集定位:为机器学习、数据科学和预测分析设计的合成但贴合业务实际的客户流失预测数据集,模拟真实客户行为,用于解决订阅制及服务型企业的客户流失问题。

数据集来源:Customer Churn Prediction Business Dataset(https://www.kaggle.com/datasets/miadul/customer-churn-prediction-business-dataset)
作者:ARIF MIAH
许可证:Apache 2.0

我用夸克网盘给你分享了「客户流失预测相关数据集+代码+模型」,点击链接或复制整段内容,打开「夸克APP」即可获取。
链接:https://pan.quark.cn/s/0e2fbf321c05

  1. 基础特征
    • 记录数量:10,000条客户数据
    • 目标变量:churn(0=未流失,1=已流失),标签通过业务驱动规则结合概率噪声生成,确保特征相关性真实
    • 数据类型:数值型+分类型
    • 适用领域:订阅制/SaaS/电信/服务型企业
    • 数据来源:基于业务逻辑的合成数据
  2. 特征分类(共32列,已展示10列核心特征)
    特征类别包含字段
    客户档案customer_id(客户ID)、gender(性别,男女各占50%)、age(年龄,18-74岁,分10个区间)、country(国家,孟加拉国/加拿大各15%,其他占70%)、city(城市,伦敦/悉尼各15%,其他占70%)、customer_segment(客户细分,个人60%、中小企业30%、其他10%)、tenure_months(在网月数,1-59个月,分10个区间)、signup_channel(注册渠道,网页50%、移动端30%、其他20%)、contract_type(合同类型,月付50%、季付31%、其他20%)
    产品使用monthly_logins(月登录次数,0-54次,分10个区间)、session duration(会话时长)、feature usage(功能使用情况)、activity trends(活动趋势)
    账单与支付subscription fees(订阅费用)、revenue(收入)、payment failures(支付失败次数)、discounts(折扣)
    客户支持tickets(工单数量)、resolution time(解决时间)、CSAT(客户满意度)、complaints(投诉)
    参与度与反馈email activity(邮件活跃度)、NPS score(净推荐值)、survey responses(调查反馈)

二、数据集用途

  1. 数据层面:探索性数据分析(EDA)、特征工程
  2. 建模层面:客户流失预测建模、机器学习/深度学习模型训练与评估、可解释AI(如SHAP、特征重要性分析)
  3. 业务层面:预测高风险流失客户、识别流失关键驱动因素、估算风险收入、制定客户保留策略、搭建高管级业务仪表盘与决策支持系统
  4. 部署层面:通过Streamlit或Flask实现端到端机器学习部署

三、数据集可用性与声明

  1. 可用性指标:可用性评分7.06,采用Apache 2.0许可证,更新频率未指定
  2. 标签分类:涵盖Business(商业)、Computer Science(计算机科学)、Classification(分类)、Online Communities(在线社区)、Retail and Shopping(零售与购物)
  3. 免责声明:仅用于教育、研究和作品集展示,虽反映真实业务模式,但不代表真实客户数据

四、代码

4.1 完整分析代码

importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestClassifierfromsklearn.preprocessingimportStandardScaler,OneHotEncoderfromsklearn.composeimportColumnTransformerfromsklearn.pipelineimportPipelinefromsklearn.metricsimportaccuracy_score,classification_report,confusion_matriximportwarnings warnings.filterwarnings('ignore')# 设置中文字体plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False# 1. 数据加载与基本探索defload_and_explore_data(file_path):"""加载数据并进行基本探索"""print("\n1. 数据加载与基本探索")print("-"*40)# 加载数据df=pd.read_csv(file_path)# 基本信息print(f"数据形状:{df.shape}(行:{df.shape[0]}, 列:{df.shape[1]})")print(f"\n目标变量(churn)分布:")churn_counts=df['churn'].value_counts()print(f"留存客户(0):{churn_counts[0]}({churn_counts[0]/len(df)*100:.2f}%)")print(f"流失客户(1):{churn_counts[1]}({churn_counts[1]/len(df)*100:.2f}%)")# 检查缺失值missing_data=df.isnull().sum()missing_cols=missing_data[missing_data>0]iflen(missing_cols)>0:print(f"\n缺失值统计:")forcol,countinmissing_cols.items():print(f"{col}:{count}({count/len(df)*100:.2f}%)")else:print(f"\n无缺失值,数据质量良好")returndf# 2. 数据预处理与特征工程defpreprocess_data(df):"""数据预处理与特征工程"""print("\n2. 数据预处理与特征工程")print("-"*40)# 选择特征和目标变量(排除非预测性特征)exclude_cols=['customer_id','city','country']# 排除ID和地理位置X=df.drop(columns=exclude_cols+['churn'])y=df['churn']# 区分数值型和分类型特征numerical_features=X.select_dtypes(include=['int64','float64']).columns categorical_features=X.select_dtypes(include=['object','category']).columnsprint(f"数值型特征:{list(numerical_features)}")print(f"分类型特征:{list(categorical_features)}")# 创建预处理流水线# 数值型特征:标准化# 分类型特征:独热编码preprocessor=ColumnTransformer(transformers=[('num',StandardScaler(),numerical_features),('cat',OneHotEncoder(drop='first',sparse_output=False),categorical_features)])# 分割训练集和测试集(保持类别平衡)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42,stratify=y)print(f"\n训练集大小:{X_train.shape}(流失率:{y_train.mean()*100:.2f}%)")print(f"测试集大小:{X_test.shape}(流失率:{y_test.mean()*100:.2f}%)")returnX_train,X_test,y_train,y_test,preprocessor,numerical_features,categorical_features# 3. 训练随机森林预测模型deftrain_churn_model(X_train,y_train,preprocessor):"""训练随机森林客户流失预测模型"""print("\n3. 模型训练")print("-"*40)# 创建模型流水线(预处理 + 随机森林)model=Pipeline(steps=[('preprocessor',preprocessor),('classifier',RandomForestClassifier(n_estimators=100,max_depth=10,random_state=42,class_weight='balanced'# 处理类别不平衡))])# 训练模型model.fit(X_train,y_train)print("模型训练完成!")returnmodel# 4. 模型评估defevaluate_model(model,X_test,y_test):"""评估模型性能"""print("\n4. 模型评估")print("-"*40)# 预测y_pred=model.predict(X_test)y_pred_prob=model.predict_proba(X_test)[:,1]# 流失概率# 计算评估指标accuracy=accuracy_score(y_test,y_pred)conf_matrix=confusion_matrix(y_test,y_pred)print(f"准确率(Accuracy):{accuracy:.4f}")print(f"\n混淆矩阵:")print(conf_matrix)print(f"\n分类报告:")print(classification_report(y_test,y_pred))# 提取特征重要性(需要处理编码后的特征名)preprocessor=model.named_steps['preprocessor']classifier=model.named_steps['classifier']# 获取数值型特征重要性num_importance=classifier.feature_importances_[:len(preprocessor.transformers_[0][2])]# 获取分类型特征编码后的重要性cat_encoder=preprocessor.transformers_[1][1]cat_feature_names=[]fori,cat_colinenumerate(preprocessor.transformers_[1][2]):cat_values=cat_encoder.categories_[i][1:]# 排除第一个类别(drop='first')cat_feature_names.extend([f"{cat_col}_{val}"forvalincat_values])cat_importance=classifier.feature_importances_[len(preprocessor.transformers_[0][2]):]# 合并所有特征重要性all_feature_names=list(preprocessor.transformers_[0][2])+cat_feature_names all_importance=np.concatenate([num_importance,cat_importance])# 排序并显示前10个重要特征feature_importance=pd.DataFrame({'feature':all_feature_names,'importance':all_importance}).sort_values('importance',ascending=False)print(f"\n前10个最重要的流失影响因素:")print(feature_importance.head(10).to_string(index=False))returnmodel,feature_importance,y_pred_prob# 5. 客户流失预测defpredict_churn(model,df,customer_ids):"""预测指定客户的流失风险"""print("\n5. 客户流失预测示例")print("-"*40)# 选择客户数据exclude_cols=['customer_id','city','country','churn']X_pred=df[df['customer_id'].isin(customer_ids)].drop(columns=exclude_cols,errors='ignore')iflen(X_pred)==0:print(f"未找到客户ID:{customer_ids}")returnNone# 预测流失概率churn_prob=model.predict_proba(X_pred)[:,1]# 生成预测结果prediction_result=pd.DataFrame({'customer_id':customer_ids[:len(churn_prob)],'churn_probability':churn_prob.round(4),'churn_risk':pd.cut(churn_prob,bins=[0,0.3,0.6,1.0],labels=['低风险','中风险','高风险'])})print("客户流失风险预测结果:")print(prediction_result.to_string(index=False))returnprediction_result# 6. 可视化关键结果defvisualize_results(df,feature_importance):"""可视化关键分析结果"""print("\n6. 结果可视化")print("-"*40)# 创建图表fig,((ax1,ax2),(ax3,ax4))=plt.subplots(2,2,figsize=(16,12))# 1. 客户流失分布churn_counts=df['churn'].value_counts()colors1=['#2E8B57','#DC143C']ax1.pie(churn_counts.values,labels=['留存客户','流失客户'],autopct='%1.2f%%',colors=colors1,startangle=90)ax1.set_title('客户流失总体分布',fontsize=12,fontweight='bold')# 2. 使用时长与流失关系tenure_churn=df.groupby(pd.cut(df['tenure_months'],bins=[0,12,24,36,60]))['churn'].mean()*100ax2.bar(range(len(tenure_churn)),tenure_churn.values,color='#4682B4')ax2.set_xticks(range(len(tenure_churn)))ax2.set_xticklabels(tenure_churn.index,rotation=45)ax2.set_ylabel('流失率(%)')ax2.set_title('不同使用时长客户的流失率',fontsize=12,fontweight='bold')# 3. CSAT分数与流失关系csat_churn=df.groupby('csat_score')['churn'].mean()*100ax3.bar(csat_churn.index,csat_churn.values,color='#FF6347')ax3.set_xlabel('CSAT分数')ax3.set_ylabel('流失率(%)')ax3.set_title('客户满意度与流失率关系',fontsize=12,fontweight='bold')# 4. 前10个重要特征top10_features=feature_importance.head(10)ax4.barh(range(len(top10_features)),top10_features['importance'],color='#32CD32')ax4.set_yticks(range(len(top10_features)))ax4.set_yticklabels(top10_features['feature'])ax4.set_xlabel('特征重要性')ax4.set_title('前10个最重要的流失影响因素',fontsize=12,fontweight='bold')ax4.invert_yaxis()# 倒序显示,最重要的在顶部plt.tight_layout()plt.savefig('churn_analysis_simplified_visualization.png',dpi=300,bbox_inches='tight')plt.close()print("可视化图表已保存为: churn_analysis_simplified_visualization.png")# 主函数:执行完整流程defmain():# 数据文件路径(根据实际情况调整)file_path='customer_churn_business_dataset.csv'try:# 1. 加载数据df=load_and_explore_data(file_path)# 2. 数据预处理X_train,X_test,y_train,y_test,preprocessor,num_features,cat_features=preprocess_data(df)# 3. 训练模型model=train_churn_model(X_train,y_train,preprocessor)# 4. 模型评估model,feature_importance,y_pred_prob=evaluate_model(model,X_test,y_test)# 5. 预测示例(选择前10个客户)sample_customer_ids=df['customer_id'].head(10).tolist()predict_churn(model,df,sample_customer_ids)# 6. 结果可视化visualize_results(df,feature_importance)# 保存模型和重要结果importjoblib joblib.dump(model,'churn_prediction_model.pkl')feature_importance.to_csv('feature_importance.csv',index=False,encoding='utf-8')print(f"\n模型已保存为: churn_prediction_model.pkl")print(f"特征重要性已保存为: feature_importance.csv")print(f"\n分析完成!")exceptExceptionase:print(f"\n分析过程中出现错误:{str(e)}")# 执行主函数if__name__=="__main__":main()

4.2 代码核心功能模块

模块功能说明关键输出
数据加载读取CSV文件,展示数据规模和流失分布数据形状、客户流失率统计
数据预处理特征分类(数值/分类型)、标准化、编码预处理流水线、训练/测试数据集
模型训练构建随机森林模型(处理类别不平衡)可直接用于预测的模型对象
模型评估计算准确率、生成分类报告准确率、混淆矩阵、Precision/Recall/F1
客户预测输入客户ID,输出流失概率和风险等级客户流失风险表(低/中/高风险)
模型保存保存训练好的模型可复用的.pkl模型文件

五、关键执行结果

5.1 数据基本情况

  • 数据规模:10,000条客户记录,32个特征
  • 流失率:10.21%(1,021名流失客户,8,979名留存客户)
  • 数据质量:仅complaint_type字段存在20.45%缺失值,不影响核心分析

5.2 模型性能表现

  • 准确率:84.63%(整体预测准确度)
  • 核心指标
    • 留存客户预测Precision:92%,Recall:91%(识别留存客户效果好)
    • 流失客户预测Precision:26%,Recall:26%(受数据不平衡影响,需优化)
  • 关键影响因素(按重要性排序):
    1. CSAT分数(0.161)- 客户满意度是最重要指标
    2. 使用时长(0.120)- 使用时间越长,流失风险越低
    3. 月登录次数(0.098)- 活跃度与留存正相关
    4. 总营收(0.078)- 高价值客户留存意愿更强
    5. 支付失败次数(0.077)- 支付稳定性影响客户信任

5.3 客户预测示例

对前10名客户的流失风险预测结果:

客户ID流失概率风险等级建议行动
CUST_0000121.83%低风险常规维护
CUST_0000265.11%高风险紧急干预
CUST_0000327.47%低风险常规维护
CUST_0000633.79%中风险主动关怀
CUST_0000936.41%中风险针对性挽留

六、生成的关键文件

  1. 模型文件:churn_prediction_model.pkl

    • 用途:可直接加载用于新客户流失预测
    • 使用方式:model = joblib.load('churn_prediction_model.pkl')
  2. 特征重要性文件:feature_importance.csv

    • 包含所有特征的重要性评分,用于指导业务优化
  3. 可视化图表

    • 包含4个子图:流失分布、使用时长影响、CSAT影响、特征重要性

七、模型使用指南

7.1加载已训练模型

importjoblibimportpandasaspd# 加载模型model=joblib.load('churn_prediction_model.pkl')# 加载新数据new_data=pd.read_csv('new_customer_data.csv')# 需与训练数据格式一致# 预测流失风险churn_prob=model.predict_proba(new_data)[:,1]new_data['churn_probability']=churn_prob.round(4)new_data['churn_risk']=pd.cut(churn_prob,bins=[0,0.3,0.6,1.0],labels=['低风险','中风险','高风险'])

八、使用Streamlit可视化

使用以下语句运行前端:

streamlit run streamlit_churn_prediction.py

我用夸克网盘给你分享了「客户流失预测相关数据集+代码+模型」,点击链接或复制整段内容,打开「夸克APP」即可获取。
链接:https://pan.quark.cn/s/0e2fbf321c05



!数据集作者及相关信息

  1. 作者ARIF MIAH
  2. 更新时间:数据集相关页面2025-12-14完成更新
  3. 版权许可:采用Apache 2.0 许可证
  4. 数据集来源:Customer Churn Prediction Business Dataset(https://www.kaggle.com/datasets/miadul/customer-churn-prediction-business-dataset)
    作者:ARIF MIAH
    许可证:Apache 2.0

    源kaggle平台作者写的免责声明:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 3:39:53

元宇宙中的智能体交互难题:90%开发者忽略的延迟一致性陷阱

第一章:元宇宙 Agent 的交互逻辑在元宇宙环境中,Agent 作为虚拟空间中的智能实体,其核心能力体现在与环境、用户及其他 Agent 的动态交互中。这些交互并非简单的事件响应,而是基于感知-决策-执行循环的复杂逻辑体系。Agent 需实时…

作者头像 李华
网站建设 2025/12/21 13:22:29

Unity内置着色器完整使用指南:从入门到精通

Unity内置着色器完整使用指南:从入门到精通 【免费下载链接】Unity-Built-in-Shaders Unity-Built-in-Shaders:提供了Unity游戏引擎内置着色器的非官方代码仓库,对使用Unity进行游戏开发的程序员有帮助。 项目地址: https://gitcode.com/gh…

作者头像 李华
网站建设 2025/12/21 13:22:27

MCP与Azure量子协同容错设计,揭开企业级量子应用稳定性的秘密

第一章:MCP Azure 量子的错误处理在构建基于 MCP(Microsoft Quantum Control Program)与 Azure Quantum 平台的量子算法时,错误处理是确保计算可靠性的核心环节。量子系统极易受到噪声和退相干影响,因此必须采用软硬件…

作者头像 李华
网站建设 2025/12/23 19:20:13

当JS拷贝玩起了“俄罗斯套娃”:深拷贝与浅拷贝的趣味对决

欢迎使用我的小程序👇👇👇👇 俱好用助手功能介绍 📚 拷贝不只是复制粘贴 想象一下,你有一本心爱的精装书,朋友想借去阅读。你有两个选择: 直接给朋友 - 但书就不在你手上了&#…

作者头像 李华
网站建设 2025/12/21 9:36:27

北京创业省钱攻略!0 元注册公司不是梦

北京创业省钱攻略!0 元注册公司不是梦 谁说在北京开公司要花大几千?亲身实测,核名、执照办理、刻章备案全程 0 费用!工作人员一句话直接让我震惊:“现在北京对初创者的支持力度就是这么大”,当场截图发圈分…

作者头像 李华
网站建设 2025/12/26 22:48:21

行业标杆 | 越秀地产入选「2025年度数据湖仓应用创新先锋企业」

近日,镜舟科技发布“2025 年度数据湖仓应用创新先锋企业”奖项,作为中国第一代商品房缔造者和全国综合性房企领军者,越秀地产凭借其在数据湖仓建设与应用方面的卓越实践成功入选,为房地产行业的数字化转型树立了标杆。一、越秀地产…

作者头像 李华