2026-1학기/project

fda) 새 데이터 실험(클로드 유료4/13~, 시행착오)

mo_o 2026. 4. 13. 21:37

┌─────────────────────────────────┐
│  구조모델 (외부데이터)           │
│  input : FP + assay + histology │
│  train/val/test → drug split    │
│  output: FDA 예측 확률 P_struct │
└────────────┬────────────────────┘
             │
┌────────────▼────────────────────┐
│  실험모델 (내부데이터 ~2천행)    │
│  input : 실험 feature           │
│  train/val/test → drug split    │
│  output: FDA 예측 확률 P_exp    │
└────────────┬────────────────────┘
             │
┌────────────▼────────────────────┐
│  퓨전/메타모델 (Late Fusion)     │
│  input : P_struct + P_exp       │
│  models: Logistic / GBM /       │
│          가중합 / 단순평균       │
│  output: 최종 FDA 승인 예측     │
└─────────────────────────────────┘

지금  → 내부데이터 전처리 (10분)
다음  → 구조모델 학습 XGBoost (빠름)
다음  → 실험모델 학습 XGBoost
마지막 → 퓨전모델 + 성능 비교표

 

Train: 493,344행  FDA=1: 74,301 (15.1%)
Val  :  70,478행  FDA=1: 10,614 (15.1%)
Test : 140,956행  FDA=1: 21,229 (15.1%)
불균형 비율 1:5.6 → 모델 학습 시 class_weight 필요


 

핵심 문제: Leakage 방지

구조모델 Test 약물 = Erlotinib, Paclitaxel ...
실험모델 Train에 같은 약물 있으면 → 퓨전 시 leakage

 

해결책: 약물 기준으로 동일하게 Split

전체 약물 목록
    ↓ drug-based split (한 번만)
Train 약물 70% / Val 약물 10% / Test 약물 20%
         ↓                              ↓
  구조모델 Train            구조모델 Test
  실험모델 Train            실험모델 Test
         ↓                              ↓
      퓨전 Train                  퓨전 Test

 

- 퓨전 설계:

Test 셋 (공통 약물 기준)
  구조모델 → P_struct (확률값)
  실험모델 → P_exp   (확률값)
       ↓
  메타모델 input: [P_struct, P_exp]
  모델: Logistic / GBM / 가중합
       ↓
  최종 FDA 예측 성능 (AUC, F1)

 

- 내부데이터: fda 전처리

데이터 해석:

  • FDA=1: 1,621행 / FDA=0: 18행 / NaN: 360행
  • NaN 약물 중 sorafenib, erlotinib, paclitaxel 등은 실제 FDA 승인약물인데 캐시 미스
  • 수동으로 FDA=1 처리 필요

내부데이터:

  • max_wt_loss_num 전부 NaN → 원본 컬럼이 문자열("nt" 등)로 되어있어서
  • Feature 10개로 학습 가능
  • FDA 분포: Train 37.6% / Val 23.8% / Test 51.5% → 불균형 있지만 사용 가능

max_wt_loss는 제외하고 진행합니다. (전부 NaN)

공통 drug_split_map 기준으로 나눴는데
구조모델: 약물당 수백~수천 행 (cell line × 농도)
실험모델: 약물당 수 행 (실험 몇 번)

→ 같은 약물이 train/val/test에 배정됐어도
  행 수 비율이 달라짐

 

더 중요한것: 

퓨전할 때 필요한 건:
  Test 셋에서 같은 약물에 대해
  구조모델 예측값 + 실험모델 예측값이 같이 있어야 함

지금 구조모델 Test 약물 146개
실험모델 Test 약물 중 겹치는 게 몇 개인지 확인 필요


구조모델 (외부데이터)
  FP(2048) + 물리화학(7) + assay(2) + histology(1) → FDA 예측

실험모델 (내부데이터)
  실험 feature(24) → FDA 예측

 

태스크 & 설계 원칙

목표: FDA 승인 예측 (binary classification)

데이터 누수 방지 규칙:

drug_split_map.csv 기준 (한 번만 정의)
    ↓ 동일하게 적용
구조모델 train/val/test  ←── 같은 약물 기준
실험모델 train/val/test  ←── 같은 약물 기준
퓨전모델 test            ←── 겹치는 15개 약물만 사용

절대 규칙:

  • Train 약물 ≠ Val 약물 ≠ Test 약물
  • 퓨전 test는 두 모델 공통 약물만

현재까지 데이터 현황

Breast / Colon 암종에서의 FDA 승인 예측

구조모델실험모델
전체 704,778행 896행
약물 수 682개 111개
Train 476,015행 / 508약물 739행
Val 74,373행 / 73약물 21행
Test 154,390행 / 146약물 136행
퓨전 가능 15개 약물 공통  
Feature FP(2048)+물화(7)+assay(2)+hist(1) 실험(10개)
Target FDA_APPROVED FDA_APPROVED

태스크 정의 (최종)

Breast / Colon 암종에서의 FDA 승인 예측


논리적으로 빠진 점 / 보완할 점

1. 데이터 측면

구조모델 HISTOLOGY_ENC: 0=breast, 1=colon
→ 암종별 성능 분리 분석 필요
  (breast만 AUC, colon만 AUC 따로 봐야 함)

실험모델 Val: 21행
→ 너무 적어서 검증 신뢰도 낮음
  발표 시 한계점으로 언급 필요

2. 퓨전 모델 측면

퓨전 가능 약물 15개만 겹침
→ 퓨전 test set이 너무 작음
→ 해결책: 구조모델 예측값을 실험모델 없는
  약물에도 적용 (단방향 퓨전)

퓨전 방식 미정:
  - 단순 평균: (P_struct + P_exp) / 2
  - 가중 평균: w1*P_struct + w2*P_exp
  - 메타모델: [P_struct, P_exp] → Logistic/GBM
  → 셋 다 구현하고 비교 필요

3. 신약개발 일반화 측면

① 시간적 누수 미고려
   → 신약은 "미래 약물" 예측이므로
     출시연도 기준 temporal split이 더 현실적

② 약물 구조 유사성 누수
   → 같은 계열 약물(erlotinib/gefitinib)이
     train/test에 나뉘면 너무 쉬운 문제
     → Tanimoto similarity 기반 split 고려

③ 암종 특이성
   → breast FDA 승인 ≠ colon FDA 승인
     같은 약물이어도 암종마다 다름
     → 현재 데이터에 "약물+암종" 조합으로
       label이 정의되어 있는지 확인 필요

④ 외부 검증 데이터 없음
   → 완전히 새로운 약물로 검증 못 함
   → 발표 한계점으로 언급 필요

⑤ Class imbalance
   → 구조모델 1:5.6 불균형
   → SMOTE / class_weight 적용 필요
   → 현재 미적용 상태

4. 모델 측면

구조모델에 cell line 정보 미활용
→ 같은 약물도 cell line마다 반응 다름
→ CCLE gene expression 추가하면 성능 향상 가능
  (시간 없으면 발표 future work으로)

실험모델 feature 부족
→ 현재 10개 feature만 사용
→ max_wt_loss 전부 NaN으로 제외됨
→ 핵심 반응 지표가 빠진 상태

1. GDSC (18,798행) + physchem 조인
2. CTRP (685,980행) + FP + physchem 조인
3. 통합 (~704,778행)
4. 물리화학 7개 정규화
5. drug_split_map 기준으로 drug-based split
6. train/val/test.csv 저장
   - feature: FP(2048) + 물화(7) + assay(2) + hist(1) = 2,058개
   - 메타: DRUG_ID, SOURCE 포함

기대 결과:

Train: ~476,000행  FDA=1 약 15%
Val  : ~74,000행   FDA=1 약 15%  (이전과 달리 균형 맞아야 함)
Test : ~154,000행  FDA=1 약 15%

CTRP 수정: large_intestine=1(colon), breast=0 
GDSC: 18,798행 정상 (중복 아님, drug_map merge에서 182약물로 늘어난 것)
GDSC HISTOLOGY_ENC: breast(0)=9,867 / colon(1)=8,931 

암종 분포 수정됨 ✅
  전체: breast 320,978 / colon 401,620 (거의 균형)
  Train: breast 211,892 / colon 265,127
  Val  : breast  35,192 / colon  44,193
  Test : breast  73,894 / colon  92,300

FDA 분포:
  전체 label: 0: 607,305 / 1: 115,293 → 불균형 1:5.3
  Train 14.1% / Val 18.2% / Test 20.2%
  → Val/Test FDA=1 비율이 Train보다 높음
  → class_weight 적용 필요

GDSC 중복 여전히 있음:
  gdsc_processed: 18,798행인데
  df_g: 36,618행 (2배)
  → drug_map merge 시 DRUG_ID 중복 발생
  → 모델 학습엔 큰 영향 없지만 수정 권장

 

전처리 완료 요약:

구조모델실험모델
Train 466,256행 / 426약물 739행
Val 77,564행 / 63약물 21행
Test 160,958행 / 135약물 136행
Feature FP(2048)+물화(7)+assay(2)+hist(1)=2,058 실험(10개)
퓨전 가능 Test 공통 약물 15개  

학습: 지피유

python -c "import torch; print('버전:', torch.__version__); print('CUDA:', torch.cuda.is_available()); print('GPU:', torch.cuda.get_device_name(0))"

GPU 4개(RTX A6000 49GB)가 있는데 PyTorch에서 못 찾고 있네요. CUDA는 있는데 PyTorch가 CPU 버전으로 설치된 겁니다.

fda_env) user1@oem-System-Product-Name:/data1/workspace$ python -c "import torch; print('버전:', torch.__version__); print('CUDA:', torch.cuda.is_available()); print('GPU:', torch.cuda.get_device_name(0))"
버전: 2.5.1+cu121
CUDA: True
GPU: NVIDIA RTX A6000

 

우리태스크

1. Drug-based split → 데이터 누수 방지
2. 외부(대규모) + 내부(소규모) 퓨전 설계
3. FP + 물리화학 + assay + histology 멀티피처
4. breast/colon 암종 특화
5. class_weight 불균형 처리

 

부족한 점: 

1. 실제 마우스 실험 데이터(내부) + 공개 DB(외부) 퓨전
   → 기존 논문에 없는 설계

2. breast/colon 암종 특화
   → 범용 모델보다 임상적으로 의미있음

3. Late fusion으로 두 모달리티 결합
   → 신약 후보 스크리닝에 실용적

 

- 스레드홀드

Recall 중시 (민감도) → FDA 승인 약물 놓치면 안됨
Precision 중시       → 비용 아끼려면 false positive 줄여야

→ 임상 목적에 따라 threshold 조정은 의미있음
  하지만 AUC 자체를 높이는 건 아님 → 맞는 말

현재 AUC 0.66에 대해

신약개발 태스크가 까다로운 건 맞지만, 지금 낮은 이유는 태스크 난이도보다 설계 문제가 더 큽니다:

1. Cell line genomic feature 없음
   → 같은 약물도 BRCA mutation 있는 cell line vs 없는 cell line
     반응이 완전히 다름
   → 현재는 drug feature만으로 예측
   → 논문들은 gene expression 978개 추가시 AUC 0.85+ 달성

2. CTRP가 685,980행으로 GDSC(18,798)를 압도
   → CTRP 패턴에 과적합
   → 두 데이터셋 특성 차이가 있음

3. Drug-based split이 엄격해서 낮게 나오는 것도 있음
   → 랜덤 split이면 AUC 0.9+ 나오는 게 일반적
   → 이건 올바른 설계의 결과 (낮아도 더 신뢰 가능)

발표에서 주장할 수 있는 것

"Drug-based split으로 실제 신약(미지 약물) 예측에
 가까운 평가를 했고, AUC 0.67은 랜덤 split 대비
 보수적이지만 현실적인 수치"

"Cell line genomic feature 추가 시
 성능 향상 여지 있음 (future work)"

"퓨전 모델에서 실험 데이터 결합 시
 성능 개선 기대"

논문 대비 추가로 빠진 것

데이터 관점:

① TCGA 임상 데이터 미활용
   → 실제 환자 반응 데이터
   → cell line → patient 간극 줄일 수 있음

② Drug combination 미고려
   → 현재 단일약물만
   → 실제 임상은 병용요법이 많음

③ Time-split 미적용
   → 2015년 이전 데이터로 학습
     2020년 이후 약물 예측하는 게 현실적
   → 현재는 랜덤 drug split

모델 관점:

④ Uncertainty 미추정
   → 예측값 0.7이 얼마나 신뢰할 수 있는지 모름
   → Bayesian approach나 dropout uncertainty
     → 신약개발에서 중요한 부분

⑤ Multi-task learning 미적용
   → FDA 예측 + toxicity 예측 동시에
   → 두 태스크가 공유 representation 학습
   → 현재는 완전히 분리

1. 교차검증 질문:

맞습니다.
구조모델: 46만행 → 단일 split으로도 충분
실험모델: 760행  → CV 필수 (데이터 적어서)

CV AUC 0.76 ± 0.03 → 내부적으로는 괜찮은 성능
Test AUC 0.54 → 일반화 부족
→ Train/Test 분포 차이 때문
  (Train FDA=1 37% vs Test FDA=1 51%)

2. 구조모델 암종별 해석:

breast AUC: 0.6660
colon  AUC: 0.6553
→ 차이 미미 (0.01)
→ 암종보다 drug 구조가 더 중요한 신호
→ 두 암종 모두 비슷한 난이도

 

3. 실험모델 암종별 해석:

breast: AUC=0.32  F1=0.76  Recall=1.0
→ FDA=1을 전부 1로 예측 (recall 100%)
→ 하지만 AUC 0.32 → 랜덤보다 못함
→ 확률값 자체가 의미없음

colon: AUC=0.23  F1=0.00
→ FDA=1을 하나도 못 맞춤
→ 데이터 32행으로는 학습 불가

전체 요약:

구조모델 Test실험모델 Test
전체 AUC 0.6600 0.5382
breast AUC 0.6660 0.3200
colon AUC 0.6553 0.2308
데이터 수 160,958행 136행

실험모델 단독 성능은 신뢰 불가
→ 데이터 부족 (colon 32행)
→ 퓨전에서 구조모델이 주도하고 + 실험모델은 보조 역할
→ 발표에서 한계점으로 명시 필요


재설계

 

기존: drug 단위 FDA label
      erlotinib → 1 (암종 무관)

수정: drug + 암종 조합 FDA label  
      erlotinib + breast → 1
      erlotinib + colon  → 0
      
Split: (drug + 암종) 조합 단위로
       같은 조합이 train/test에 동시 존재 불가

drug 단위 split보다 더 엄격하고 정확함

drug+암종 조합을 split 단위로 정의하면:
  "erlotinib+breast" → train
  "erlotinib+colon"  → test
  가능 (같은 약물도 암종 다르면 분리 가능)

누수 방지:
  구조/실험 모델 모두 동일한
  (drug+암종) 조합 split map 사용
  → 퓨전에서도 누수 없음

암종 시사점:
  같은 약물이 breast에서는 FDA 승인
  colon에서는 미승인인 케이스 학습 가능
  → 암종 특화 예측 가능

1. Label: drug+암종 조합으로 재정의
2. Split: (drug+암종) 조합 단위로 stratified split
3. 구조/실험 모델 동일한 split map 적용
4. 퓨전: 공통 (drug+암종) 조합으로 평가

 

라벨재정의 결과:

drug+암종 조합 145개
  FDA=1: 41개 (28.3%)
  FDA=0: 104개 (71.7%)

예시:
  bevacizumab + breast → FDA=1
  bevacizumab + colon  → FDA=1  (둘 다 승인)
  cetuximab   + colon  → FDA=1
  cetuximab   + breast → FDA=0  (colon만 승인)
  → 암종별로 다른 label ✅ 재정의 의미있음

Combo split:
  Train: 100조합  FDA=1:28  FDA=0:72
  Val  :  15조합  FDA=1: 4  FDA=0:11
  Test :  30조합  FDA=1: 9  FDA=0:21

내부데이터 행수:
  Train: 624행  FDA=1: 35.4%
  Val  :  74행  FDA=1: 36.5%
  Test : 198행  FDA=1: 53.0%  ← 여전히 높지만 이전보다 개선