我正在尝试使用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
---是否要支付剩余金额?
此之后的下一步是什么?
答案 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...