2

我正在尝试预测 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 - 是 ACTIVE 客户的保单生效日期和当前日期之间的天数,以及非 ACTIVE 客户的保单生效日期和退保日期之间的天数。
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--- 是要支付的剩余金额吗?

下一步是什么?

4

1 回答 1

3

其中 TIME - 是 ACTIVE 客户的保单生效日期和当前日期之间的天数,以及非 ACTIVE 客户的保单生效日期和退保日期之间的天数。EVENT - 是客户是否活跃的指标。

我感觉合理。

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

这是生存模型的可接受分数但也可以尝试AFT 模型,这些可能会表现更好(也可以尝试对所有参数进行建模)。


因此,您接下来需要做的是预测客户的未来生命周期,因为他们已经存活了t个时期。有一些关于这个应用程序的文档。请注意,相同的代码也适用于 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...
于 2019-06-04T16:45:28.123 回答