[ PROMPT_NODE_27370 ]
data-handling
[ SKILL_DOCUMENTATION ]
# 数据处理与预处理
## 理解生存数据
### Surv 对象
scikit-survival 中的生存数据使用具有两个字段的结构化数组表示:
- **event**: 布尔值,指示事件是否发生 (True) 或被删失 (False)
- **time**: 事件发生时间或删失时间
python
from sksurv.util import Surv
# 从单独的数组创建生存结果
event = np.array([True, False, True, False, True])
time = np.array([5.2, 10.1, 3.7, 8.9, 6.3])
y = Surv.from_arrays(event=event, time=time)
print(y.dtype) # [('event', '?'), ('time', '<f8')]
### 删失类型
**右删失**(最常见):
- 研究结束时受试者未经历事件
- 受试者失访
- 受试者退出研究
**左删失**:
- 事件在观察开始前发生
- 实践中罕见
**区间删失**:
- 事件发生在已知的某个时间区间内
- 需要专门的方法
scikit-survival 主要处理右删失数据。
## 加载数据
### 内置数据集
python
from sksurv.datasets import (
load_aids,
load_breast_cancer,
load_gbsg2,
load_veterans_lung_cancer,
load_whas500
)
# 加载数据集
X, y = load_breast_cancer()
# X 是带有特征的 pandas DataFrame
# y 是带有 'event' 和 'time' 的结构化数组
### 加载自定义数据
#### 从 Pandas DataFrame 加载
python
import pandas as pd
from sksurv.util import Surv
# 加载数据
df = pd.read_csv('survival_data.csv')
# 分离特征和结果
X = df.drop(['time', 'event'], axis=1)
y = Surv.from_dataframe('event', 'time', df)
#### 从 CSV 使用 Surv.from_arrays 加载
python
import numpy as np
import pandas as pd
from sksurv.util import Surv
# 加载数据
df = pd.read_csv('survival_data.csv')
# 创建特征矩阵
X = df.drop(['time', 'event'], axis=1)
# 创建生存结果
y = Surv.from_arrays(
event=df['event'].astype(bool),
time=df['time'].astype(float)
)
### 加载 ARFF 文件
python
from sksurv.io import loadarff
# 加载 ARFF 格式 (Weka 格式)
data = loadarff('survival_data.arff')
# 提取 X 和 y
X = data[0] # pandas DataFrame
y = data[1] # 结构化数组
## 数据预处理
### 处理分类变量
#### 方法 1: OneHotEncoder (scikit-survival)
python
from sksurv.preprocessing import OneHotEncoder
import pandas as