龙空技术网

Python实战|利用生存分析预测用户流失周期(二)

数据万花筒 145

前言:

目前姐妹们对“pythoncox”可能比较关怀,大家都想要学习一些“pythoncox”的相关资讯。那么小编也在网络上收集了一些有关“pythoncox””的相关内容,希望咱们能喜欢,我们一起来了解一下吧!

点击上方蓝字关注我们

利用生存分析预测用户流失周期

上篇

1.数据基本情况探索

2.数据来源及预处理

3.数据相关性探索

下篇

1.Cox风险比例模型建模

2.Cox风险比例模型效果评估

3.Cox风险比例模型预测流失用户

4.改善运营策略,防止用户流失

完整代码已经汇总到知识星球,可以按需获取!

Cox风险比例模型是用户流失分析中较为常用的方法,该模型不仅可以预测用户是否会流失,还能预测用户何时流失,下面一起来看看Cox风险比例模型如何预测用户流失。

Cox风险比例模型预测流失用户

经过上述一系列的铺垫,终于进入了Cox风险比例模型。首先,我们通过sklearn的train_test_split函数将数据集按照8:2的便利分为训练集和测试集;其次,利用lifelines包中的CoxPHFitter函数实现数据拟合,如下代码是Cox风险比例模型建模的过程。

fromsklearn.model_selection import train_test_splittrain_data,test_data = train_test_split(data, test_size=0.2)fromlifelines import CoxPHFitter formula= 'MultipleLines_No+ `MultipleLines_No phone service`+ MultipleLines_Yes+InternetService_DSL+ `InternetService_Fiber optic`+ InternetService_No+ OnlineSecurity_No+`OnlineSecurity_No internet service`+ OnlineSecurity_Yes+`Contract_Month-to-month`+ `Contract_One year`+ `Contract_Two year`+OnlineBackup_No+ `OnlineBackup_No internet service`+ OnlineBackup_Yes+DeviceProtection_No+ `DeviceProtection_No internet service`+DeviceProtection_Yes+ TechSupport_No+ `TechSupport_No internet service`+TechSupport_Yes+ StreamingTV_No+ `StreamingTV_No internet service`+StreamingTV_Yes+ StreamingMovies_No+ `StreamingMovies_No internet service`+StreamingMovies_Yes+ `PaymentMethod_Bank transfer (automatic)`+`PaymentMethod_Credit card (automatic)`+ `PaymentMethod_Electronic check`+`PaymentMethod_Mailed check`+ gender+ Partner+ Dependents+ PhoneService+PaperlessBilling+ MonthlyCharges+ TotalCharges'model =CoxPHFitter(penalizer=0.01, l1_ratio=0)model =model.fit(train_data.drop("customerID",axis=1), 'tenure',event_col='Churn',formula=formula)model.print_summary()

模型的汇总信息如下所示,生存模型中我们输入的生存时间列为'tenure',观察的事件列为'Churn',代表用户是否流失。在训练集中一共有5634个样本,其中观察到1478个流失事件。

model                                       lifelines.CoxPHFitterdurationcol                                       'tenure'eventcol                                           'Churn'penalizer                                           0.01l1 ratio                                               0baselineestimation                                  breslownumberof observations                               5634numberof events observed                            1487partiallog-likelihood                             -9985.37

模型的效果相关的指标,包括了一致性指数(Concordance Index)、赤池信息量准则(Akaike information criterion)以及似然比检验(Likelihood ratio test)等等指标。一致性指数最大值为1,此处生存分析模型的一致性指数高达93%,说明Cox风险比例模型效果还是不错的。

Concordance                                    0.93PartialAIC                                     20046.74log-likelihoodratio test                       4270.54 on 38 df-log2(p)of ll-ratio test                       inf

部分特征的模型系数如下图所示,如果系数是正的,那么该特征更容易是客户流失;如果是负的,那么拥有该特征客户则不太容易流失。模型还给出了特征的显著性。从分析结果来看,签署两年合同,即‘Contract_Two year’特征对于用户的留存是具有积极正向作用的,且在95%的置信度下是具有显著性的,这个分析结果和之前相关分析的结果是一致的。除此之外,‘同伴’即‘Partner’这个特征对用户留存也是具有积极的影响,同样在95%的置信度下也是显著的。

Cox风险比例模型效果评估

(1)一致性指数

Cox风险比例模型的评判标准是一致性指数(Concordance Index),该指标是针对模型内不一致性的评估。对于Cox风险比例模型的一致性可以这样理解,如果某个特征的风险增加了,那么具有该特征的观察结果风

险会高。如果Cox回归模型满足上述原则,那么模型一致性会上升;如果不是,一致性会下降。如下代码绘制了Cox风险比例模型风险比例。

plt.figure(figsize= (8,10))model.plot(hazard_ratios=True)plt.xlabel('HazardRatios (95% CI)')

Cox风险比例模型的一致性趋势如图1所示,分析结果显示该模型满足一致性原则。

图 1 Cox比例风险模型的一致性检验

最后,输出Cox模型的一致性指数,实现过程如下代码所示。

from lifelines.utils import concordance_indexC_index =concordance_index(train_data['tenure'],-model.predict_partial_hazard(train_data.drop('customerID',axis=1)),train_data['Churn'])print('The concordance of the Cox model on the testsubsample is: ', round(C_index*100),'%') The concordance of the Cox model on the testsubsample is:  93 %

(2)校准曲线(Calibration )

校准曲线是使用连续数据离散化的方法判断模型的预测概率是否接近于真是概率。理想情况下,校准曲线是一条对角线,即预测概率等于真是概率。Cox风险比例模型的校准曲线可以通过如下代码实现。

from sklearn.calibration import calibration_curveplt.figure(figsize=(10, 10))ax1 = plt.subplot2grid((3, 1), (0, 0), rowspan=2)ax1.plot([0, 1], [0, 1], "k:",label="Perfectly calibrated")probs =1-np.array(model.predict_survival_function(test_data).loc[13]) actual = test_data['Churn']fraction_of_positives, mean_predicted_value =calibration_curve(actual, probs, n_bins=10, normalize=False) ax1.plot(mean_predicted_value,fraction_of_positives, "s-", label="%s" %("CoxPH",))ax1.set_ylabel("Fraction of positives")ax1.set_ylim([-0.05, 1.05])ax1.legend(loc="lower right")ax1.set_title('Calibration plots (reliabilitycurve)')

如图2所示,Cox风险比例模型的校准曲线接近对角线,但在曲线底端高估了用户的留存概率,即低估了流失率;而在曲线的上端则低估了用户的留存概率,即高估了流失率。

图2 Cox风险比例模型的校准曲线

剩余内容

3.Cox风险比例模型预测流失用户

4.改善运营策略,防止用户流失

标签: #pythoncox