预测生存分数和CLTV,了解合同离散的政策/条款

时间:2019-06-04 15:38:08

标签: python survival-analysis cox-regression lifelines scikit-survival

我正在尝试使用python预测合同和离散保单(保险中)的生存分数和LTV。我浏览了许多站点,但是我发现很多仅针对非合同(零售)的示例。
我使用了以下代码:

from lifelines import CoxPHFitter
#After all feature selection and EDA

cph_train, cph_test = train_test_split(features, test_size=0.2)

cph = CoxPHFitter()
cph.fit(cph_train, 'TIME', event_col='EVENT')
cph.print_summary()

时间TIME-是活动客户的保单生效日期与当前日期之间的天数,非活动客户的保单生效日期与退保日期之间的天数。
EVENT-是客户是否处于活动状态的指示器。

拟合模型后,我得到了0.7的一致性(我觉得还可以)。
从这里开始,我如何继续获得活跃客户的生存得分和终生价值(CLTV)? 基本上,我需要预测谁是有价值的客户,他们将长期留在公司中。

我通过浏览Cam的一些帖子和建议添加了一些代码。

censored_subjects = features.loc[features['EVENT'] == 1] #Selecting only the ACTIVE ones

unconditioned_sf = cph.predict_survival_function(censored_subjects)

conditioned_sf = unconditioned_sf.apply(lambda c: (c / c.loc[features.loc[c.name, 'TIME']]).clip_upper(1)) 

predictions_75 = qth_survival_times(.75, conditioned_sf)
predictions_50 = qth_survival_times(.50, conditioned_sf)

values = predictions_75.T.join(data[['PREAMT','TIME']])
values50 = predictions_50.T.join(data[['PREAMT','TIME']])
values['RemainingValue'] = values['PREAMT'] * (values[0.75] - values['TIME'])

那么输出表示什么:
0.5 PREAMT TIME --- 0.5列中的数字是否表示有50%的机会被关闭的持续时间?
0.75 PREAMT TIME ---类似的0.75表示有75%的机会被关闭的持续时间? RemainingValue ---是否要支付剩余金额?

此之后的下一步是什么?

1 个答案:

答案 0 :(得分:0)

  

时间在哪里-是活动客户的保单生效日期与当前日期之间的天数,非活动客户的保单生效日期与退保日期之间的天数。 EVENT-是客户是否处于活动状态的指示器。

使我明白。

  

拟合模型后,我得到了0.7(我觉得还可以)的一致性。

这对于生存模型来说是可以接受的分数?但是也可以尝试AFT models,它们的效果可能更好(也可以尝试modelling all the parameters)。


因此,接下来您需要预测的是给定的客户 的未来寿命。此应用程序上完全有some docs。注意,相同的代码也适用于AFT模型。

您可以选择预测中位数或生存曲线。如果您的目标是CLV,我认为预测生存曲线会更合适,因为您可以对不同的政策利率进行建模(对不起,我不知道正确的术语)。例如,使用文档中的代码:

times = np.arange(1000) # predict far out, since we don't want to truncate the survival curve prematurely. 
unconditioned_sf = cph.predict_survival_function(censored_subjects, times=times)

conditioned_sf = unconditioned_sf.apply(lambda c: (c / c.loc[df.loc[c.name, 'T']]).clip_upper(1))

# simple case, users pay $30 a month (and your units of survival function are "months"
CLV = (30 * conditioned_sf).sum(0)

# more complicated: they each have a different "rate"
CLV = conditioned_sf.sum(0) * rate_by_user

# and so on...