Chapter 6: 유전체학

이 장에서는 RNA 간섭(RNAi) 서열과 전사 인자(Transcription Factor) 결합 등 생명의 설계도인 유전체 데이터를 딥러닝으로 분석하는 방법을 살펴봅니다.

RNA 간섭(RNAi) 예측

siRNA 서열이 실제로 어떤 효과를 내는지 예측하기 위해 합성곱 신경망(CNN) 모델을 구축해 봅니다.

import deepchem as dc
import tensorflow as tf
import tensorflow.keras.layers as layers
# import matplotlib.pyplot as plt

# 특정 서열이 RNA 간섭(RNA interference)에 얼마나 효과적인지 예측하는 모델을 훈련합니다.

# 모델을 구축합니다.
features = tf.keras.Input(shape=(21, 4))
prev = features
for i in range(2):
    prev = layers.Conv1D(
        filters=10, kernel_size=10, activation=tf.nn.relu, padding="same"
    )(prev)
    prev = layers.Dropout(rate=0.3)(prev)
output = layers.Dense(units=1, activation=tf.math.sigmoid)(layers.Flatten()(prev))
keras_model = tf.keras.Model(inputs=features, outputs=output)
model = dc.models.KerasModel(
    keras_model, loss=dc.models.losses.L2Loss(), batch_size=1000, model_dir="rnai"
)

# 데이터를 로드합니다.
train = dc.data.DiskDataset("train_siRNA")
valid = dc.data.DiskDataset("valid_siRNA")

# 모델을 훈련하며 훈련 및 검증 데이터셋에서의 성능 변화를 확인합니다.
metric = dc.metrics.Metric(dc.metrics.pearsonr, mode="regression")
for i in range(20):
    model.fit(train, nb_epoch=10)
    print(f"에포크 {i*10+10} - 훈련 데이터 피어슨 상관계수: {model.evaluate(train, [metric])['pearsonr']}")
    print(f"에포크 {i*10+10} - 검증 데이터 피어슨 상관계수: {model.evaluate(valid, [metric])['pearsonr']}")

전사 인자 결합(Transcription Factor Binding) 예측

DNA의 특정 부위에 결합하는 전사 인자의 위치를 찾아내는 일은 유전체 연구의 핵심 과제 중 하나입니다.

기본적인 DNA 결합 분석

import deepchem as dc
import tensorflow as tf
import tensorflow.keras.layers as layers

# 전사 인자(Transcription Factor)인 JUND의 결합 부위를 예측하는 모델을 훈련합니다.

# 모델을 구축합니다.
features = tf.keras.Input(shape=(101, 4))
prev = features
for i in range(3):
    prev = layers.Conv1D(
        filters=15, kernel_size=10, activation=tf.nn.relu, padding="same"
    )(prev)
    prev = layers.Dropout(rate=0.5)(prev)
logits = layers.Dense(units=1)(layers.Flatten()(prev))
output = layers.Activation(tf.math.sigmoid)(logits)
keras_model = tf.keras.Model(inputs=features, outputs=[output, logits])
model = dc.models.KerasModel(
    keras_model,
    loss=dc.models.losses.SigmoidCrossEntropy(),
    output_types=["prediction", "loss"],
    batch_size=1000,
    model_dir="tf",
)

# 데이터를 로드합니다.
train = dc.data.DiskDataset("train_dataset")
valid = dc.data.DiskDataset("valid_dataset")

# 모델을 훈련하며 훈련 및 검증 데이터셋에서의 성능 변화를 확인합니다.
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)
for i in range(20):
    model.fit(train, nb_epoch=10)
    print(f"에포크 {i*10+10} - 훈련 데이터 ROC-AUC 점수: {model.evaluate(train, [metric])}")
    print(f"에포크 {i*10+10} - 검증 데이터 ROC-AUC 점수: {model.evaluate(valid, [metric])}")

크로마틴 접근성 데이터 활용하기

크로마틴 접근성(Chromatin Accessibility) 데이터를 모델에 추가해 결합 예측의 정확도를 한 단계 높이는 방법을 알아봅니다.

import deepchem as dc
import tensorflow as tf
import tensorflow.keras.layers as layers
import numpy as np

# 서열 정보와 크로마틴 접근성(Chromatin Accessibility) 데이터를 모두 활용해
# 전사 인자 결합을 예측하는 모델을 훈련합니다.

# 모델을 구축합니다.
features = tf.keras.Input(shape=(101, 4))
accessibility = tf.keras.Input(shape=(1,))
prev = features
for i in range(3):
    prev = layers.Conv1D(
        filters=15, kernel_size=10, activation=tf.nn.relu, padding="same"
    )(prev)
    prev = layers.Dropout(rate=0.5)(prev)
prev = layers.Concatenate()([layers.Flatten()(prev), accessibility])
logits = layers.Dense(units=1)(prev)
output = layers.Activation(tf.math.sigmoid)(logits)
keras_model = tf.keras.Model(inputs=[features, accessibility], outputs=[output, logits])
model = dc.models.KerasModel(
    keras_model,
    loss=dc.models.losses.SigmoidCrossEntropy(),
    output_types=["prediction", "loss"],
    batch_size=1000,
    model_dir="chromatin",
)

# 데이터를 로드합니다.
train = dc.data.DiskDataset("train_dataset")
valid = dc.data.DiskDataset("valid_dataset")
span_accessibility = {}
for line in open("accessibility.txt"):
    fields = line.split()
    span_accessibility[fields[0]] = float(fields[1])


# 배치(batch) 데이터를 생성하는 제너레이터 함수를 정의합니다.
def generate_batches(dataset, epochs):
    for epoch in range(epochs):
        for X, y, w, ids in dataset.iterbatches(batch_size=1000, pad_batches=True):
            yield ([X, np.array([span_accessibility[id] for id in ids])], [y], [w])


# 모델을 훈련하며 훈련 및 검증 데이터셋에서의 성능 변화를 확인합니다.
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)
for i in range(20):
    model.fit_generator(generate_batches(train, epochs=10))
    print(f"에포크 {i*10+10} - 훈련 데이터 ROC-AUC 점수: {model.evaluate_generator(generate_batches(train, 1), [metric])}")
    print(f"에포크 {i*10+10} - 검증 데이터 ROC-AUC 점수: {model.evaluate_generator(generate_batches(valid, 1), [metric])}")