1 정의
ML 기반 생존 분석은 중도절단된 시간-사건 데이터(censored time-to-event data)를 학습 신호로 사용하면서 비선형·고차원·상호작용을 자동 추출하는 모형들의 총칭이다.
핵심은 두 요소의 결합이다:
- 생존 분석의 부분우도(partial likelihood) 또는 로그순위(log-rank) 분할 기준으로 censoring 을 손실하지 않고 처리한다
- 비모수 학습기(트리 앙상블 또는 신경망)로 공변량 효과 \(g(\mathbf{Z})\) 의 형태 가정을 풀어준다
대표 모형은 다음 세 가지다:
| 모형 | 발표 연도 | 학습기 | 손실 |
|---|---|---|---|
| Random Survival Forest (RSF) | Ishwaran et al. (2008) | 의사결정 나무 앙상블 | log-rank 분할 + Nelson-Aalen 누적위험 |
| DeepSurv | Katzman et al. (2018) | Feed-forward NN | Cox 부분우도 (식 8.3.1 변형) |
| Cox-nnet | Ching et al. (2018) | Feed-forward NN | Cox 부분우도 + L2 정규화 |
2 개념 및 원리
2.1 출발점: Cox PH 의 한계
Cox 비례위험 모형(Cox PH)은 시점 \(t\) 의 위험함수를 다음 형태로 가정한다 (Klein, 2003, Ch.8):
\[ h(t \mid \mathbf{Z}) = h_0(t) \exp(\boldsymbol{\beta}^\top \mathbf{Z}) \]
이 식은 \(\boldsymbol{\beta}^\top \mathbf{Z}\) 라는 선형 결합 을 가정한다. 즉 공변량 효과가 더해질 뿐 곱해지지 않는다는 뜻이다. 현실의 헬스케어·산업 데이터는 다음 세 지점에서 이 가정을 깬다:
- 비선형성: 나이 50세 이전과 이후의 위험 구조가 다르다
- 상호작용: “흡연 × 유전자형” 같은 이변량 효과가 본질적이다
- 고차원: 유전자 발현(2만 차원), 영상 특징(수천 차원)에서 변수 선택 자체가 문제다
이 세 문제를 풀기 위해 ML 학습기를 Cox 구조 안에 넣는 것이 modern 생존 모형의 공통 원리다.
2.2 Random Survival Forest — log-rank 로 분할되는 트리 앙상블
RSF 는 분류·회귀 트리의 분할 기준을 log-rank 통계량으로 바꾼 것이다 (Ishwaran et al., 2008).
각 노드에서 후보 분할 \((j, c)\) — 변수 \(j\) 를 임계값 \(c\) 로 좌우 분할 — 에 대해 두 그룹 간 log-rank 통계량 \(L(j,c)\) 를 계산하고, 이를 최대화하는 분할을 선택한다:
\[ (j^*, c^*) = \arg\max_{(j, c)} \, |L(j, c)| \]
리프(leaf)에 도달한 관측들의 Nelson-Aalen 누적위험 추정량을 그 리프의 예측값으로 삼고, 여러 트리의 평균으로 앙상블 누적위험 \(\hat{H}(t \mid \mathbf{Z})\) 를 만든다.
직관적으로는 “각 분할에서 두 그룹의 생존 곡선이 가장 멀어지는 변수·임계값을 고르는 트리”다. log-rank 가 censoring 을 자동 처리하므로 별도의 imputation 이 필요 없다.
2.3 DeepSurv — Cox 부분우도를 신경망에 얹기
DeepSurv 는 식 8.3.1 의 부분우도를 그대로 쓰되, \(\boldsymbol{\beta}^\top \mathbf{Z}\) 를 신경망 출력 \(g_\theta(\mathbf{Z})\) 로 대체한다 (Katzman et al., 2018):
\[ \mathcal{L}(\theta) = -\sum_{i: \delta_i = 1} \left[ g_\theta(\mathbf{Z}_i) - \log \sum_{j \in R(t_i)} \exp(g_\theta(\mathbf{Z}_j)) \right] \]
여기서 \(\delta_i\) 는 사건 발생 지표(1=사건, 0=절단), \(R(t_i)\) 는 시점 \(t_i\) 의 위험집합(risk set)이다. 손실 함수는 음의 로그 부분우도이며, 이를 미니배치 SGD 로 최소화한다.
핵심 통찰은 “Cox 부분우도는 미분 가능하다” 는 점이다. 그래서 \(g_\theta\) 자리에 어떤 미분 가능한 함수든 — MLP, ResNet, Transformer — 넣을 수 있고, autograd 가 알아서 학습한다.
2.4 Cox-nnet — DeepSurv 와 거의 동일하지만 게놈 데이터 특화
Cox-nnet 은 DeepSurv 와 구조적으로 동일한 Cox 부분우도 + 신경망이다. 차이는 다음 두 가지다 (Ching et al., 2018):
- 게놈/transcriptome 같은 고차원·소표본 환경을 가정해 L2 정규화와 dropout 을 강하게 적용한다
- 학습된 첫째 은닉층을 “유전자 모듈”로 해석하는 절차를 제공한다 (생물학적 해석성)
DeepSurv 가 일반 헬스케어 표 데이터(EHR)를 노린다면, Cox-nnet 은 omics 데이터를 노린다.
2.5 비례위험 가정은 어디 갔는가
세 모형 모두 공변량 효과의 비선형성은 풀어주지만, 시간에 따른 hazard ratio 의 일정성(PH 가정)은 그대로 유지한다. 즉 \(g_\theta(\mathbf{Z})\) 가 시간 \(t\) 에 의존하지 않는다.
PH 가정까지 깨고 싶다면 다음 확장이 있다:
- DeepHit (Lee et al., 2018) — 이산 시간 격자에서 사건별 다항 분포를 학습, competing risks 도 동시 처리
- Cox-Time (Kvamme et al., 2019) — \(g_\theta(\mathbf{Z}, t)\) 처럼 시간을 입력에 포함
- Random Survival Forest — 비모수 누적위험을 트리별로 추정하므로 PH 가정에서 자유롭다
3 왜 필요한가
기존 Cox PH 만으로 풀리지 않는 세 가지 실무 문제를 짚는다.
3.1 문제 1: 비선형 위험 — 50세 이전·이후의 다른 곡률
심혈관 질환 위험은 나이 40~50세 구간에서 거의 평탄하다가 60세 이후 급격히 상승한다. Cox PH 에서 \(\beta_{age} \cdot \text{age}\) 로 적합하면 이 비선형성을 잡지 못한다. 다항식이나 splines 으로 수동 보정할 수 있지만, 변수 수가 많아지면 어떤 변수에 어떤 스플라인을 쓸지 사람이 결정해야 한다. RSF/DeepSurv 는 이 결정을 자동화한다.
3.2 문제 2: 상호작용의 폭발 — \(p \choose 2\) 항을 손으로 못 쓴다
“흡연 × 유전자형”처럼 두 변수의 상호작용이 본질적인 헬스케어 문제는 흔하다. 변수가 100개라면 가능한 짝 상호작용은 4,950개다. Cox PH 에서 모두 후보로 넣으면 식별 불가능하고 다중공선성으로 무너진다. 신경망은 은닉층에서 상호작용을 자동으로 합성한다.
3.3 문제 3: 고차원·소표본 — \(n < p\) 인 omics 데이터
유방암 환자 200명 × 유전자 발현 20,000개 같은 데이터에서 Cox PH 를 돌리면 \(\mathbf{X}^\top \mathbf{X}\) 가 역행렬이 없다 (rank deficiency). Cox-nnet 은 dropout + L2 + 신경망 구조로 이 문제를 자동 정규화한다.
4 응용 분야
| 도메인 | 구체적 활용 | 데이터 형태 |
|---|---|---|
| 임상 종양학 | TCGA 기반 5년 생존 예측 | RNA-seq + 임상 변수 |
| 심혈관 코호트 | UK Biobank 심부전 위험 예측 | EHR 시계열 + 영상 |
| 보험 계리 | 정기보험 lapse 시점 예측 | 가입자 행동 로그 |
| 고객 이탈 | SaaS 구독 해지 시점 예측 | 사용 로그 + 결제 이력 |
| 산업 신뢰성 | 반도체 장비 고장 예측 | 센서 시계열 (PdM) |
| 추천 시스템 | 다음 구매까지의 시간 | 클릭 + 세션 로그 |
분자진단·검체 분석 분야에서는 “재감염까지의 시간”, “장비 calibration drift 까지의 시간” 같은 문제가 자연스럽게 ML survival 의 학습 신호가 된다.
5 예시 — 작은 데이터로 손계산 비교
5명의 환자 데이터를 가정하자. 시간 \(t\), 사건 발생 \(\delta\), 공변량 \(z\) (예: log gene expression):
| ID | \(t\) | \(\delta\) | \(z\) |
|---|---|---|---|
| 1 | 5 | 1 | 0.2 |
| 2 | 8 | 1 | -0.5 |
| 3 | 12 | 0 | 1.1 |
| 4 | 15 | 1 | 0.8 |
| 5 | 20 | 0 | -0.2 |
Cox PH 의 부분우도(첫 사건 시점 \(t=5\)):
\[ L_1(\beta) = \frac{\exp(\beta \cdot 0.2)}{\exp(\beta \cdot 0.2) + \exp(\beta \cdot (-0.5)) + \exp(\beta \cdot 1.1) + \exp(\beta \cdot 0.8) + \exp(\beta \cdot (-0.2))} \]
여기서 분자의 지수항이 선형 결합 \(\beta z\) 다.
DeepSurv 는 같은 식에서 \(\beta z\) 를 신경망 \(g_\theta(z)\) 로 대체한다:
\[ L_1(\theta) = \frac{\exp(g_\theta(0.2))}{\exp(g_\theta(0.2)) + \exp(g_\theta(-0.5)) + \exp(g_\theta(1.1)) + \exp(g_\theta(0.8)) + \exp(g_\theta(-0.2))} \]
차이는 단 한 곳, \(g_\theta\) 의 형태 자유도뿐이다. 손실의 구조는 동일하다.
RSF 는 같은 데이터에서 변수 \(z\) 의 임계값 후보 \(c \in \{-0.5, -0.2, 0.2, 0.8\}\) 마다 좌우 그룹의 log-rank \(|L(z, c)|\) 를 계산하고 최대인 곳을 선택한다. 분할 후 각 리프에 도달한 관측들의 Nelson-Aalen 추정량이 예측값이 된다.
6 코드 예시
6.1 Step 1: scikit-survival 로 RSF (실무 수준)
import numpy as np
from sksurv.ensemble import RandomSurvivalForest
from sksurv.datasets import load_veterans_lung_cancer
from sksurv.metrics import concordance_index_censored
# 1. 데이터 로드 — Veterans Lung Cancer (137 obs, 6 covariates)
X, y = load_veterans_lung_cancer()
# y 는 (event, time) 의 structured array
# 2. RSF 학습
rsf = RandomSurvivalForest(
n_estimators=200,
min_samples_split=10,
min_samples_leaf=5,
max_features="sqrt",
n_jobs=-1,
random_state=42,
)
rsf.fit(X.select_dtypes(include=[np.number]), y)
# 3. 예측 — 위험 점수와 누적위험 함수
risk_scores = rsf.predict(X.select_dtypes(include=[np.number]))
chf_funcs = rsf.predict_cumulative_hazard_function(
X.select_dtypes(include=[np.number])
)
# 4. C-index 평가
c_index = concordance_index_censored(
y["Status"], y["Survival_in_days"], risk_scores
)[0]
print(f"RSF C-index = {c_index:.3f}")C-index 는 두 환자 쌍의 위험 순위가 실제 사건 순서와 일치하는 비율이다. 0.5 가 무작위, 1.0 이 완벽한 순위.
6.2 Step 2: pycox 로 DeepSurv (헬스케어 DL 표준)
import torch
import torch.nn as nn
import torchtuples as tt
from pycox.models import CoxPH
from pycox.evaluation import EvalSurv
# 1. 데이터 — METABRIC 유방암 코호트
from pycox.datasets import metabric
df = metabric.read_df()
# 2. 데이터 분할 + 표준화 (생략, df_train/df_val/df_test 가정)
# ...
# 3. 신경망 정의
in_features = x_train.shape[1]
net = nn.Sequential(
nn.Linear(in_features, 32),
nn.ReLU(),
nn.BatchNorm1d(32),
nn.Dropout(0.1),
nn.Linear(32, 32),
nn.ReLU(),
nn.BatchNorm1d(32),
nn.Dropout(0.1),
nn.Linear(32, 1, bias=False), # bias 없음 — Cox baseline 흡수
)
# 4. DeepSurv 학습
model = CoxPH(net, tt.optim.Adam(0.01))
model.fit(
x_train, (t_train, e_train),
batch_size=256, epochs=100,
val_data=(x_val, (t_val, e_val)),
verbose=False,
)
# 5. baseline hazard 계산 후 생존 곡선 예측
_ = model.compute_baseline_hazards()
surv = model.predict_surv_df(x_test)
# 6. 평가 — 시간 가중 C-index 와 Brier Score
ev = EvalSurv(surv, t_test, e_test, censor_surv="km")
print(f"DeepSurv C-td = {ev.concordance_td('antolini'):.3f}")
print(f"Integrated Brier = {ev.integrated_brier_score(t_test):.3f}")해석: bias 없는 마지막 선형 층이 \(g_\theta(\mathbf{Z})\) 의 출력이다. Cox baseline \(h_0(t)\) 는 학습 후 분리해 추정한다 (Breslow 추정량).
7 Cox PH 와 ML 변형 비교
| 항목 | Cox PH | RSF | DeepSurv | Cox-Time / DeepHit |
|---|---|---|---|---|
| 비선형 효과 | X (수동 spline) | O (자동) | O (자동) | O |
| 상호작용 | X (수동 항) | O | O | O |
| 고차원 (\(n<p\)) | X (regularized Cox 필요) | O (variable importance) | O (dropout/L2) | O |
| PH 가정 | 가정함 | 가정 안 함 | 가정함 | Cox-Time/DeepHit 는 안 함 |
| 해석성 | 매우 높음 (\(\beta\), RR) | 중간 (VIMP, partial dep) | 낮음 (SHAP 필요) | 낮음 |
| 소표본 안정성 | 매우 좋음 | 좋음 | 보통 (regularize 필요) | 보통 |
| Competing risks | Fine-Gray 별도 | RSF-CR 변형 | 별도 모형 | DeepHit 가 동시 처리 |
선택 가이드:
- 표본 < 500, 변수 < 20 — Cox PH (해석 우선)
- 표본 1000~10,000, 비선형·상호작용 의심 — RSF 먼저, DeepSurv 비교
- 표본 > 10,000 또는 omics 고차원 — DeepSurv / Cox-nnet
- competing risks, time-varying effect — DeepHit / Cox-Time
8 한계와 함정
세 모형을 무비판적으로 쓰면 다음 함정에 빠진다.
- C-index 만으로 평가하지 말 것 — calibration 이 깨질 수 있다. Brier Score, calibration plot 도 확인한다
- PH 가정 위반을 자동 해결하지 않는다 — DeepSurv 도 PH 를 유지한다. crossing hazards 가 의심되면 DeepHit/Cox-Time 으로 간다
- 해석 가능성 손실 — \(\beta\) 의 hazard ratio 직관이 사라진다. SHAP, partial dependence, integrated gradients 같은 사후 설명을 결합한다
- 소표본에서 신경망은 과적합 — n < 1000 이면 RSF 가 안전하다. Cox PH 가 underfit 이면 spline 추가가 먼저다
- 임상 검증 — 학술 데이터셋(METABRIC, SUPPORT)에서 SOTA 라도 외부 코호트로 검증하기 전에는 배포하지 않는다
9 관련 주제
선행 지식
- Ch.8 — Cox Proportional Hazards Regression
- § 8.3~8.4 — Partial Likelihood + Ties
- § 4.1~4.2 — KM · Nelson-Aalen Estimators
- § 7.1~7.2 — One-Sample Log-Rank Test
후속 주제
- DeepHit — Competing Risks 동시 처리 (placeholder)
- Cox-Time — Time-Varying Effect 신경망 (placeholder)
- Survival Trees vs Random Survival Forest 상세 비교 (placeholder)
관련 개념
- Random Forest 일반론 — RSF 의 모분류 분류·회귀 RF
- Cross-Entropy 와 부분우도의 관계 — DeepSurv 손실의 구조
10 참고문헌
- Ishwaran, H., Kogalur, U. B., Blackstone, E. H., & Lauer, M. S. (2008). Random survival forests. Annals of Applied Statistics, 2(3), 841–860.
- Katzman, J. L., Shaham, U., Cloninger, A., Bates, J., Jiang, T., & Kluger, Y. (2018). DeepSurv: personalized treatment recommender system using a Cox proportional hazards deep neural network. BMC Medical Research Methodology, 18(1), 24.
- Ching, T., Zhu, X., & Garmire, L. X. (2018). Cox-nnet: An artificial neural network method for prognosis prediction of high-throughput omics data. PLOS Computational Biology, 14(4), e1006076.
- Lee, C., Zame, W. R., Yoon, J., & van der Schaar, M. (2018). DeepHit: A deep learning approach to survival analysis with competing risks. AAAI.
- Kvamme, H., Borgan, Ø., & Scheel, I. (2019). Time-to-event prediction with neural networks and Cox regression. JMLR, 20(129), 1–30.
- Klein, J. P., & Moeschberger, M. L. (2003). Survival Analysis: Techniques for Censored and Truncated Data (2nd ed.). Springer.