Introduction
- A toy example for using a deep learning model to predict drug – target interaction
import pandas as pd
positive_dataset = pd.read_csv('cdk9.tsv', sep='\t', header=0, index_col=0)
negative_dataset = pd.read_csv('antibiotics.tsv', sep='\t', header=0, index_col=0)
print(f'Number of positive dataset: {len(positive_dataset)}')
print(f'Number of negative dataset: {len(negative_dataset)}')
from rdkit.Chem import AllChem
from rdkit.Chem.rdFingerprintGenerator import GetMorganGenerator
import numpy as np
X = []
y = []
# positive dataset
for sm in positive_dataset['Smiles']:
if isinstance(sm, str):
m = AllChem.MolFromSmiles(sm)
gen = GetMorganGenerator(7, fpSize=1024)
fp = gen.GetFingerprint(m)
X.append(np.array(fp)) # molecular fingerprint
y.append(1) # positive dataset
# negative dataset
for sm in negative_dataset['Smiles']:
if isinstance(sm, str):
m = AllChem.MolFromSmiles(sm)
gen = GetMorganGenerator(7, fpSize=1024)
fp = gen.GetFingerprint(m)
X.append(np.array(fp)) # molecular fingerprint
y.append(0) # negative dataset
X = np.array(X)
y = np.array(y)
print(f'Total number of chemicals: {len(X)}')
print(f'Number of positive dataset: {np.sum(y)}')
print(f'Number of negative dataset: {len(y) - np.sum(y)}')
print(f'Size of a fingerprint: {len(X[0])}')
import tensorflow as tf # Deep learning 라이브러리
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(1000, input_shape=(X.shape[1],), activation='relu'),
tf.keras.layers.Dense(1000, activation='relu'),
tf.keras.layers.Dense(1000, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
model.compile(optimizer='SGD', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(X, y, validation_split=0.1, epochs=50, verbose=0)
import matplotlib.pyplot as plt
# 그림 그릴 공간 준비
fig = plt.figure() # 그림을 그릴 수 있는 공간을 만든다
ax = fig.add_subplot(111) # x축, y축을 가진 공간을 만든다
# 주요 데이터 plot하기
ax.plot(history.history['accuracy']) # train dataset의 accuracy를 plot한다.
ax.plot(history.history['val_accuracy']) # validation dataset의 accuracy를 plot한다.
# 설명 추가 등 기타
ax.set_xlabel('epoch') # x축 이름을 표기한다.
ax.set_ylabel('accuracy') # y축 이름을 표기한다.
ax.grid() # Grid를 표시하여 보기 쉽게 한다.
ax.set_ylim([-0.05, 1.05]) # y축 값의 범위를 지정한다.
ax.legend(['train', 'validation']) # 범례(legend)를 추가한다
kinase_dataset = pd.read_csv('map4k1.tsv', sep='\t', header=0, index_col=0)
rp_dataset = pd.read_csv('rna_polymerase.tsv', sep='\t', header=0, index_col=0)
print(f'Number of kinase dataset: {len(kinase_dataset)}')
print(f'Number of RNA polymerase dataset: {len(kinase_dataset)}')
Xk = []
for sm in kinase_dataset['Smiles']:
if isinstance(sm, str):
m = AllChem.MolFromSmiles(sm)
gen = GetMorganGenerator(7, fpSize=1024)
fp = gen.GetFingerprint(m)
Xk.append(np.array(fp)) # molecular fingerprint
Xk = np.array(Xk)
Xrp = []
for sm in rp_dataset['Smiles']:
if isinstance(sm, str):
m = AllChem.MolFromSmiles(sm)
gen = GetMorganGenerator(7, fpSize=1024)
fp = gen.GetFingerprint(m)
Xrp.append(np.array(fp)) # molecular fingerprint
Xrp = np.array(Xrp)
yk_pred = model.predict(Xk)
yrp_pred = model.predict(Xrp)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(yk_pred, alpha=0.5, density=1, label='kinase')
ax.hist(yrp_pred, alpha=0.5, density=1, label='rna_polymerase')
ax.legend()
ax.grid()
ax.set_xlabel('Predictive value')
ax.set_ylabel('Density')
Views: 551