sampling() 함수는
**환자 단위 index 목록(train/test용)을 입력받아, 각 환자에서 지정된 수(train_sample_cells, test_sample_cells) 만큼의 세포를 뽑아 여러 개의 샘플(bag)을 만드는 역할을 합니다.
구체적으로는:
- 입력
- args: 학습 파라미터 (train_sample_cells, test_sample_cells, train_num_sample, test_num_sample, all 등)
- train_p_idx: 학습용 환자별 세포 index 리스트
- test_p_idx: 검증+테스트용 환자별 세포 index 리스트
- labels_: 원본 라벨 배열
- labels_augmented: mixup 등으로 augment된 라벨 배열
- cell_type_augmented: augment된 세포 타입 정보
- 동작 방식
- args.all == 0인 경우:
- 각 환자에 대해:
- train set: train_sample_cells 개의 세포를 뽑아 하나의 샘플(bag)을 구성, 이를 train_num_sample 번 반복 → 여러 bag 생성
- test set: test_sample_cells 개를 뽑아 bag 구성, 이를 test_num_sample 번 반복
- 세포 수가 지정 개수보다 적으면 남는 자리는 -1로 채움
- 각 환자에 대해:
- args.all != 0인 경우:
- 해당 환자의 모든 세포 index를 그대로 하나의 샘플로 사용 (랜덤샘플링 없음)
- args.all == 0인 경우:
- 출력
- individual_train: 학습용 각 환자의 bag 목록
(구조: [[ (cell_indices, label), (cell_indices, label), ... ], ...]) - individual_test: 검증+테스트용 각 환자의 bag 목록
- individual_train: 학습용 각 환자의 bag 목록
📌 쉽게 말하면
sampling()은 ScRAT이 사용하는 Multiple Instance Learning 형태의 입력 구성을 위해,
"환자별로 일정 수의 세포를 뽑아 여러 bag으로 나누는" 전처리 단계입니다.
이렇게 만들어진 bag들이 이후 train()에서 배치 단위로 모델에 들어갑니다.
sampling() 동작 비교
| 항목 | args.all = 1 (default) | args.all = 0 |
| 샘플(=bag) 구성 | 환자의 모든 세포 index를 한 번에 하나의 bag으로 사용 | 지정 개수만큼 무작위로 뽑아 bag 생성 |
| 환자당 bag 개수 | 1개 | Train: train_num_sample개, Eval(Test/Valid): test_num_sample개 |
| 세포 수 | Train: 각 환자별 세포 수의 최대길이로 패딩 고정 (최장 환자 길이에 맞춰 -1 패딩)Eval: 그대로 사용(패딩 없음) | Train: train_sample_cells만큼 고정 길이로 샘플링(부족 시 -1로 패딩)Eval: min(len(idx), test_sample_cells)만큼 샘플링 |
| 랜덤성 | 없음(샘플링/순서 무작위 없음) → 결정론에 유리 | 있음(매 bag마다 np.random.choice) → 재현성 방해 요인 |
| train_sample_cells, test_sample_cells 사용 여부 | 미사용 (실질적 무시) | 사용 (샘플 길이와 데이터 다양성 결정) |
| train_num_sample, test_num_sample 영향 | 미미 (환자당 bag=1이라 증폭 없음) | 큼 (bag 수를 직접 결정 → 학습 데이터량/에폭당 스텝 수 증가) |
| 메모리/연산량 | Train: 환자당 bag 1개 + 긴 시퀀스(최장 환자) → 시퀀스 길이 부담 큼, 배치 적음 | bag 수가 많고 길이는 짧음 → 미니배치 학습에 유리, 총 연산량은 하이퍼파라미터에 좌우 |
| 클래스 불균형 완화 | 어려움(환자당 1 bag) | 부분 완화 가능(클래스가 적어도 bag 수로 보완) |
| 주 용도/장점 | 길이 변동 없이 전체 세포 신호를 보전하고 싶을 때, 재현성 강화 | 데이터 증강/일반화 성능을 높이고 싶을 때, 미니배치 효율↑ |
모식도 (입·출력 구조 느낌)
- 공통 입력:
train_p_idx: 환자별 세포 인덱스 배열 리스트, test_p_idx: (valid+test)용 리스트
labels_ / labels_augmented: 환자(또는 mixup) 라벨
all = 1 (환자당 1 bag, 패딩 고정)
- Train:
- 환자 A index: [10, 20, 30, 40] → max_length=100이라면 → [10,20,30,40,-1,-1,...(총 100)]
- 각 환자에 대해 딱 1개 bag 생성
- Eval(Valid/Test):
- 환자별 index를 그대로 1개 bag (패딩 없음)
all = 0 (무작위 샘플링, 다수 bag)
- Train:
- 환자 A index에서 train_sample_cells개씩 중복 없이 샘플링 → 이를 train_num_sample번 반복
- 세포가 부족하면 -1로 패딩
- Eval(Valid/Test):
- 환자별로 sample_cells = min(len(idx), test_sample_cells)를 샘플링 → test_num_sample개 bag
언제 무엇을 쓰면 좋을까?
- 정확한 재현 실험 / 디버깅: all=1
- 성능 향상/일반화(데이터가 상대적으로 적거나 환자당 세포 수가 많아 과적합 우려): all=0 + 적절한 train_num_sample, test_num_sample, train/test_sample_cells
'AI & Data Analysis > Coding & Programming' 카테고리의 다른 글
| [ScRAT] customized dataset with CrossValidation (2) | 2025.08.07 |
|---|---|
| Data Size Optimization (0) | 2025.07.07 |
| [ScRAT] customized dataset (0) | 2025.07.01 |
| GSE62452 (microarray) Analysis Results (0) | 2025.05.07 |
| GSE86982 Analysis Summary (0) | 2025.04.30 |