在Windows Hyper-V上运行macOS的完整技术实践指南
2026/7/17 16:02:19
数据集来源: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
churn(0=未流失,1=已流失),标签通过业务驱动规则结合概率噪声生成,确保特征相关性真实| 特征类别 | 包含字段 |
|---|---|
| 客户档案 | 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(调查反馈) |
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()| 模块 | 功能说明 | 关键输出 |
|---|---|---|
| 数据加载 | 读取CSV文件,展示数据规模和流失分布 | 数据形状、客户流失率统计 |
| 数据预处理 | 特征分类(数值/分类型)、标准化、编码 | 预处理流水线、训练/测试数据集 |
| 模型训练 | 构建随机森林模型(处理类别不平衡) | 可直接用于预测的模型对象 |
| 模型评估 | 计算准确率、生成分类报告 | 准确率、混淆矩阵、Precision/Recall/F1 |
| 客户预测 | 输入客户ID,输出流失概率和风险等级 | 客户流失风险表(低/中/高风险) |
| 模型保存 | 保存训练好的模型 | 可复用的.pkl模型文件 |
complaint_type字段存在20.45%缺失值,不影响核心分析对前10名客户的流失风险预测结果:
| 客户ID | 流失概率 | 风险等级 | 建议行动 |
|---|---|---|---|
| CUST_00001 | 21.83% | 低风险 | 常规维护 |
| CUST_00002 | 65.11% | 高风险 | 紧急干预 |
| CUST_00003 | 27.47% | 低风险 | 常规维护 |
| CUST_00006 | 33.79% | 中风险 | 主动关怀 |
| CUST_00009 | 36.41% | 中风险 | 针对性挽留 |
模型文件:churn_prediction_model.pkl
model = joblib.load('churn_prediction_model.pkl')特征重要性文件:feature_importance.csv
可视化图表:
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 run streamlit_churn_prediction.py我用夸克网盘给你分享了「客户流失预测相关数据集+代码+模型」,点击链接或复制整段内容,打开「夸克APP」即可获取。
链接:https://pan.quark.cn/s/0e2fbf321c05
数据集来源:Customer Churn Prediction Business Dataset(https://www.kaggle.com/datasets/miadul/customer-churn-prediction-business-dataset)
作者:ARIF MIAH
许可证:Apache 2.0
源kaggle平台作者写的免责声明: