春江暮客

春江暮客的个人学习分享网站

c-index及其在生存分析中的应用

2021-12-23 技术

一致性指数(concordance index)或者说 c-index,是用于评估预测模型排序能力的参数。它在生存分析里尤其常见,比如癌症预后预测、风险分层、随访结局排序等任务里,常用它来判断模型能否把“更早发生事件的人”和“更晚发生事件的人”排对顺序。

在 Python 中,可以使用 lifelines 里的 concordance_index 函数进行计算。本文用几个非常直观的小例子说明它到底在衡量什么。

安装与准备

先安装 lifelines

pip install lifelines

然后再运行下面的 Python 示例。

c-index 最核心的理解

c-index 关心的重点不是预测值和真实值“差了多少”,而是模型有没有把样本的相对顺序排对。

一个非常粗略但实用的理解方式是:

  1. 1.0 表示排序完全正确
  2. 0.5 接近随机猜测
  3. 0.0 表示顺序几乎完全反了

所以它更像“排序质量指标”,而不是“误差大小指标”。

假设实际应用中有个癌症研究,其中6个患者的生存期情况分别为1个月,6个月,12个月,2年,3年,5年,如果预测结果为1个月,6个月,12个月,2年,3年,5年.那么该预测完全正确,c-index最高,为1,计算代码如下:

# 首先导入必要的一些包

import pandas as pd

# 导入计算的函数concordance_index
from lifelines.utils import concordance_index

# 数据dataframe设置

df = pd.DataFrame({"name":["张三","李四","王五","赵二","麻子","someone"],"survive":[1,6,12,24,36,60],"predicted":[1,6,12,24,36,60]})
c_index = concordance_index(df.survive,df.predicted)

print(df)

print(c_index)

#       name  survive  predicted
# 0       张三        1          1
# 1       李四        6          6
# 2       王五       12         12
# 3       赵二       24         24
# 4       麻子       36         36
# 5  someone       60         60

# In [10]: c_index
# Out[10]: 1.0

事实上,c_index是忽略真实数值的,就像spearman一样是非参数检验方法,下面我们分别改变具体数值而保持顺序不变,结果仍然一样,c_index为1.

例子1:

df = pd.DataFrame({"name":["张三","李四","王五","赵二","麻子"],"survive":[1,6,12,24,36,60],"predicted":[1,1.1,1.2,2.4,3.6,6]})
c_index = concordance_index(df.survive,df.predicted)

print(df)

print(c_index)
#       name  survive  predicted
# 0       张三        1        1.0
# 1       李四        6        1.1
# 2       王五       12        1.2
# 3       赵二       24        2.4
# 4       麻子       36        3.6
# 5  someone       60        6.0
# 1.0

例子2:

df = pd.DataFrame({"name":["张三","李四","王五","赵二","麻子"],"survive":[1,6,12,24,36,60],"predicted":[1,60,120,240,360,600]})
c_index = concordance_index(df.survive,df.predicted)

print(df)

print(c_index)
#      name  survive  predicted
# 0       张三        1        1
# 1       李四        6        60
# 2       王五       12        120
# 3       赵二       24        240
# 4       麻子       36        360
# 5  someone       60        600
# 1.0

而如果顺序改变了的话,将会极大的造成c_index的变化.比如:

例子1:

df = pd.DataFrame({"name":["张三","李四","王五","赵二","麻子"],"survive":[1,6,12,24,36,60],"predicted":[1,12,6,36,24,60]})
c_index = concordance_index(df.survive,df.predicted)

print(df)

print(c_index)
#       name  survive  predicted
# 0       张三        1          1
# 1       李四        6         12
# 2       王五       12          6
# 3       赵二       24         36
# 4       麻子       36         24
# 5  someone       60         60

# In [5]: c_index
# Out[5]: 0.8666666666666667

例子2:

df = pd.DataFrame({"name":["张三","李四","王五","赵二","麻子","someone"],"survive":[1,6,12,24,36,60],"predicted":[60,36,24,12,6,1]})
c_index = concordance_index(df.survive,df.predicted)
print(df)
print(c_index)

iOut[3]: 
#      name  survive  predicted
# 0       张三        1         60
# 1       李四        6         36
# 2       王五       12         24
# 3       赵二       24         12
# 4       麻子       36          6
# 5  someone       60          1

# In [4]: c_index
# Out[4]: 0.0

总结

一致性指数也即c_index在生存期预测方面可以用于评估算法性能,其对于预测的排列顺序敏感,而对具体数值不敏感.

如果你在做生存分析建模,建议把 c-index 和校准、风险分层可视化等结果一起看,而不要只盯着一个指标。

延伸阅读

友情链接

其它