news 2026/4/3 3:12:09

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

作者头像

张小明

前端开发工程师

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 3:09:15

GAIA-DataSet AIOps数据集完整实践指南:从入门到精通

GAIA-DataSet AIOps数据集完整实践指南:从入门到精通 【免费下载链接】GAIA-DataSet GAIA, with the full name Generic AIOps Atlas, is an overall dataset for analyzing operation problems such as anomaly detection, log analysis, fault localization, etc.…

作者头像 李华
网站建设 2026/4/3 3:00:39

突破浏览器壁垒:插件跨平台兼容的终极指南

突破浏览器壁垒:插件跨平台兼容的终极指南 【免费下载链接】PT-Plugin-Plus PT 助手 Plus,为 Microsoft Edge、Google Chrome、Firefox 浏览器插件(Web Extensions),主要用于辅助下载 PT 站的种子。 项目地址: https…

作者头像 李华
网站建设 2026/3/31 2:39:59

Kotaemon槽位填充实现:结构化信息抽取

Kotaemon槽位填充实现:结构化信息抽取 在企业级智能对话系统中,一个常见的挑战是:用户说“帮我改一下昨天订的那顿饭”,系统如何准确理解“昨天”、“那顿饭”到底指什么?更进一步,它能否自动提取出时间、地…

作者头像 李华
网站建设 2026/3/31 0:26:22

Web条码处理技术革命:从ZXing.js看现代二维码开发新范式

Web条码处理技术革命:从ZXing.js看现代二维码开发新范式 【免费下载链接】library Multi-format 1D/2D barcode image processing library, usable in JavaScript ecosystem. 项目地址: https://gitcode.com/gh_mirrors/lib/library 在数字化浪潮席卷各行各业…

作者头像 李华
网站建设 2026/3/30 18:49:24

JavaScript原型链:一份会“遗传”的家族传家宝

欢迎使用我的小程序👇👇👇👇 俱好用助手功能介绍 你好!如果你曾觉得JavaScript的原型链像魔法一样神秘,那么今天我要告诉你一个秘密:它其实就像一份家族传家宝,代代相传&#xff0c…

作者头像 李华
网站建设 2026/3/30 16:21:39

LoRa还是NB-IoT?农业物联网Agent通信技术选型全解析

第一章:农业物联网Agent通信技术选型背景在现代农业系统中,物联网(IoT)技术正逐步重构农业生产模式。农业物联网Agent作为感知、决策与执行的核心单元,其通信能力直接决定了系统的实时性、可靠性和可扩展性。随着传感器…

作者头像 李华