본문 바로가기
AI 및 Data Analysis/Code

[ScRAT] scRNA Analysis

by doraemin_dev 2025. 3. 20.

Paper : Phenotype prediction from single-cell RNA-seq data using attention-based neural networks

 https://academic.oup.com/bioinformatics/article/40/2/btae067/7613064
 
본 논문에서 언급된 ScRAT 방법으로 scRNA 분석하기


 
https://github.com/yuzhenmao/ScRAT

GitHub - yuzhenmao/ScRAT: Implementation of Phenotype prediction from single-cell RNA-seq data using attention-based neural netw

Implementation of Phenotype prediction from single-cell RNA-seq data using attention-based neural networks (Bioinformatics). - yuzhenmao/ScRAT

github.com

 

1. Setup (python>=3.7)

git clone https://github.com/yuzhenmao/ScRAT
cd ScRAT
python -m venv scrat
source scrat/bin/activate
pip install -r requirements.txt

 
*python version 에러 발생 시, 패키지마다 맞는 버전으로 각자 설치해주자.

더보기

python version Error로 인해, 각각 패키지를 설치해줬다.

 
*현재 (root의) 저장공간이 부족하다면, 저장공간이 많은 디렉토리를 임시 디렉토리로 설정.

더보기

pip 캐시, 임시 파일, 가상환경, 설치 작업 모두 /data 또는 /mnt/server_mount에서 실행하도록 설정하시면 됩니다.


추천 작업 방법

1️⃣ /data/project/kim89/ScRAT 내 가상환경 생성 및 활성화

(이미 clone 되어 있다면 생략 가능)

cd /data/project/kim89/ScRAT
python -m venv scrat
source scrat/bin/activate

2️⃣ pip 캐시/임시 디렉토리 변경하여 설치

mkdir -p /data/project/kim89/pip_cache
mkdir -p /data/project/kim89/tmp

TMPDIR=/data/project/kim89/tmp \
pip install --cache-dir=/data/project/kim89/pip_cache -r requirements.txt

👉 이렇게 하면 설치 중 필요한 임시 파일과 캐시가 /data 공간을 사용하므로 공간 부족 문제를 피할 수 있습니다.


3️⃣ (선택) /mnt/server_mount 사용

/data도 향후 용량 걱정되면 /mnt/server_mount에 프로젝트 디렉토리를 새로 만들어도 좋습니다.

mkdir -p /mnt/server_mount/kim89/ScRAT
# 그곳에서 clone, venv, 설치 진행

주의

  • pip 캐시와 TMPDIR 경로를 매번 지정하지 않으면 다시 루트 디렉토리를 쓰려고 하니, 스크립트화 하거나 alias를 지정하면 편리합니다.
  • 설치가 끝나면 pip 캐시는 지워도 됩니다: pip cache purge

2. Data 

데이터 다운로드 하기 :  https://figshare.com/projects/ScRAT_Early_Phenotype_Prediction_From_Single-cell_RNA-seq_Data_using_Attention-Based_Neural_Networks/151659

ScRAT: Early Phenotype Prediction From Single-cell RNA-seq Data using Attention-Based Neural Networks

Processed input data for "ScRAT: Early Phenotype Prediction From Single-cell RNA-seq Data using Attention-Based Neural Networks" 

figshare.com

 
데이터 저장 위치 :

ScRAT/data 위치에 저장. 아래와 같은 형태가 됨.

ScRAT/data/
├── SC4
│   ├── cell_type_large.pkl
│   ├── cell_type.pkl
│   ├── covid_pca.npy
│   ├── patient_id.pkl
│   ├── severity_label.pkl
│   └── stage_label.pkl
├── Haniffa
│   ├── cell_type_large.pkl
│   ├── cell_type.pkl
│   ├── Haniffa_X_pca.npy
│   ├── patient_id.pkl
│   └── labels.pkl
├── COMBAT
│   ├── cell_type_large.pkl
│   ├── cell_type.pkl
│   ├── COMBAT_X_pca.npy
│   ├── patient_id.pkl
│   └── labels.pkl

(또는, 자신이 가지고 있는 데이터 사용 가능. 접은 글 참조.)

더보기
  • For customized dataset:

Please pack the dataset in the h5ad format and set the value of args.dataset to the path of the dataset. Also, please set args.task to 'custom'.

Furthermore, in the dataloader.py file, please modify the following lines:

  1. line 178 for label dictionary to map string to integer (default: {})
  2. line 185 for patient id (default: data.obs['patient_id'])
  3. line 187 for label, which is clinical phenotype for prediction (default: data.obs['Outcome'])
  4. line 189 for cell type, which assist for mixup (default: data.obs['cell_type'])

Also in the main.py file, please add elif args.task == 'custom': label_dict = {0: 'XXX', 1: 'XXX'} in line 83.



👉 /data/project/kim89/cardio.h5ad 파일을 ScRAT에 입력 데이터로 활용하여 실행
👉 ScRAT 코드 일부를 커스터마이징 (dataloader.py, main.py)


🚀 실행 준비 단계

1️⃣ 데이터 준비

당신의 데이터:
✅ cardio.h5ad
✅ 이 파일에는 최소 아래 컬럼이 필요합니다:

  • obs['patient_id']: 환자 ID
  • obs['Outcome']: 예측할 label (예: 0, 1 / control, disease)
  • obs['cell_type']: cell type 정보 (mixup 용)

👉 만약 컬럼 이름이 다르다면 h5ad를 로드해서 컬럼 이름 확인:

import scanpy as sc
adata = sc.read_h5ad('/data/project/kim89/cardio.h5ad')
print(adata.obs.columns)

필요하면 .obs 컬럼을 rename해서 h5ad 다시 저장하세요.


2️⃣ ScRAT 코드 수정

✅ dataloader.py

수정 위치: /data/project/kim89/ScRAT/dataloader.py

  • line 178
label_dict = {'control': 0, 'disease': 1}  # 또는 데이터에 맞게

👉 데이터 label이 숫자면 {} 로 두거나 {0:0, 1:1} 처럼 명시

  • line 185
patient_id = data.obs['patient_id']

👉 컬럼 이름이 다르면 바꾸기

  • line 187
label = data.obs['Outcome']

👉 컬럼 이름 맞게

  • line 189
cell_type = data.obs['cell_type']

👉 컬럼 이름 맞게


✅ main.py

수정 위치: /data/project/kim89/ScRAT/main.py

  • line 83 주변
elif args.task == 'custom':
    label_dict = {0: 'control', 1: 'disease'}  # 데이터에 맞게

👉 여기도 데이터에 맞게 작성


3️⃣ 실행

가상환경 활성화 후 실행:

cd /data/project/kim89/ScRAT
source scrat/bin/activate

python main.py --dataset /data/project/kim89/cardio.h5ad --task custom

필요하면 추가 인자:

--batch_size 16 --epochs 50 --lr 0.001

🌟 요약

수정해야 할 곳

  • dataloader.py (178, 185, 187, 189줄)
  • main.py (83줄 근처)

실행

python main.py --dataset /data/project/kim89/cardio.h5ad --task custom

 

 

3. Test Run

bash run.sh

* main.py의 309번째 줄에 'args.repeat * 100'으로 되어 있어 ;  --repeat 1이면 실제로 100회 까지 반복 가능하긴 함.
하지만 어차피 n_split * repeat 값 만큼이 채워지면 중단됨.

📌 1. 학습 과정 요약

✅ 첫 번째 단계: 첫 번째 Fold에서 학습

데이터셋을 K개의 Fold(서브셋)로 나눔.

K-Fold 중 하나를 Validation Set으로 사용하고, 나머지 K-1개를 학습에 사용.

모델이 Epoch 54에서 Early Stopping 되어 학습 종료.



---

✅ 두 번째 단계: Validation 데이터 평가

Validation Set을 사용해 예측값을 생성하고 모델 성능을 평가.

P-M_***, P-S_*** 표시는 환자 ID별 실제 페노타입과 예측값을 비교한 것.



---

✅ 세 번째 단계: 새로운 Fold에서 다시 학습

K-Fold Cross Validation이므로, 다른 Fold를 Validation Set으로 사용하고 학습을 다시 시작.

즉, K번 반복해서 학습을 진행하며, 각 번마다 다른 Validation Set을 사용.



---

📌 2. 왜 여러 번 학습하는가? (K-Fold Cross Validation의 목적)

목적: 데이터가 적을 때 일반화 성능을 높이기 위해!

단순히 한 번의 Validation만 수행하면, 특정 데이터에 과적합할 가능성이 높음.

K-Fold Cross Validation을 하면, 모든 데이터가 한 번씩 Validation에 사용되므로, 더 객관적인 평가가 가능.



---

📌 3. K-Fold Cross Validation의 학습 흐름

1. Fold 1: 학습 → Validation Set 1로 평가


2. Fold 2: 학습 → Validation Set 2로 평가


3. Fold 3: 학습 → Validation Set 3로 평가
...


4. Fold K: 학습 → Validation Set K로 평가



이후, K개의 Validation 결과를 평균 내어 최종 성능을 결정.

 


코드 설명 :
2025.03.20 - [AI, 논문, 데이터 분석] - [ScRAT] Code Demo

[ScRAT] Code Demo

이전 글에서, ScRAT 실행을 해보았다.2025.03.20 - [AI, 논문, 데이터 분석] - [ScRAT] scRNA Analysis [ScRAT] scRNA AnalysisPaper : Phenotype prediction from single-cell RNA-seq data using attention-based neural networks https://academic.o

doraemin.tistory.com

 

'AI 및 Data Analysis > Code' 카테고리의 다른 글

[ScRAT] utils.py _ mixup()  (0) 2025.03.20
[ScRAT] Code Demo  (0) 2025.03.20
[OpenCV] Morphology (침식 / 팽창 / 열림과 닫힘)  (1) 2025.01.22
[OpenCV] Filtering  (2) 2025.01.22
[OpenCV] 인터페이스 (디지털 영상 처리)  (3) 2025.01.21