После «части I», в которой дается введение о том, как импортировать, обрабатывать и анализировать набор данных тандемных масс-спектров с использованием Python и сопоставлений, «часть II» добавит в игру Spec2Vec, инструмент машинного обучения для оценки сходства спектров.

[последнее изменение: 12.08.2021, с использованием spec2vec версии 0.5.0]

В части I этого руководства была представлена ​​библиотека Python matchms для импорта, обработки и сравнения данных тандемной масс-спектрометрии. Мы импортировали набор данных MS / MS со спектрами натуральных продуктов, которые мы скачали из GNPS. Затем данные были обработаны с использованием сопоставлений для получения более надежных метаданных и удаления возможных шумовых пиков. В основном это включало:

  • очистка метаданных
  • нормализация пиковой интенсивности
  • удаление небольших пиков (здесь просто: ‹0,01 максимальной интенсивности пика)

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

Теперь перейдем к Spec2Vec! Spec2Vec - это метод машинного обучения без учителя, который может изучать взаимосвязи между пиками из одновременного появления в больших (r) наборах данных MS / MS. Он в основном основан на алгоритме Word2Vec, который хорошо известен в области обработки естественного языка.

Spec2Vec можно использовать двумя принципиально разными способами.

(1) Загрузка модели Spec2Vec, которая была предварительно обучена на большом наборе данных MS / MS.

(2) Модель Spec2Vec можно обучить на самом наборе данных. Для этого необходимы достаточно большие наборы данных (не менее нескольких сотен спектров).

Мы сделаем обе вещи в следующей части этого урока.

Получение необходимых пакетов

Если вы уже выполняли часть I раньше, вы можете просто добавить spec2vec с помощью pip install spec2vec>=0.5.0. В противном случае вы можете создать новую среду, выполнив следующее:

conda create --name spec2vec python=3.8
conda activate spec2vec
conda install --channel nlesc --channel bioconda --channel conda-forge spec2vec>=0.5.0

Импортируйте обработанные данные из части I

Если вы выполнили импорт и обработку данных, как показано в части I, вы можете просто продолжить оттуда, например путем импорта данных, которые были сохранены после обработки:

import os
import numpy as np
from matchms.importing import load_from_json
path_data = os.path.join(os.path.dirname(os.getcwd()), "data") #"..." enter your pathname to the downloaded file
file_json = os.path.join(path_data, "GNPS-NIH-NATURALPRODUCTSLIBRARY_processed.json")
spectrums = list(load_from_json(file_json))

1. Загрузите предварительно обученную модель Spec2Vec.

Для многих случаев использования мы бы не советовали переобучать новую модель с нуля. Вместо этого можно просто загрузить более общую модель, обученную на большом наборе данных MS / MS, и использовать ее для вычисления сходства даже для спектров, которые не были частью начального обучения модели.

Здесь мы можем загрузить модель, обученную примерно 95 000 спектрам из GNPS (режим положительных ионов), которую можно загрузить с Zenodo.
Теперь давайте импортируем эту модель.

import gensim
path_model = os.path.join(os.path.dirname(os.getcwd()),
                          "data", "trained_models") 
                           # enter your path name when different
filename_model = "spec2vec_AllPositive_ratio05_filtered_201101_iter_15.model"
filename = os.path.join(path_model, filename_model)
model = gensim.models.Word2Vec.load(filename)

Очень важно убедиться, что «документы» создаются так же, как и при обучении модели. В основном это сводится к количеству десятичных знаков, которое должно быть таким же, как и для предварительно обученной модели. Чтобы проверить слова, которые выучила модель, мы можем взглянуть на model.wv, который представляет собой «словарь», который выучила модель. Давайте, например, посмотрим, как выглядит слово:

model.wv.index_to_key[0]

Это должно дать [email protected], что также говорит нам о том, что модель была обучена на словах с двумя десятичными знаками (вместо Spec2Vec < 0.5.0 вам нужно запустить next(iter(model.wv.vocab)).

Вычислить сходство спектра

А теперь самое интересное. Имея оба спектра и обученную модель, мы можем начать вычислять сходство спектра Spec2Vec. Сначала мы инициализируем Spec2Vec, запустив:

from spec2vec import Spec2Vec
spec2vec_similarity = Spec2Vec(model=model,
                               intensity_weighting_power=0.5,
                               allowed_missing_percentage=5.0)

Помимо использования ранее загруженного model, мы устанавливаем два параметра. Сама модель преобразует пики спектра (здесь: «слова») в абстрактные векторы («вложения»), которые затем складываются, чтобы дать нам вложение спектра. Параметр intensity_weighting_power определяет, в какой степени его интенсивности мы масштабируем каждый вектор слова, обычно мы используем 0.5. allowed_missing_percentage указывает, какой процент спектра может быть неизвестен используемой модели.

Давайте теперь вычислим некоторые фактические сходства спектров Spec2Vec, например, между всеми возможными парами в нашем списке спектров, запустив:

from matchms import calculate_scores
scores = calculate_scores(spectrums, spectrums, spec2vec_similarity,
                          is_symmetric=True)

В приведенном здесь примере мы устанавливаем is_symmetric=True, чтобы указать, что оба входных параметра одинаковы (вычисление может быть немного быстрее, потому что оценка [i, j] = оценка [j, i]). В общем, если вы хотите получить сходство Spec2Vec между двумя разными списками спектров, вам нужно будет запустить:

scores = calculate_scores(spectrums1, spectrums2,
                          spec2vec_similarity)

Вы можете заметить напечатанное предупреждение «Найдено 1 слово (а) в модели». Взвешенный процент пропусков, не охваченных данной моделью, составляет 0,19% ».. Не волнуйся. Это просто означает, что 1 слово (= 1 пик), которое встречается в нашем spectrums , не было частью загруженной модели. В зависимости от того, насколько важен этот пик (его интенсивность), это может быть проблемой. Однако здесь это соответствует только отсутствующему проценту для этого конкретного спектра 0,19%, что намного ниже установленного выше порога allowed_missing_percentage=5.0. Если бы оно было выше установленного порога, прогон завершится неудачно, и в этом случае вам придется либо удалить соответствующие спектры, либо переобучить модель, либо установить порог на более высокое значение.

Следующее даст вам лучшие результаты Spec2Vec для конкретного спектра (здесь в качестве примера я использовал spectrums[11]).

best_matches = scores.scores_by_query(spectrums[11], sort=True)[:10]
[x[1] for x in best_matches]

Для большинства исследователей более интересными могут быть УЛЫБКИ из спектров с лучшими оценками, доступ к которым можно получить аналогичным образом.

[x[0].get("smiles") for x in best_matches]

Соответствующие соединения также могут быть построены, что мы также сделаем позже во 2-й части этого раздела (с новой моделью, обученной с нуля).

Вместо того, чтобы смотреть на несколько отдельных спектров запросов, давайте посмотрим на «большую картину», построив часть матрицы оценки сходства, которую мы только что вычислили для создания рисунка 2.

from matplotlib import pyplot as plt
plt.figure(figsize=(6,6), dpi=150)
plt.imshow(scores.scores[:50, :50], cmap="viridis")
plt.colorbar(shrink=0.7)
plt.title("Spec2Vec spectra similarities")
plt.xlabel("Spectrum #ID")
plt.ylabel("Spectrum #ID")
plt.clim(0, 1)  # Spec2Vec scores can be between -1 and 1
#plt.savefig("spec2vec_scores.png")

2. Обучите новую модель Spec2Vec с нуля.

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

Во-первых, данные спектра должны быть преобразованы в «документы», где пики и нейтральные потери стали «словами» (например, [email protected]). Это можно сделать, запустив:

from spec2vec import SpectrumDocument
spectrum_documents = [SpectrumDocument(s, n_decimals=2) for s in spectrums]

Затем новую модель можно просто обучить с помощью train_new_word2vec_model. Следующий код создаст новую модель, которая обучена для 25 итераций (для людей, занимающихся машинным обучением: это «эпохи») на 2 рабочих процессах (вы можете изменить это, например, на 4, если у вас 4 ядра, но разница несущественная. ). В зависимости от вашего оборудования обучение этой модели не должно занимать больше пары минут.

from spec2vec.model_building import train_new_word2vec_model
model_file = "tutorial_model.model"
model = train_new_word2vec_model(spectrum_documents, iterations=[25], filename=model_file,
                                 workers=2, progress_logger=True)

Приведенный выше фрагмент кода автоматически сохранит модель под именем tutorial_model.model, которую позже можно будет загрузить снова, запустив model = gensim.models.Word2Vec.load("tutorial_model.model").

Вычислить сходство спектра

Как только у нас есть обученная модель, мы снова можем (как и выше с предварительно обученной моделью) вычислить сходство спектра.

from matchms import calculate_scores
from spec2vec import Spec2Vec
spec2vec_similarity = Spec2Vec(model=model, intensity_weighting_power=0.5,
                               allowed_missing_percentage=5.0)
scores = calculate_scores(spectrum_documents, spectrum_documents, spec2vec_similarity, is_symmetric=True)

Здесь мы снова можем искать наиболее подходящие соединения согласно Spec2Vec.

best_matches = scores.scores_by_query(spectrum_documents[11], sort=True)[:10]
[x[0].get("smiles") for x in best_matches]

И мы можем отобразить полученные улыбки в файлах .png, запустив:

from rdkit import Chem
from rdkit.Chem import Draw
for i, smiles in enumerate([x[0].get("smiles") for x in best_matches]):
    m = Chem.MolFromSmiles(smiles)
    Draw.MolToFile(m, f"compound_{i}.png")

8 лучших совпадений показаны на Рисунке 3.

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

OK. Готово на данный момент. Действительно любопытно посмотреть, что вы можете получить от Spec2Vec!

Другие части этого руководства

Часть I - Создайте собственный конвейер масс-спектрометрии

Часть II - Вычисление сходства спектров с помощью Spec2Vec

Часть III - Сетевой анализ на основе сходства спектров

библиотека матчей

matchms находится в свободном доступе с открытым исходным кодом. Вы можете найти код на Github, пакет доступен как conda package (рекомендуется) или from pypi. Он был разработан группой очень хороших людей (см. Здесь) и опубликован в Joss.

библиотека spec2vec

Spec2Vec, конечно, также находится в свободном доступе с открытым исходным кодом. Вы можете найти код на Github, пакет доступен как conda package (рекомендуется) или from pypi. Статью, опубликованную в PLOS Computational Biology, можно найти здесь.

Вы можете найти больше информации в документации matchms и spec2vec.

Код

Код, показанный в этом сообщении блога, также можно найти как записную книжку Jupyter на GitHub.

Помогите нам развивать matchms и spec2vec дальше!

Мы действительно надеемся, что сопоставления помогут людям создавать новые, более совершенные конвейеры анализа и что spec2vec может улучшить результаты вашего анализа. Итак, пожалуйста, помогите нам улучшить matchms и spec2vec. Вы можете помочь нам, (1) цитируя нашу работу, если вы используете наш пакет для своих исследований: статья matchms в JOSS, статья spec2vec в PLOS Computational Biology.
(2) Сообщите нам, если у вас возникнут какие-либо проблемы с использованием matchms и / или spec2vec, или если вам не хватает каких-либо ключевых функций! Вы можете просто сделать это, запустив новый выпуск в репозитории matchms GitHub или связаться со мной в твиттере @me_datapoint.
Вы, конечно, можете также стать активным участником пакета и помочь расширить его функциональность!
(3) Сообщите нам, успешно ли вы применили matchms и / или spec2vec в своем исследовательском проекте (нас радует + мы можем поделиться хорошими новостями!).

Большое спасибо!

Я хотел бы поблагодарить Карлоса Мартинеса-Ортиса, Джастина ван дер Хофта и Kontoueftychia за полезные комментарии и предложения по этому сообщению в блоге.