valueError:y 必须是结构化数组,第一个字段是二进制类事件指示符,第二个字段是事件/审查的时间

Col*_*ole 5 python arrays numpy

看来我的代码与 scikit-survival 文档的形式相同。

data_y = df[['sensored', 'sensored_2']].to_numpy()
data_x = df.drop(['sensored', 'sensored_2'], axis = 1)
data_y
array([[True, 481],
   [True, 424],
   [True, 519],
   ...,
   [True, 13],
   [True, 96],
   [True, 6]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

根据 scikit-survial 文档,该数组是在加载时从数据集创建的。我正在尝试从数据帧创建数组,但当我尝试将数组适合模型时,标题中仍然出现错误。

sksurv.linear_model import CoxPHSurvivalAnalysis
estimator = CoxPHSurvivalAnalysis()
estimator.fit(df_dummy_3, data_y)
ValueError: y must be a structured array with the first field being a binary 
class event indicator and the second field the time of the event/censoring
Run Code Online (Sandbox Code Playgroud)

文档:

from sksurv.datasets import load_veterans_lung_cancer

data_x, data_y = load_veterans_lung_cancer()
data_y
array([( True,  72.), ( True, 411.), ( True, 228.), ( True, 126.),
       ( True, 118.), ( True,  10.), ( True,  82.), ( True, 110.),
       ( True, 314.), (False, 100.), ( True,  42.), ( True,   8.),
       ( True, 144.), (False,  25.), ( True,  11.), ( True,  30.),
       ( True, 384.), ( True,   4.), ( True,  54.), ( True,  13.),
       (False, 123.), (False,  97.), ( True, 153.), ( True,  59.),
       ( True, 117.), ( True,  16.), ( True, 151.), ( True,  22.),
       ( True,  56.), ( True,  21.), ( True,  18.), ( True, 139.),
       ( True,  20.), ( True,  31.), ( True,  52.), ( True, 287.),
       ( True,  18.), ( True,  51.), ( True, 122.), ( True,  27.),
       ( True,  54.), ( True,   7.), ( True,  63.), ( True, 392.),
       ( True,  10.), ( True,   8.), ( True,  92.), ( True,  35.),
       ( True, 117.), ( True, 132.), ( True,  12.), ( True, 162.),
       ( True,   3.), ( True,  95.), ( True, 177.), ( True, 162.),
       ( True, 216.), ( True, 553.), ( True, 278.), ( True,  12.),
       ( True, 260.), ( True, 200.), ( True, 156.), (False, 182.),
       ( True, 143.), ( True, 105.), ( True, 103.), ( True, 250.),
       ( True, 100.), ( True, 999.), ( True, 112.), (False,  87.),
       (False, 231.), ( True, 242.), ( True, 991.), ( True, 111.),
       ( True,   1.), ( True, 587.), ( True, 389.), ( True,  33.),
       ( True,  25.), ( True, 357.), ( True, 467.), ( True, 201.),
       ( True,   1.), ( True,  30.), ( True,  44.), ( True, 283.),
       ( True,  15.), ( True,  25.), (False, 103.), ( True,  21.),
       ( True,  13.), ( True,  87.), ( True,   2.), ( True,  20.),
       ( True,   7.), ( True,  24.), ( True,  99.), ( True,   8.),
       ( True,  99.), ( True,  61.), ( True,  25.), ( True,  95.),
       ( True,  80.), ( True,  51.), ( True,  29.), ( True,  24.),
       ( True,  18.), (False,  83.), ( True,  31.), ( True,  51.),
       ( True,  90.), ( True,  52.), ( True,  73.), ( True,   8.),
       ( True,  36.), ( True,  48.), ( True,   7.), ( True, 140.),
       ( True, 186.), ( True,  84.), ( True,  19.), ( True,  45.),
       ( True,  80.), ( True,  52.), ( True, 164.), ( True,  19.),
       ( True,  53.), ( True,  15.), ( True,  43.), ( True, 340.),
       ( True, 133.), ( True, 111.), ( True, 231.), ( True, 378.),
       ( True,  49.)],
      dtype=[('Status', '?'), ('Survival_in_days', '<f8')])
Run Code Online (Sandbox Code Playgroud)

我一直在尝试更改上面数组的数据类型,但没有成功。任何帮助将不胜感激。

小智 4

fit方法期望y数据是结构化数组。在我们的例子中,这是一个元组数组,其中第一个元素是状态,第二个元素是生存天数。

为了将数据采用 fit 方法期望的格式,我们需要首先将数组的元素从列表(例如 [True, 424])转换为元组(例如 (True, 424))。之后,我们可以将元组分组到结构化数组中。下面我将展示一个例子:

假设我们有以下数据框:

df = pd.DataFrame([[True, 123.],[True, 481.], [True, 424.], [True, 519.]], columns=['sensored', 'sensored_2'])
Run Code Online (Sandbox Code Playgroud)

我们得到 y 就像你一样:

data_y = df[['sensored', 'sensored_2']].to_numpy()
data_y
array([[True, 123.0],
   [True, 481.0],
   [True, 424.0],
   [True, 519.0]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

将 data_y 按照我们期望的格式放置的一种方法是使用其元素创建一个元组列表,然后创建一个结构化数组:

#List of tuples
aux = [(e1,e2) for e1,e2 in data_y]

#Structured array
new_data_y = np.array(aux, dtype=[('Status', '?'), ('Survival_in_days', '<f8')])
new_data_y
array([( True, 123.), ( True, 481.), ( True, 424.), ( True, 519.)],
  dtype=[('Status', '?'), ('Survival_in_days', '<f8')])
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该数据来拟合您的模型:

from sksurv.linear_model import CoxPHSurvivalAnalysis
estimator = CoxPHSurvivalAnalysis()
estimator.fit(df_dummy, new_data_y)
Run Code Online (Sandbox Code Playgroud)