cell_type_annotation 값은 데이터 로딩 단계에서 어떤 셀 타입 주석 컬럼을 사용할지 선택하는 용도로 쓰이고, 이후에는 mixup 데이터 증강 과정과 샘플링 과정에서 활용됩니다.
---
📌 언제 / 어떻게 쓰이는지 정리
1. 데이터 로딩 단계 (dataloader.py)
# Custom_data_from_loaded()
cell_type = data.obs['manual_annotation']
# cell_type = data.obs['singler_annotation']
여기서 args.cell_type_annotation 인자에 따라
manual_annotation 또는 singler_annotation 같은 컬럼을 가져오게 됩니다.
즉, 어떤 셀 타입 레이블을 사용할지 선택하는 역할.
---
2. Mixup 단계 (utils.py → mixups 함수)
def mixups(args, data, p_idx, labels_, cell_type):
all_ct = {}
for i, ct in enumerate(sorted(set(cell_type))):
all_ct[ct] = i
cell_type_ = np.array(cell_type.map(all_ct))
cell_type이 숫자 인덱스로 변환되어 cell_type_ 배열이 만들어집니다.
이후 mixup 증강 시 같은 셀타입끼리 샘플링하거나, 셀 타입 분포를 고려해 합성 데이터를 생성하는 데 사용됩니다.
예:
set_union = sorted(set(cell_type_augmented[idx_1]).union(set(cell_type_augmented[idx_2])))
for ct in set_union:
i_sub_1 = idx_1[cell_type_augmented[idx_1] == ct]
i_sub_2 = idx_2[cell_type_augmented[idx_2] == ct]
...
➡ mixup할 때 같은 셀 타입 subset끼리 합성하도록 강제합니다.
---
3. Sampling 단계 (utils.py → sampling 함수)
cell_type_annotation이 직접 들어가진 않지만,
mixups에서 만들어진 cell_type_augmented를 기반으로 샘플링이 진행됩니다.
즉, 학습/테스트 bag을 만들 때 셀 타입 분포가 유지되도록 보조 역할을 합니다.
---
4. 추가 분석 (main.py / main_original.py)
cell_type_annotation은 직접 모델 학습 label로 쓰이지는 않음.
대신:
데이터 증강 (mixup) 시 셀 타입 분포 보존
attention 해석 시 특정 셀 타입 중요도를 분석하는 데 활용
✅ 결론
사용 시점: 데이터 로딩(Custom_data*) → mixup 증강 → sampling
역할:
1. 어떤 셀 타입 주석을 쓸지 선택 (manual_annotation vs singler_annotation)
2. mixup 시 셀 타입 분포를 유지하도록 제약
3. attention 분석 시 셀 타입별 중요도 해석에 활용
즉, cell_type_annotation은 "모델 입력 feature"는 아니고, 데이터 증강·분석에 필요한 보조 메타데이터라고 보면 됩니다.
---
augment_num > 0 → mixup 실행됨 → same_pheno가 환자 쌍 선택 규칙에 직접 영향
same_pheno=1 → 같은 클래스 내부의 다양성을 키우고 싶을 때 (클래스 간 경계를 흐리지 않음)
same_pheno=-1 → 클래스 간 경계를 부드럽게 하여 모델 일반화 유도
same_pheno=0 → 데이터 수가 적거나 클래스 불균형이 심할 때 무작위로 섞어 다양성 극대화
same_pheno=0(무작위 환자 페어링)이어도 cell_type은 적극적으로 사용됩니다.
페어(환자 쌍)를 고를 때만 무작위일 뿐, 믹싱 자체는 셀 타입별로 정렬해서 진행돼요.
핵심 포인트만 콕 집어 설명할게요:
1. 페어 선택(무작위) ≠ 셀 타입 무시
- same_pheno=0일 때는 id_1, id_2를 무작위로 뽑아 idx_1, idx_2(두 환자의 셀 인덱스 집합)를 만듭니다.
- 하지만 그 다음 줄에서 set_union = union(cell_type[idx_1], cell_type[idx_2])를 만들고, 각 ct(셀 타입)별로 루프를 돌면서 믹싱합니다.
→ 즉, “누구와 섞을지”는 랜덤이지만, “어떻게 섞을지”는 셀 타입 단위예요.
2. 셀 타입별 부분 집합으로 믹싱
- 각 ct에 대해 i_sub_1 = idx_1[cell_type == ct], i_sub_2 = idx_2[cell_type == ct]로 동일 셀 타입끼리 부분 집합을 잡습니다.
- 그 안에서 lam과 두 환자의 해당 ct 비율로 diff_sub(섞을 개수)를 계산하고,
np.random.choice로 같은 ct끼리 뽑아 mixup()을 합니다.
→ 그래서 ct가 다르면 섞이지 않습니다. 타입 구성비도 lam에 비례해 반영됩니다.
3. 타입이 한쪽에만 있으면? (제로-샷 보정)
- 어떤 ct가 한 환자 쪽에만 있으면, 반대편은 -1 패딩으로 채운 뒤 add_noise()를 적용해 믹싱합니다.
→ ct 분포를 최대한 유지하려는 안전장치입니다.
4. 증강 후 메타데이터도 ct 기준으로 갱신
- 생성한 x_mix를 붙이면서 cell_type_augmented에도 해당 ct를 diff_sub만큼 반복해서 추가합니다.
→ 이후 단계(샘플링 등)에서도 셀 타입 정보가 유지됩니다.
정리
- same_pheno=0은 “클래스(표현형) 같은지/다른지”를 따지지 않고 무작위로 환자 쌍을 고른다는 뜻이고,
- 믹싱 단위는 여전히 셀 타입별입니다.
- 따라서 “cell_type을 사용하느냐?”에 대한 답은 YES입니다. 페어 선택이 랜덤이어도 ct-aware mixup이 수행됩니다.
추가 팁
- cell_type에 NaN이나 비문자형이 섞이면 set/매핑 단계에서 에러가 날 수 있으니, 현재 코드처럼 astype("string").fillna("Unknown")으로 정리해 두는 게 안전합니다.
- args.inter_only=True면 증강 샘플만 학습에 쓰이므로, ct 분포가 원하는 대로 들어가는지 로그로 한 번 확인해보면 좋아요.
'AI & Data Analysis > Deep Learning' 카테고리의 다른 글
| AMP + TF32 (2) | 2025.08.29 |
|---|---|
| [ScRAT] Complete Summary (0) | 2025.08.21 |
| [protocell4P] Customized Dataset (2) | 2025.08.14 |
| [Survey] Methods to Reduce Cell Count (2) | 2025.08.14 |
| [ScRAT] SPILT Dataset Results (4) | 2025.08.08 |