1

我试图了解如何计算我的数据集中每个 id 的预期时间。我有一个看起来像 Dataframe 形状(500,4)的数据集:

ids var1       var2  churn     time
0   1.738434    324    0       21.0
1   1.541176    12     0       4.0
2   2.049281    753    1       5.0
3   1.929860    563    0       16.0
4   1.595027    22     0       5.0
... ... ... ... ...

让我们使用每个 ID的生存函数lifelines来计算期望值。predict_expectationmedian

第 1 部分:计算预期值

cph = CoxPHFitter()
cph.fit(data,"time","churn")

censored_df = data[data["churn"]==0]

cph.predict_expectation(censored_df) #conditional_after=censored_df["time"])
#or
cph.predict_median(censored_df) #conditional_after=censored_df["time"])

对于 scikit-survival,使用predict_survival_function()

一致性指数 = 0.82

第 2 部分:将结果与实际值进行比较

所以现在我使用两种方法创建了一个表:(predict_expectation()“预期”列)和predict_median(“中值”列),如下所示:

对于 scikit-survival,它只能通过取中位数来计算 (请不要说我知道对于生命线中的其他算法\scikit-learn 可能会有所不同,但要关注这个想法)


ids churn time  expected    diff_expectation median diff_median
0   0   21.0    21.526222   0.526222          8.0     -13.0
1   0   4.0     21.819911   17.819911         13.0     9.0
3   0   16.0    23.189344   7.189344          9.0     -7.0
4   0   5.0     22.090598   17.090598         12.0     7.0
6   0   8.0     21.545022   13.545022         10.0     2.0
... ... ... ... ... ... ...

带有“diff”的列表示各个预测列与“time”之间的差异

问题

  1. 为什么预期的时间如此之差?

  2. 方法有什么问题吗?我应该预测整个数据(审查+未经审查)还是只使用审查数据?(我已经尝试了三种可能的排列,只有审查,只有未经审查,两者都有,它仍然关闭)。我的理解是,如果每个 ID 的生存曲线收敛到 0(未经审查的数据),您可以使用曲线下面积计算,如果被审查,则需要使用生存曲线的中位数。(记住这一点,我已经完成了上述计算)

  3. 我怎样才能获得更接近的估计?

  4. 如果运行实验并仅在未经审查的数据上拟合模型,然后在相同的未经审查的数据上进行预测,你应该得到一个非常接近的估计,对吗?好吧,事实并非如此。您应该能够通过从预期中位数中取平均值来检查这一点,它应该与实际值的中位数相似,对吧?或者您可以检查“差异”列的平均值,看看它是否至少平均为 0,但事实并非如此,这表明模型中存在一些潜在的偏差

  5. 为什么predict_expectation输出与 的不同predict_median?哪个更推荐使用?

这种现象发生在任何数据集上,您可以尝试使用该from lifelines.datasets import load_leukemia数据集复制此示例,即使您的一致性指数为 0.9,这种情况仍然会发生。

这是我发现的一些资源,可以解释这一点,但我并不完全理解,如果有人可以将其分解得更多,那就太好了。

来源

  1. https://github.com/sebp/scikit-survival/issues/94
  2. https://github.com/sebp/scikit-survival/issues/190
  3. https://scikit-survival.readthedocs.io/en/latest/user_guide/understanding_predictions.html
  4. https://lifelines.readthedocs.io/en/latest/fitters/regression/CoxPHFitter.html#lifelines.fitters.coxph_fitter.CoxPHFitter.predict_expectation

你可以在这里找到一个完全编码的例子:https ://github.com/felipe0216/survival_examples/blob/main/predict_expectation_scikit.py

4

0 回答 0