본문 바로가기
AI & Data Analysis/Deep Learning

[ScRAT] using of cell type annotation

by doraemin_dev 2025. 8. 20.


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