Комплексный проект, сочетающий химию и глубокое изучение графиков

Вот что мы собираемся выполнить, так это следующие задачи:

  1. Создайте настраиваемый набор данных графика, отформатированный для работы в DGL (основная тема в этом сообщении 😎)
  2. Подготовить наборы данных для обучения и тестирования в случайном порядке (полезно знать 👍)
  3. Определите сеть Conv Graph (кусок пирога 🍰)
  4. Тренируйте и оценивайте точность (как обычно 🧠)

1. Создайте собственный набор данных графа, отформатированный для работы в DGL.

Набор данных, с которым мы собираемся работать, взят из AIcrowd Learning to Smell Challenge и состоит из столбца со строкой SMILES, идентифицирующей данную молекулу, и второго столбца с названиями запахов этих молекул.



Например, вторая молекула в таблице ниже, диметилкарбонат-13C3, SMILES которого представляют собой COC (= O) OC, имеет запах, определяемый как «свежий, эфирный, фруктовый», что, безусловно, соответствует тому, что известно об этом веществе [1] . Существует более 100 различных ароматов, образующих неупорядоченные комбинации для всех этих 4316 молекул.

Затем мы хотим: а) преобразовать Smiles в график DGL для каждой молекулы, б) обозначить, имеет ли он фруктовый запах, и в) избавиться от любой проблемной молекулы. Следующие блоки кода обслуживают каждый из этих запросов:

а) Объект графа DGL должен быть определен для каждой молекулы. Мы можем сделать это с помощью RDKit, сначала сформировав объект mol RDKit из его УЛЫБКИ (строка 2). Поскольку мы хотим идентифицировать узлы и их соединения, мы можем получить матрицу смежности (строки 3 и 4). Индексы ненулевых значений идентифицируют узлы, которые связаны (строка 5), и дают узлы источника и назначения двунаправленного графа (строки 6 и 7).

Мы используем atom_to_feature_vector из библиотеки ogb [2] для создания векторов признаков для атомов.

Например, когда мы применяем feat_vec к строке COC (= O) CO, мы получаем:

обратите внимание, что каждая строка соответствует атому с 9 функциями. Эти характеристики представляют собой физико-химические свойства атомов, например, атомный номер, количество атомов водорода или наличие атома в кольце, среди прочего.

c) Теперь, когда у нас есть графики с характеристиками, пора определить метки. Как мы видели, каждая молекула связана более чем с одним запахом. Здесь для простоты проблема будет заключаться в бинарной классификации, чтобы определить, имеет ли молекула фруктовый запах. Следующий блок кода выполняет эту задачу, присваивая метке 1, если имеет фруктовый запах, и 0, если нет.

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

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

После всех этих шагов набор данных готов, но мы собираемся сделать следующий шаг, чтобы преобразовать его в набор данных DGL, чтобы беспрепятственно выполнять предварительную обработку и формирование обучающих и тестовых подмножеств. Здесь я процитирую обзор из официального руководства Создайте свой собственный набор данных, подготовленного командой DGL [3]:

Ваш собственный набор данных графа должен наследовать класс dgl.data.DGLDataset и реализовывать следующие методы:

__getitem__(self, i): получить i-й пример набора данных. Пример часто содержит один граф DGL, а иногда и его метку.

__len__(self): количество примеров в наборе данных.

process(self): загружать и обрабатывать необработанные данные с диска.

Метод обработки - это то место, где мы даем графам метки. Это можно было бы получить из файла, но в нашем случае это просто список графиков и список меток, преобразованный в тензор факела. Таким образом, это действительно простой класс:

Затем приступаем к построению поезда и тестированию случайной выборки. Такой способ имеет то преимущество, что вы можете установить размер партии. Здесь мы установили пять графиков на пакет:

3. Определите сеть переходов Graph

Мы находимся на пути к определению GCNN. В предыдущем посте я объяснил, как построен класс GCN. Каждый узел имеет тензор выходных признаков, поэтому для выполнения двоичной классификации мы можем установить длину выходных признаков, равную количеству классов (здесь два), а затем усреднить все узлы признаков с помощью dgl.mean_nodes, чтобы получить усредненное (двумерное ) тензор на график:

4. Тренируйте и оценивайте точность

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

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

Если вы хотите попробовать код, откройте этот Блокнот Colab. Если у вас возникнут вопросы, я с радостью отвечу. Наконец, рассмотрите возможность подписки на список рассылки:



и проверьте мои предыдущие сообщения:







Использованная литература:

1)



2)



3)