客户流失预测

2020-07-01 06:34:45

客户流失是指当客户在一段时间内离开某项服务时,对业务不利的情况。这项工作的目标是建立一个机器学习模型来预测哪些客户会离开该服务,所使用的数据集是位于Kaggle的电信客户流失数据集。为了更好地理解这些数据,我们进行了探索性的数据分析。另一项工作是使用Deepnote作为开发环境,使用PyCaret Python模块创建实验流水线。

##1.简介客户流失是指客户在一定时间内离开某项服务时,对业务造成的不利影响。<;br>;这项工作的目标是建立一个机器学习模型来预测哪些客户将离开该服务,此笔记本上使用的数据集是位于Kaggle的[Telco Customer-Customer-Customer](https://www.kaggle.com/blastchar/telco-Customer-Churn)。此外,为了更好地理解数据,本文还对数据进行了探索性的数据分析。另一点是使用Deepnote作为开发环境,使用[PyCaret](https://pykart.org/)Python模块来制作所有的实验流水线。

#1.1环境设置本工作使用的模块,PyCaret的亮点和[Ploly](https://plotly.com/)的Good Plot。

#Standard import padas pd导入numpy as NP#pyaret from pyaret.分类导入*#Plotly中的绘图.Offline导入iPlot导入Plot.graph_Objects As Go Plot导入.Figure_Factory As ff from plotly.subplots导入make_subplots as SNS#SkLearning Tools from skLearning.预处理从skLearning导入LabelEncode。metrics导入*#来自Datetime导入Date导入警告.filterWarning(";

#结构化数据帮助器函数##获取数据集def Dataset_info(DataSet,Dataset_Name:Str):print(f";DataSet Name:{Dataset_Name}|样本数:{DataSet.Shape[0]}|列数:{DataSet.Shape[1]}";)print(30*";=";)print(";列数据类型";)Print(DataSet.dtype)Print(30*";=";)MISSING_DATA=DataSet.isnull()。SUM()IF SUM(MISSING_DATA)>;0:PRINT(MISSING_DATA[MISSING_DATA.value>;0])ELSE:PRINT(";此数据集无缺失数据!";)PRINT(30*";=";)PRINT(f";内存使用量:{nP。ROUND(数据集.Memory_Usage(index=True)。sum()/10e5,3)}MB";)##DataSet采样def Data_Samping(DataSet,frac:Float,Random_Seed:Int):data_sampled_a=DataSet.sample(frac=frac,Random_state=Random_Seed)data_sampled_b=DataSet.drop(data_sampled_a.index).Reset_index(drop=True)data_sampled_a.Reset_index(drop=True,Inplace=True)return data_sampled_a,data_sampled_b(DROP=True,Inplace=True)返回DATA_SAMPLED_a,DATA_SAMPLED_b。x_轴:字符串,y_轴:字符串):颜色=[";#0080ff";,]*len(Data)Colors[0]=";#ff8000";trace=go.Bar(y=data.value,x=data.index,text=data.value,mark_color=color)Layout=go.Layout(autosize=false,Height=600,title={";text";:PLOT_Title,";y";:0.9,";x";:0.5,";x锚定";:";center";,";top";},xaxis={";title";:x_axis},yAxis={";title";:y_axis},)fig=go.Figure(data=trace,layout=layout)fig.update_layout(template=";Simple_White";)图.update_traces(textposition=";out";,textFONT_SIZE=14,MARKER=DICT(LINE=DICT(COLOR=";#000000";,width=2)图.update_yaxes(auto argin=True)iPlot(Fig)##Pie Pie Chart def PIE_Plot(Data,Plot_Title:Str):trace=go.Pie(labels=data.index,value=data.values)Layout=go.Layout(autosize=false,title={";text";:lot_title,";y";:0.9,";x")Layout=go.Layout(autosize=false,title={";text";:lot_title,";y";:0.9,";x";:0.5,";x锚定";:";中心";,";y锚定";:";顶部";})Figure(Data=TRACE,Layout=Layout)图.update_traces(textFONT_SIZE=14,MARKER=DICT(LINE=DICT(COLOR=";#000000";,width=2)图update_yaxes(auto argin=True)iPlot(Fig)##直方图定义直方图_Plot(data,lot_title:str,y_axis:str):trace=go.Histgraph(x=data)Layout=go.Layout(autosize=false,title={";text";:lot_title,";y";:0.9,";x";:0.5,";x锚定";:";中心";,";顶部";},yAxis={";title";:y_axis})Figure(Data=TRACE,Layout=Layout)图UPDATE_TRACE(MARKER=DICT(LINE=DICT(COLOR=";#000000";,width=2)图.update_layout(template=";sim

#3.1流失率分布检查客户端流失率分布是否存在不平衡,因为功能是目标,所以在处理不均衡的类时,选择什么策略非常重要。<;br>;下面的饼图显示了功能分布。

有一些流失分布的不平衡,26.5%的客户有过流失,一个标签的少量出现可能会导致不好的预测。<;br>;可以选择一些方法来处理这种情况:*进行随机过采样,复制少数类的一些样本以达到平衡,但这可能会导致过度拟合的模型。*进行随机下采样,从多数类中剔除一些样本,这达到了平衡,但这会导致信息丢失,不会向模型提供收集到的样本。*进行随机下采样,从多数类中剔除一些样本,这达到了平衡,但这会导致信息丢失,不会向模型提供收集到的样本。*另一种重采样技术,如Smote。*选择处理不平衡数据集的指标,如F1得分。流失问题与客户端留存有关,因此值得检查误报,因此精确度和召回率指标对于这种情况是必须的。<;br>;F1分数用于检查模型预测的质量,因为该度量是精度和召回率的调和平均值。

合同类型是一个很好的特性,可以用来分析该服务对客户流失的影响,下面显示了未流失客户的合同类型的曲线图。

DF_AUX=DataSet.query(';FLOWN==";否";';)DF_AUX=DF_AUX[";Contract&34;].value_Counts()bar_lot(DF_AUX,";<;b&>;未流失客户的合同类型<;/b&>;";,";<;i>;合同<;/i>。<;i>;计数<;/i>;";)。

研究表明,与年度合同相比,按月合同是第一次,但合同数量相差不大。<;br>;为了进行更好的比较,同样的曲线图显示在被搅动的客户端上。

现在,月度合同和年度合同之间的差异更大,可能会导致年度合同更好地留住客户的结论,或许忠诚度促销可能有助于降低流失率。<;br>;由于可以更深入地检查逐月合同类型的问题,因此最好查看此合同中未流失客户的月费和总费用分布。

DF_AUX=DataSet.query(';(Contract==";逐月&34;)and(CURN==";No";)';)STUSTGRAM_SUBPLOT(DF_AUX,DF_AUX,";MonthlyCharges";,";TotalCharges";,<;b<;未流失客户的月度合同费用分配。(A)每月费用分配";、";;(B)总费用分配";)。

从地块上看,可以说很多客户只是收取了几笔费用,主要是总费用。<;br>;在以下图表中,分析了相同的功能,但针对的是流失的客户端。

DF_AUX=DataSet.query(';(Contract==";逐月&34;)and(CURN==";Yes";)';)STUSTGRAM_SUBPLOT(DF_AUX,DF_AUX,";MonthlyCharges";,";TotalCharges";,<;b<;客户&>月合同的费用分配。(A)每月费用分配";、";;(B)总费用分配";)。

总收费也有同样的行为,但很多流失客户的月费都很高,也许变价的金额可能会导致客户离开服务。<;br>;仍然是按月签约的,现在是分析流失客户最常用的付款方式的时候了。

DF_AUX=DataSet.query((';Contract==逐月';)and(';Traffn==";是";';))DF_AUX=DF_AUX[";PaymentMethod&34;].value_Counts()bar_lot(DF_AUX,&34;<;b&>;月合同翻转客户<;/b&。,";<;i&>;付款方式<;/i>;";,";<;i&>;计数<;/i>;";)。

许多流失的客户过去常常使用电子支票、自动支付,因为银行转账或信用卡也有一些流失的客户。一个好主意可以向使用自动支付方式的客户进行促销。<;br>;最后,流失客户的任期。

DF_AUX=DataSet.query((';Contract==月度&39;)and(';FUSURN==";是";';))DF_AUX=DF_AUX[";Tenure&34;].value_Counts().head(5)bar_lot(DF_AUX,&34;<;b&>;流失客户的月度合同期限&b;/b。";,<;i&>;任期<;/i&>;";,<;i&>;计数<;/i>;";)。

大多数客户只使用了一个月的服务,似乎客户习惯于服务检查质量或不能停留的费用金额,因为这些客户每月的费用很高,总费用很小,因为客户只停留了很短的时间。

在建立PyCaret之前,将随机抽取10%大小的数据集样本,以便用看不见的数据进行预测。

PyCaret的设置使用90%的数据样本,并且只使用模块中的一个函数(`setup`)。<;br>;它可以配置多种选项,如数据预处理、功能工程等。PyCaret的简单性和高效性为模型的原型制作赢得了大量时间。<;br>;每个设置都是一个实验,对于此问题,使用以下选项:*使用Z分数对数字特征进行归一化。*使用排列重要性技术的特征选择。*剔除异常值。*基于多重共线性的特征移除。*功能呼叫变换。*忽略要素的低方差。*PCA用于降维,因为数据集有很多特征。*`MonthlyCharges`和`TotalCharges`功能的数值装箱。*列车样本占70%,测试样本占30%。

exp01=SETUP(DATA=DATA,target=";FLOWN";,SESSION_ID=RANDOM_SEED,IGNORE_FEATURES=[";CustomerID";],NUMERIC_FEATURES=[";SeniorCitizen";],Normize=True,Feature_Selection=True,Remove_Outliers=True,Remove_Multiplomlyline=True,Transform=True,Ignore_Low_Variance=True,PCA=True,bin。])。

PyCaret首先显示是否所有的特征类型都与其对应的类型相同,如果一切正常,按空白栏上的Enter键,设置完成,显示实验总结。

PyCaret上的一个很好的工具是构建多个模型并比较最好的度量!<;br>;由于目标类,模型按F1分数排序。

PyCaret建议的最佳模型是二次判别分析(QDA),F1得分在0.6左右,召回率很好,在0.7左右。<;br>;让我们坚持QDA并创建模型。

这是可能的调整基础模型和优化的指标,在这种情况下,F1分数。

有一个改进的基础模式的F1得分!现在,我们来看看调整后的模型使用了哪些超参数。

在调优的模型上,`reg_param`较高。<;br>;使用QDA的唯一问题是无法获得模型的特征重要性图,但该模型用于在EDA上获得有关数据的一些很好的见解。<;br>;PyCaret还具有制作集成的功能,对于此实现,构建了一个袋装模型。

袋装模型提高了一点F1的分数,它也可以使混合和堆叠模型与PyCaret,这两个模型都是使用调整和袋装模型创建的软方法。

虽然堆叠模型在很大程度上提高了精度,但混合后的F1仍然获得了更好的F1,并被保存为最佳模型。<;br>;此模型已保存,其ROC曲线如下所示。

测试是使用PyCaret在设置中获得的剩余30%的数据进行的,重要的是要确保模型不会过度拟合。

由于模型的一切都是正确的,现在是最后确定它符合所有数据的时候了。

剩下的10%的数据是用看不见的样本进行预测的,其中可能包括一些离群值,这就是现实世界的数据是如何工作的。<;br>;只显示Kappa分数,因为焦点是F1分数。<;br>;不需要对数据进行任何转换,PyCaret会这样做。

PyCaret允许保存所有要部署的管道实验和模型。<;br>;建议将其与实验日期一起保存。

从这里给出的结果和解释可以得出一些结论:*合同类型与流失的客户有严格的关系,月度合同的高额收费可能会导致客户离开服务。*对于模型做出的预测,基于精度和召回分数,由于F1分数试图显示这两个指标之间的平衡,精度接近54%,这意味着该模型正确预测了54%的分类客户为流失,另一方面,召回率很好,其中约80%的实际流失客户被正确预测。*必须使用有利于商业利益的指标,是否需要对流失的客户进行更正确的预测,或者获得更多这些客户的一部分?*一种可能的方法是随着数据重新采样而大幅提高结果。从使用的工具和环境来看:*Deepnote是使用Python笔记本的极好工具,设计清晰,是一个很好的变量资源管理器,可以将笔记本作为文章发布,命令终端(如GIT)等。*PyCaret令人难以置信,它大大加快了模型的构建速度,并且预处理非常有用,除了保存和部署模型的功能之外。谢谢阅读!