Использование глубокого обучения для аннотации белковой вселенной

Ссылка на изображение - нажмите здесь

Демо-пример

Введение

Понимание взаимосвязи между аминокислотной последовательностью и функцией белка - давняя проблема молекулярной биологии с далеко идущими научными последствиями. Несмотря на шестидесятилетний прогресс, современные методы не могут аннотировать 1/3 последовательностей микробных белков, что ограничивает нашу способность использовать последовательности, полученные от различных организмов. Чтобы решить эту проблему, мы сообщаем о модели глубокого обучения, которая изучает взаимосвязь между невыровненными аминокислотными последовательностями и их функциональной классификацией во всех 17929 семействах базы данных Pfam. Наша модель совмещает последовательности из невидимых семейств в пространстве встраивания, что позволяет точно аннотировать последовательности из новых семейств. Эти результаты предполагают, что модели глубокого обучения станут основным компонентом будущих инструментов прогнозирования функции белков. Прогнозирование функции белка по его необработанной аминокислотной последовательности является критическим шагом для понимания взаимосвязи между генотипом и фенотипом. Поскольку стоимость секвенирования ДНК падает, а проекты метагеномного секвенирования процветают, быстрые и эффективные инструменты, которые аннотируют открытые рамки считывания с помощью этой функции, будут играть центральную роль в использовании этих данных.

1. Проблемы бизнеса / реального мира

Отнесение данной белковой последовательности аминокислоты к одному из принадлежащих семейству.

Эта модель может быть использована для предсказания данной белковой последовательности аминокислоты. Модель будет генерировать ряд значений вероятности классов, соответствующих количеству принадлежащих к классу или семейству. Наивысшее значение вероятности для соответствующего класса будет предсказанным классом для этой белковой последовательности аминокислоты.

2. Цели и ограничения

Цель:

Наша цель - максимально точно предсказать данную белковую последовательность аминокислот.

Ограничения:

  1. Интерпретируемость. Интерпретируемость важна для данной белковой последовательности аминокислоты, которую она должна правильно предсказать.
  2. Задержка: учитывая последовательность белка и аминокислоту, он должен предсказать правильный класс, поэтому нет необходимости в высокой задержке.
  3. Точность. Наша цель - максимально точно предсказать последовательность данной белковой последовательности аминокислот. Чем выше точность теста, тем лучше наша модель будет работать в реальном мире.

3. Показатель эффективности

Это проблема классификации нескольких классов с 17929 различными классами, поэтому мы рассмотрели два показателя производительности:

  1. Multi-Class Log-loss: Мы использовали модель глубокого обучения с кросс-энтропийным слоем, в конце концов, с 17929 единицами softmax, поэтому наша цель - уменьшить многоклассовые потери журнала / потеря кросс-энтропии.
  2. Точность. Это показывает, насколько точно наша модель предсказывает выражения .

4. Исходные данные

Данные предоставлены kaggle, поэтому мы можем напрямую загрузить по указанной ссылке Ссылка Kaggle - https://www.kaggle.com/googleai/pfam-seed-random-split

5. Обзор данных

Подход, используемый для разделения данных на свертки обучения / разработки / тестирования, представляет собой случайное разделение.

  • Данные обучения следует использовать для обучения ваших моделей.
  • Данные разработки (разработки) следует использовать в тесном цикле проверки (возможно, для настройки гиперпараметров или проверки модели).
  • Тестовые данные следует зарезервировать для гораздо менее частых оценок - это помогает избежать переобучения тестовых данных, поскольку их следует использовать нечасто.

Содержание файла

В каждой свертке (train, dev, test) есть несколько файлов. Каждый из этих файлов содержит CSV в каждой строке со следующими полями:

последовательность: HWLQMRDSMNTYNNMVNRCFATCIRSFQEKKVNAEEMDCTKRCVTKFVGYSQRVALRFAE

family_accession: PF02953.15

имя_последовательности: C5K6N5_PERM5 / 28–87

выровненная_последовательность:… .HWLQMRDSMNTYNNMVNRCFATCI ……… ..RS.F… .QEKKVNAEE… ..MDCT… .KRCVTKFVGYSQRVALRFAE

family_id: zf-Tim10_DDP

Описание полей:

  1. последовательность: обычно это входные элементы вашей модели. Аминокислотная последовательность для этого домена. Есть 20 очень распространенных аминокислот (частота> 1 000 000) и 4 аминокислоты, которые встречаются довольно редко: X, U, B, O, Z.
  2. family_accession: обычно это ярлыки вашей модели. Регистрационный номер в форме PFxxxxx.y (Pfam), где xxxxx - это принадлежность к семейству, а y - номер версии. Некоторые значения y больше десяти, поэтому y состоит из двух цифр.
  3. family_id: название семьи из одного слова.
  4. имя_последовательности: имя последовательности в форме «$ uniprot_accession_id / $ start_index- $ end_index».
  5. Выровненная_последовательность: содержит одну последовательность из множественного выравнивания последовательностей (с остальными членами семейства в затравке, с сохраненными пробелами.

Обычно поле family_accession - это метка, а последовательность (или выровненная последовательность) - это обучающая функция.

Эта последовательность соответствует домену, а не полноценному белку.

Содержимое этих полей совпадает с данными, предоставленными PFam в Стокгольмском формате по адресу ftp: //ftp.ebi.ac.uk/pub/databases/Pfam/releases/Pfam32.0/Pfam-A.seed.gz

6. Библиотеки и пакет

Мы использовали почти всю библиотеку глубокого обучения, которую мы обычно использовали, например pandas, numpy, sklearn, Keras и т. Д. Мы можем установить, просто используя

pip install ‘укажите здесь имя пакета’

7. Предварительная обработка и настройка

Мы выполнили некоторую предварительную обработку, такую ​​как строчная последовательность, и использовали максимальную длину последовательности 100 и преобразовали текстовые данные в числовую форму с помощью sklearn countvectorizer или, иначе, нашу определенную функцию создания словаря и сопоставления char с формой индекса и индекса с формой char .

8. Моделирование и обучение

Итак, наконец, мы подошли к нашему последнему процессу подгонки модели. Таким образом, мы завершили 90% процесса. Итак, наша основная цель здесь - дать последовательность белков одну за другой и уменьшить потерю кросс-энтропии. Мы разработали собственную архитектуру нейронной сети следующим образом:

input_s = Input(shape=(100,24))
X  = Conv1D(32, 1 , strides=1,padding='valid', name='conv1d_1', kernel_initializer=glorot_uniform(seed=0))(input_s)
X  = MaxPooling1D(pool_size=2)(X)
X1 = BatchNormalization(axis=2, name='batch_normalization_1')(X)
X2 = Activation('relu',name='activation_1')(X1)
X3 = BatchNormalization(axis=2, name='batch_normalization_2')(X2)
X4 = Activation('relu',name='activation_2')(X3)
X5 = Conv1D(128, 1 , strides=1,padding='valid', name='conv1d_2', kernel_initializer=glorot_uniform(seed=0))(X4)
X6 = BatchNormalization(axis=2, name='batch_normalization_3')(X5)
X7 = Activation('relu',name='activation_3')(X6)
X8 = Conv1D(128 , 1 , strides=1 ,padding='valid', name='conv1d_3' , kernel_initializer=glorot_uniform(seed=0))(X7)
X8 = Dropout(0.5,name='d1')(X8)
X8 = MaxPooling1D(pool_size=2)(X8)
X9 = Conv1D(128,  1 , strides=1 ,padding ='valid',name='conv1d_4',  kernel_initializer=glorot_uniform(seed=0))(X2)
X9 = Dropout(0.5,name='d2')(X9)
X9 = MaxPooling1D(pool_size=2)(X9)
X10 = Add()([X8,X9])
X11 = Activation('relu',name='activation_4')(X10)
X11 = Dropout(0.2,name='d3')(X11)
X12 = BatchNormalization(axis=2,name='batch_normalization_4')(X11)
X13 = Activation('relu',name='activation_5')(X12)
X14 = Dropout(0.5,name='d4')(X13)
X15 = Flatten(name='flatten_1')(X14)
X16 = Dense(2910 ,name='fc' + str(2910), kernel_initializer = glorot_uniform(seed=0))(X15)
X17 = Activation('softmax',name='activation_6')(X16)

Разберемся в архитектуре:

Как мы видим, у нас есть входная форма (100,24), то есть (None, 100,24), поскольку максимальная длина последовательности 100 для каждой белковой последовательности аминокислоты, и это одна горячая кодировка, так что это, например, выглядит так:

for eg: we have shape (1,2,3)
so one hot encode of this look like
[[1 0 0],[0 1 0],[0 0 1]]

Здесь 1 описывается, где представлен индекс символа. Таким образом, все наши данные для обучения, тестирования и разработки кодируются и представляются.

Из архитектуры мы можем заметить, что у нас есть 4 сверточных слоя: 1D, плотный слой, слой Maxpooling, слой Dropout, слой BatchNormalization, слой активации и слой Flatten. Мы указали инициализацию веса. Если вы не укажете метод инициализации веса явно в Keras, он будет использовать инициализацию Xavier, также известную как инициализация Glorot. Цель всех этих инициализаторов весов - найти хорошую дисперсию для распределения, из которого берутся начальные параметры.

О сверточном слое,

X  = Conv1D(32, 1 , strides=1,padding='valid', name='conv1d_1', kernel_initializer=glorot_uniform(seed=0))(input_s)

Здесь 32 задают 32 фильтра с размером ядра 1, поскольку мы использовали различные фильтры на уровне свертки, чтобы сеть лучше узнала параметр. Мы использовали padding = ’valid’, поэтому отступов не будет.

Мы использовали слой исключения между слоями свертки, поскольку это помогает предотвратить переоснащение. Здесь мы использовали различную частоту выпадения, т.е. 0,5 определяли, что 0,5% узлов будут отброшены во время прямого и обратного прохода, поскольку во время обратного распространения параметры не изучаются. Поскольку сеть временно удаляет блоки из подключений и удаление количества узлов для подключения является случайным. Таким образом, мы можем получить оптимальную частоту отсева за счет гипер-настройки или использования различных показателей отсева. В нашем случае я наблюдал в те эпохи, когда мы переоснащались, поэтому я попытался установить частоту отсева от малого до большого, чтобы избежать переобучения (0,1–0,5).

После этого у нас есть слой максимального пула, на котором функции уменьшаются значимым образом, что помогает в субдискретизации слоя свертки, и, как мы знаем, такие преимущества, как неизменность местоположения, масштабная инвариантность слоя максимального пула. В нашей сети мы использовали одномерный слой максимального пула размером 2 при итерации по карте функций. Чтобы узнать больше о сверточной нейронной сети и слоях, посетите эту ссылку.

Наконец, у нас есть плотный слой, который содержит блоки активации relu. Так как выходной слой содержит 2910 единиц softmax. Он сгенерирует вероятность класса 2910, которая в сумме равна 1. Мы минимизируем потери, вернув его во время обратного распространения. Таким образом, наша модель нейронной сети будет обучена классификации последовательностей белков.

Тренируясь за 100 эпох без гипертонастройки сети, я получил следующие результаты:

Как мы можем заметить, потери и точность различаются между данными поезда и тестами, т. Е. Переобучением.

После настройки исключения, добавления слоя max-pooling и пакетной нормализации я получил точность теста 99%.

Итак, как я добился более чем 90% точности на разных моделях с настройкой гиперпараметров:

+---------------------------------------------------+----------+
|                       Model                       | Accuracy |
+---------------------------------------------------+----------+
|         CNN without hyperparameter tuning         |  0.8423  |
|       CNN with dropout and BatchNomalization      |  0.9211  |
| CNN with dropout,BatchNormalization & Max-pooling |  0.9434  |
|        Final CNN with hyperparameter tuning       |  0.9922  |
+---------------------------------------------------+----------+

9. Результаты тестирования

Поскольку у нас есть данные в формате train, test, dev. Поэтому мы использовали тестовые данные, чтобы проверить точность.

После тестирования мы получили такие окончательные результаты:

score = model.evaluate(finaltest,ytest , verbose=1)
print("Test loss:",score[0])
print("Test accuracy:",score[1])
#output
7316/7316 [==============================] - 2s 251us/step
Test loss: 0.0511749743080253
Test accuracy: 0.9922886276653909

10. Тестирование в реальном мире

Для тестирования необходимо выполнить тот же процесс:

  1. Предварительная обработка строчной последовательности и взятие максимальной длины последовательности 100
  2. Преобразование символа в индекс или числовую форму
  3. Использование нашей модели для окончательного предсказания белковой последовательности аминокислот.
def predict(text):
  text=text.lower()
  final=[]
  seq1=[]
  for s in (text):
    x=train_char_index_dict[s]
    seq1.append(str(x))
  final.append(seq1)  
  final_sequence =sequence.pad_sequences(final,
                                       maxlen=100,padding='post')
  nb_classes = 24
  targets = np.array(final_sequence)
  one_hot_train = np.eye(nb_classes)[targets]
  res=model.predict(one_hot_train)
  pred = labelencoder.inverse_transform([np.argmax(res)])
  return ("Given protein sequence '{}' belongs to class family    
                       accession {}".format(text.upper(),pred[0]))
predict('hcqltgrqpgfghhishshrrtkrrfdpniqhkrywlpsegrhirltlstkaiktvdti')
#output
"Given protein sequence 'HCQLTGRQPGFGHHISHSHRRTKRRFDPNIQHKRYWLPSEGRHIRLTLSTKAIKTVDTI' belongs to class family accession PF0083019"

11. Дальнейшие возможности

Так как у нас есть хороший результат, но его можно улучшить

  1. Для большей точности модель может быть обучена на большом наборе данных.
  2. Путем дополнительной настройки гиперпараметров можно достичь большей точности.
  3. Его можно использовать для решения других задач классификации последовательностей белков, настроив или увеличив сложность модели.

12. Ссылка

  1. Https://www.appliedaicourse.com/
  2. Https://www.biorxiv.org/content/10.1101/626507v3.full
  3. Https://arxiv.org/abs/1606.01781
  4. Https://www.kaggle.com/googleai/pfam-seed-random-split

12. Код можно найти здесь