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

Набор данных был собран на факультете наук о жизни в моей школе. Поэтому я не буду делиться здесь полным набором данных, поскольку у меня нет на это разрешения, и буду делиться только методом или подходом, используемым в этом проекте.

Давайте начнем с некоторого введения в набор данных. Во-первых, набор данных получается с помощью метода под названием Flow-Seq. Это высокопроизводительный метод измерения уровней белка в различных последовательностях РНК, который позволяет одновременно измерять сотни тысяч различных последовательностей РНК в одном эксперименте.

На рисунке выше показаны две примерные строки набора данных. Первый столбец - это РНК-последовательность, в нем всего 9 букв, а нуклеотидные основания могут быть только A (аденин), U (урацил), C (цитозин) или G (гуанин). Для значения в R1-R8 он показывает количество клеток, появляющихся в каждой области, что указывает на уровень белка. Для последних двух столбцов, а именно dG_pairing и dG_folding. Существуют термодинамические характеристики, которые были оценены компьютерным путем по последовательности РНК. Эти две колонки не были получены в результате эксперимента в лаборатории, но биологи полагали, что они могут помочь в прогнозировании уровня белка. Однако требуется некоторый анализ, чтобы указать, полезны ли эти две функции, поскольку эти данные являются приблизительными и могут быть зашумленными и неинформативными.

Вернемся к основной цели этого проекта, которая заключается в изучении взаимосвязи между секвенированием РНК и уровнем белка. За эти несколько лет было проведено множество исследований по использованию контролируемой модели машинного обучения для проведения анализа РНК или даже ДНК, и результаты были выдающимися. Поэтому моя группа решила использовать модель машинного обучения, чтобы обеспечить лучшую визуализацию при проведении анализа последовательности РНК.

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

Очистка данных и разработка функций

Наш первый подход заключается в проведении исследовательского анализа для определения метода, используемого для очистки данных. Очистка данных чрезвычайно важна, поскольку она устраняет выбросы или даже преобразует данные в лучший формат, прежде чем подавать их в прогнозные модели, что способствует повышению производительности. Мы создали гистограмму с соотношением между суммой от R1 до R8 и количеством отсчетов. Гистограмма показана ниже

Из гистограммы мы обнаружили, что существует большое количество последовательностей с очень небольшим количеством выборок. Это может создать проблему для прогностических моделей. Эти выбросы могут предоставлять ложную информацию или вводить ложные отношения в процессе обучения прогностической модели, что, в свою очередь, ухудшает производительность моделей. Однако мы применили расстояние Хэмминга, показанное на рисунке ниже, чтобы глубже погрузиться в анализ набора данных и обнаружили еще один важный вывод. Мы обнаружили, что чем более похожи две последовательности РНК, тем более похожи размеры их выборок. Это означает, что если мы просто удалим эти выбросы, это может разрушить группы схожей последовательности РНК. Поэтому мы решили удалить только те последовательности РНК, размер выборки которых меньше 75, и обучить прогностические модели на очищенных и неочищенных наборах данных, чтобы изучить полезность нашего процесса очистки данных.

Кроме того, набор данных не в той форме, чтобы напрямую использовать какие-либо прогностические модели. Требуется выполнить некоторые манипуляции с данными. Например, последовательность РНК все еще находится в алфавитной форме, которую нельзя использовать ни в одной прогностической модели. В настоящее время существует три различных способа преобразования последовательности РНК: кодирование метки, кодирование одним горячим кодом и подсчет K-меров. Последний метод, подсчет K-mer, обычно используется для обработки естественного языка, который не будет использоваться в этом проекте. Поэтому мы выбрали горячее кодирование, так как оно больше подходит для прогностической модели, такой как искусственная нейронная сеть.

По сути, горячее кодирование преобразует РНК-последовательность, такую ​​как «ACGT», в [[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]]. Кодирование меток очень похоже на однократное кодирование, вместо создания двумерного массива оно преобразуется в один массив [0,25,0,50,0,75,1,0]. Ниже приведен код для создания one-hot enconding.

def one_hot_encoding(RNA_seq,n):
  pos_list = list() 
  label = dict(zip("ACGT",range(n)))
  for i in RNA_seq:
    pos_list.append(label[i])
  return np.eye(n)[pos_list]

Одна из основных проблем визуализации этого набора данных заключается в том, что целевая переменная не является одним значением, вместо этого она имеет 8 различных значений от R1 до R8. Следовательно, требуется преобразование целевой переменной. Я помню, что эта проблема стоила нам много времени, чтобы разобраться в ней. В конце концов, мы пришли к выводу о преобразовании его в так называемое «средневзвешенное значение нормализованных значений». Да, это может показаться слишком сложным, но в то время нас не беспокоило правильное название этой формулы. По сути, идея состоит в том, чтобы придать вес каждому региону. Например, R1 будет равно 0,5, R2 будет равно 1,5 и так далее. После этого количество клеток в каждом регионе умножается на собственный вес. Наконец, значения суммируются и нормализуются по сумме всех ячеек в R1-R8. Формула показана ниже:

где w — присвоенный вес, соответствующий региону, а R — количество ячеек, соответствующих региону.

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

Последняя часть, прежде чем приступить к обучению прогностической модели, заключается в изучении важности двух функций: dG_pairing и dG_folding. Владелец набора данных упомянул, что он может не иметь большой корреляции с целевой переменной. Поэтому мы использовали Random Forest для анализа важности каждой функции. Результат получился как dG_folding (0,12), dG_pairing (0,52) и РНК-последовательность (0,36), что показывает, что эти два признака коррелируют с целевой переменной. Помимо этих результатов, мы обнаружили, что отдельные последовательности, такие как A, C, G и U, имеют низкую корреляцию с целевой переменной. Однако корреляция стала значительно выше, когда эти отдельные последовательности объединены вместе, например, «CG» объединены вместе.

Прямо сейчас может быть самая интересная часть этого проекта, фаза обучения прогностических моделей. Мы решили построить три разные модели: линейную регрессию, случайный лес и сверточную нейронную сеть. После интенсивных исследований мы обнаружили, что случайный лес и сверточная нейронная сеть обычно используются для проведения анализа последовательности РНК и оказались чрезвычайно успешными. Для линейной регрессии он будет использоваться в качестве эталонной модели. Линейная регрессия и случайный лес построены с использованием библиотеки Scikit-Learn, а сверточная нейронная сеть построена с помощью Keras. Все реализации этих моделей можно легко найти в Интернете.

Кроме того, все прогностические модели, кроме линейной регрессии, подверглись настройке гиперпараметров для повышения производительности моделей. Для случайного леса гиперпараметрами, которые были настроены, являются количество деревьев, максимальная глубина дерева, максимальное количество признаков, минимальное разделение выборки и минимальный лист выборки. Описание гиперпараметров можно найти в этом среднем посте. Для сверточной нейронной сети настроенными гиперпараметрами являются размер ядра, скорость обучения и количество фильтров. Размер ядра определяет размер сверточного фильтра, скорость обучения указывает размер шага на каждой итерации, который движется к минимуму функции потерь. Наконец, количество фильтров — это, по сути, количество нейронов. Кроме того, при тестировании на различном количестве эпох мы обнаружили, что увеличение числа эпох приводит к переоснащению прогнозной модели. На рисунке ниже показана кривая потерь при обучении и проверке для CNN.

Производительность моделей прогнозирования

Поскольку целевая переменная в этом проекте является непрерывной переменной, мы использовали среднеквадратичную ошибку (MSE) в качестве функции потерь для оценки производительности моделей. Как упоминалось ранее на этапе очистки данных, очищенные данные могут привести к снижению производительности прогностических моделей. Поэтому мы обучали модели с двумя разными наборами данных. В нечистом наборе данных оценки следующие: линейная регрессия (0,914), случайный лес (0,422) и CNN (0,364). Для очищенного набора данных оценки следующие: линейная регрессия (1,131), случайный лес (0,701) и CNN (0,642). Основываясь на результате, мы выяснили, что подход к очистке данных не подходит и приводит к падению производительности прогностических моделей. Кроме того, Random Forest и CNN показали превосходную производительность по сравнению с линейной регрессией, чего мы и ожидали, поскольку линейная регрессия считается самым простым математическим алгоритмом по сравнению с двумя другими. Наконец, мы решили использовать CNN в качестве нашей окончательной модели для проведения анализа последовательности РНК.

Анализ секвенирования РНК

Стратегия проведения анализа РНК-секвенирования заключается в изменении нуклеотидных оснований, которые представляют собой A, C, G и U, и изучении изменения значения целевой переменной. Мы запрограммировали функцию, которая заменяет каждое нуклеотидное основание другим нуклеотидным основанием. Например, значение нуклеотида A будет заменено на C, G и U, размер выборки для каждого замененного нуклеотида составляет примерно 2000. Тот же процесс применяется к другому основанию нуклеотида, и все новые последовательности РНК вводятся в CNN для вывода. прогнозируемая целевая переменная. Наконец, мы сравнили значение целевой переменной до и после замены и визуализировали его с помощью Matplotlib. На рисунке ниже показано влияние конкретных изменений нуклеотидных оснований на целевую переменную.

Из этого рисунка мы узнали, что определенные изменения в нуклеотидных основаниях не влияют на уровень белка. Например, изменение нуклеотидного основания с A на G и U мало влияет на уровень белка. Это явление также имело место, когда G заменяли на A, а U заменяли на A. Второе открытие состоит в том, что изменение нуклеотидного основания на C или с C оказывает огромное влияние на уровень белка. Это показывает, что нуклеотидное основание С играет основную роль на уровне белка.

Кроме того, мы также провели анализ положения замененного нуклеотидного основания, которое показано на рисунке выше. Основываясь на рисунке, мы обнаружили, что любые изменения нуклеотидных оснований вблизи середины РНК-последовательности сильнее влияют на уровень белка.

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

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

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