Найти в Дзене
Николай Лазарев

Разбор полётов ML модели для прогнозирования модуля упругости

В прошлой статье описан проект применения машинного обучения в материаловедении для прогнозирования модуля объёмной упругости. При анализе проекта от куратора получены крайне ценные замечания, которые можно учесть в последующих работах. Я решил подготовить отдельную статью, т.к. материала достаточно много. Напомню, что из базы данных MaterialsProject изначально были выгружены следующие признаки: 'point_group_tgs' - точечная группа симметрии 'symbol_pgs' - пространственная группа симметрии 'crystal_system_syngony' - сингония 'composition' - химический состав материала 'formula' - упрощенная химическая формула 'e_above_hull' - энергия выше кривой устойчивости 'structure' - полное описание кристаллической структуры материала 'density' - плотность материала 'volume' - объем ячейки кристалла 'bulk_modulus' - объемный модуль упругости Признаки composition и structure были разбиты на составляющие. И в результате обработки данных в итоговом датасете содержались следующие поля: Общие признаки с
Оглавление

В прошлой статье описан проект применения машинного обучения в материаловедении для прогнозирования модуля объёмной упругости.

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

GPT не устаёт клепать веселые картинки))
GPT не устаёт клепать веселые картинки))

Признаки

Напомню, что из базы данных MaterialsProject изначально были выгружены следующие признаки:

'point_group_tgs' - точечная группа симметрии

'symbol_pgs' - пространственная группа симметрии

'crystal_system_syngony' - сингония

'composition' - химический состав материала

'formula' - упрощенная химическая формула

'e_above_hull' - энергия выше кривой устойчивости

'structure' - полное описание кристаллической структуры материала

'density' - плотность материала

'volume' - объем ячейки кристалла

'bulk_modulus' - объемный модуль упругости

Признаки composition и structure были разбиты на составляющие. И в результате обработки данных в итоговом датасете содержались следующие поля:

Общие признаки структуры:

'point_group_tgs' - точечная группа симметрии

'symbol_pgs' - пространственная группа симметрии

'crystal_system_syngony' - сингония

'e_above_hull' — энергия выше кривой устойчивости

'density' — плотность материала

'cell_volume' — объем элементарной ячейки кристалла

'count_atoms' — количество атомов в структуре

'lattice_a', 'lattice_b', 'lattice_c', — длины векторов решетки

'angle_alpha', 'angle_beta', 'angle_gamma'  — углы между векторами решетки

'pbc_a', 'pbc_b', 'pbc_c' — периодические граничные условия

'sum_atomic_mass' — суммарная атомная массы структуры

'norm_atomic_mass' — нормированная суммарная атомная массы структуры

Признаки картезианских атомных координат:

'atom_coord_cart_mean_x', 'atom_coord_cart_mean_y', 'atom_coord_cart_mean_z', 'atom_coord_cart_std_x',   'atom_coord_cart_std_y', 'atom_coord_cart_std_z', 'atom_coord_cart_min_x', 'atom_coord_cart_min_y',   'atom_coord_cart_min_z', 'atom_coord_cart_max_x', 'atom_coord_cart_max_y', 'atom_coord_cart_max_z',

Признаки межатомных расстояний:

'interatomic_distance_avg' - среднее межатомное расстояние

'interatomic_distance_std' - стандартное отклонение межатомного расстояния

Минимальное и максимальное межатомное расстояние:

'interatomic_distance_min', 'interatomic_distance_max'

Относительные межатомные расстояния относительно центра масс:

'atom_coord_relative_mean_x', 'atom_coord_relative_mean_y', 'atom_coord_relative_mean_z',

'atom_coord_relative_std_x', 'atom_coord_relative_std_y', 'atom_coord_relative_std_z',

'atom_coord_relative_min_x', 'atom_coord_relative_min_y', 'atom_coord_relative_min_z',

'atom_coord_relative_max_x', 'atom_coord_relative_max_y', 'atom_coord_relative_max_z'

Признаки агрегации дробных координат:

'atom_coord_frac_mean_x', 'atom_coord_frac_mean_y', 'atom_coord_frac_mean_z', 'atom_coord_frac_std_x',   'atom_coord_frac_std_y', 'atom_coord_frac_std_z', 'atom_coord_frac_min_x', 'atom_coord_frac_min_y',   'atom_coord_frac_min_z', 'atom_coord_frac_max_x', 'atom_coord_frac_max_y', 'atom_coord_frac_max_z'

Признаки координационных чисел в структуре:

'coord_numb_mean', 'coord_numb_std', 'coord_numb_min', 'coord_numb_max'

Количество атомов хим.элементов в структуре:

'El_1', 'El_2', 'El_3', 'El_4', 'El_5', 'El_6', 'El_7', 'El_8', 'El_9', 'El_10', 'El_11', 'El_12', 'El_13', 'El_14', 'El_15', 'El_16', 'El_17', 'El_18', 'El_19', 'El_20', 'El_21', 'El_22', 'El_23', 'El_24', 'El_25', 'El_26', 'El_27', 'El_28', 'El_29', 'El_30', 'El_31', 'El_32', 'El_33', 'El_34', 'El_35', 'El_36', 'El_37', 'El_38', 'El_39', 'El_40', 'El_41', 'El_42', 'El_43', 'El_44', 'El_45', 'El_46', 'El_47', 'El_48', 'El_49', 'El_50', 'El_51', 'El_52', 'El_53', 'El_54', 'El_55', 'El_56', 'El_57', 'El_58', 'El_59', 'El_60', 'El_61', 'El_62', 'El_63', 'El_64', 'El_65', 'El_66', 'El_67', 'El_68', 'El_69', 'El_70', 'El_71', 'El_72', 'El_73', 'El_74', 'El_75', 'El_76', 'El_77', 'El_78', 'El_79', 'El_80', 'El_81', 'El_82', 'El_83', 'El_84', 'El_85', 'El_86', 'El_87', 'El_88', 'El_89', 'El_90', 'El_91', 'El_92', 'El_93', 'El_94', 'El_95', 'El_96', 'El_97', 'El_98', 'El_99', 'El_100', 'El_101', 'El_102', 'El_103', 'El_104', 'El_105', 'El_106', 'El_107', 'El_108', 'El_109', 'El_110', 'El_111', 'El_112', 'El_113', 'El_114', 'El_115', 'El_116', 'El_117', 'El_118', 'El_119',

'bulk_modulus_vrh' - целевой признак, объемный модуль упругости

Замечания по признакам

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

'cell_volume' — объем элементарной ячейки кристалла. Это неправильная интерпретация. В данном поле не всегда представлен объём элементарной ячейки, это может быть и супер ячейка. Поэтому признак является ошибочным, и нужно подумать как его нормировать, привести к единому знаменателю.

В нашем случае будет правильным привести объём ячейки на количество атомов в данной ячейке.

Получим приведенный объём ячейки на один атом.
Получим приведенный объём ячейки на один атом.

Необходимо исключить признак e_above_hull - энергия выше кривой устойчивости. Изначально я выяснил, что данный признак относится к метастабильности материала. Это важный показатель, который используется для определения устойчивости фаз материала. Но мне было объяснено, что данный показатель имеет трудоёмкий алгоритм вычисления. Его вычислить сложнее даже чем прогнозируемую величину модуля упругости с помощью трудоёмких методов квантовой механики. Поэтому при формировании реальных датасетов использовать его не имеет смысла.

'lattice_a', 'lattice_b', 'lattice_c', — длины векторов решетки. 'angle_alpha', 'angle_beta', 'angle_gamma'  — углы между векторами решетки. Бесполезные для модели признаки, их нужно удалить. Т.к. любую кристаллическую решетку можно описать бесконечным количеством разных длин векторов и углов.

Необходимо включить в датасет категориальный признак симметрии. Это одна из важнейших характеристик кристаллической структуры. В итоге уже только после полученного замечания в начальный запрос к базе данных был включён признак 'symmetry' - информация о симметрии.

Признаки рассчитанные на основе межатомных расстояний ('interatomic_distance_avg' - среднее межатомное расстояние, 'interatomic_distance_std' - стандартное отклонение межатомного расстояния, Минимальное и максимальное межатомное расстояние) также характеризуют симметрию кристаллической структуры, являются полезными хоть и не основными. Их оставляем!

Библиотека matminer

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

Matminer — это библиотека Python, специально разработанная для автоматизации процесса извлечения и создания новых признаков для материалов. Она интегрируется с такими библиотеками, как pymatgen, и предоставляет удобный интерфейс для генерации большого количества полезных признаков (features) на основе различных данных о материалах, включая информацию о структуре, химическом составе и других свойствах.

Возможности Matminer:

1. Извлечение признаков (Feature extraction):

- Matminer содержит множество готовых методов для извлечения признаков из материалов, таких как структурные, химические, энергетические и другие.

- Библиотека поддерживает такие источники данных, как химическая формула, кристаллическая структура, поверхности материалов и энергетические свойства.

2. Автоматизация создания признаков:

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

- Признаки можно извлекать как для одиночных элементов, так и для сложных кристаллических структур.

3. Интеграция с pymatgen:

- Matminer хорошо интегрируется с pymatgen, поэтому можно использовать существующие объекты Structure или Composition для создания признаков.

4. Готовые наборы признаков:

- В matminer есть несколько наборов признаков (feature sets), которые можно применять к различным типам данных (структуры, составы, энергоемкие данные и т.д.). Эти признаки базируются на известных моделях и эмпирических правилах.

Пример использования Matminer для создания новых признаков:

1. Извлечение признаков из химического состава:

Для работы с химическим составом можно использовать модуль Composition и извлечь различные химические и физические свойства.

pip install matminer

Пример
Пример

- ElementProperty — извлекает свойства элементов на основе заранее обученных данных.

- Stoichiometry — вычисляет стехиометрические характеристики.

- ValenceOrbital — анализирует валентные орбитали элементов.

- IonProperty — извлекает свойства, связанные с ионными состояниями.

2. Извлечение признаков из кристаллической структуры:

Matminer может извлекать множество признаков, связанных с геометрией кристаллической структуры. Например, для анализа симметрии, координационных чисел, плотности и других свойств.

Пример
Пример

Здесь использовано несколько featurizers:

- DensityFeatures — извлекает признаки, связанные с плотностью структуры (массовая плотность, атомная плотность и т.д.).

- GlobalSymmetryFeatures — извлекает признаки, связанные с глобальной симметрией структуры (например, группа симметрии).

- RadialDistributionFunction — извлекает признаки, связанные с радиальным распределением атомов.

3. Извлечение признаков из данных энергетики:

Вы также можете использовать matminer для извлечения признаков на основе энергетических характеристик материала, таких как энергия Гиббса, энергия связи и другие.

4. Извлечение сложных признаков (compound-based):

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

Основные featurizers в Matminer:

- Composition: для химических составов (примеры: атомные массы, электроотрицательности, радиусы).

- Structure: для кристаллических структур (примеры: симметрия, координационные числа, плотность).

- Bandstructure и DOS: для энергетических характеристик (примеры: электронные свойства, плотность состояний).

Преимущества Matminer:

- Автоматизация: Она существенно упрощает процесс создания признаков для задач материаловедения.

- Гибкость: Matminer поддерживает работу с данными разных типов, будь то химические формулы или кристаллические структуры.

- Интеграция: Библиотека легко интегрируется с pymatgen и другими популярными инструментами для анализа материалов.

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

Особенности валидации моделей для материаловедения

И хотя Штирлиц знал, что запоминается только первая и последняя фраза, но я вынужден разместить основную главу в центре статьи))). Признаки должны были идти первыми главами. Необычная валидация - это действительно наверное самое главное, что мне удалось узнать. Итак, оказывается есть особый подход при валидации ML-моделей в материаловедении! Если при кросс-валидации разбивка на обучающую и тестовую выборку происходит случайным образом, то в нашем случае данная разбивка может проходить по определенной логике.

Обращаю Ваше внимание на статью наших учёных-материаловедов из моего родного НИТУ МИСиС. В данной статье описывается использование машинного обучения для прогнозирования упругих свойств сплавов на основе титана и циркония в ОЦК-структуре. Нас интересует глава 3.2 где подробно описан процесс валидации моделей. Я был вынужден прочитать материал несколько раз прежде чем осознал суть. Надеюсь, что моя интерпретация поможет сократить Вам время освоения материала!

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

  • "New elements prediction": Из обучающей выборки исключаются составы, содержащие определённый легирующий элемент, а затем модель тестируется на этих составах.
    Цель: оценить способность модели предсказывать свойства сплавов с новыми элементами.
  • "Leave-one-out": Один состав исключается из обучающей выборки, а затем используется для тестирования.
    Цель: проверить точность предсказаний для новых концентраций элементов внутри известных систем.
  • "New systems prediction": Из обучающей выборки исключаются данные о системах (сочетаниях базового элемента и легирующих элементов), которые затем используются для тестирования.
    Цель: проверить способность модели экстраполировать свойства на новые системы, которые ранее не встречались.

Прошу прощения, но поскольку информация крайне интересная, продублирую ещё раз но уже более подробно, с примерами!

1. "New elements prediction" (Предсказание для новых элементов)

Суть:

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

Пример:

  • Исключается из обучения: Все сплавы Ti-Mo, Zr-Mo и Ti-Mo-X (где X — другие элементы, например, Nb, Ta).
  • Остается в обучении: Сплавы без Mo, например, Ti-Nb, Ti-Ta, Zr-Nb, Zr-Ta.
  • Тестируется на:Ti-Mo, Zr-Mo, Ti-Mo-Ta, Ti-Mo-Nb.

Цель: Проверить способность модели предсказывать свойства новых систем с легирующим элементом, который ранее не был представлен в обучающих данных.

2. "Leave-one-out" (Оставление одной точки вне обучения)

Суть:

  • Из обучающей выборки исключается один конкретный состав (одна концентрация), а модель обучается на остальных данных.
  • Затем исключенный состав используется для тестирования.

Пример:

  • Рассмотрим систему Ti-Mo.
  • Исключается из обучения: Состав Ti-80Mo-20 (80% титана, 20% молибдена).
  • Остается в обучении: Другие концентрации из той же системы, например, Ti-90Mo-10, Ti-70Mo-30.
  • Тестируется на:Ti-80Mo-20.

Цель: Проверить способность модели интерполировать свойства для новых концентраций в уже известных системах.

3. "New systems prediction" (Предсказание для новых систем)

Суть:

  • Из обучающей выборки исключается вся система, например, сплавы Ti-Mo.
  • Модель обучается на других системах (например, Ti-Nb, Ti-Ta) и затем тестируется на полностью новой системе (Ti-Mo).

Пример:

  • Исключается из обучения: Все сплавы Ti-Mo и Ti-Mo-X (где X — любые другие элементы, например, Nb, Ta).
  • Остается в обучении: Все сплавы других систем, например:Ti-Nb, Ti-Ta, Zr-Nb, Zr-Ta.
  • Тестируется на:Ti-Mo, Ti-Mo-Ta, Ti-Mo-Nb.

Цель: Проверить способность модели экстраполировать свойства на совершенно новую систему, не представленную в обучающих данных.

Ключевые различия между типами тестирования
Ключевые различия между типами тестирования

Вопрос по второму типу тестирования

А вот теперь, скажите себе честно, вот вроде всё понятно. В первом типе тестирования мы убираем какой-нибудь элемент. Во втором, мы убираем конкретные концентрации элементов. В третьем убираем систему из выбранных элементов. Но у меня сразу возник вопрос по второму типу тестирования, а чем он отличается от обычной кросс-валидации? Какая-то одна строка с указанной концентрацией уходит в тестовую выборку. В чём новизна, всё как обычно?

Оказывается, в статье "Leave-one-out" рассматривается не как случайное исключение тестовой точки, а как систематическое исключение одного конкретного состава на каждом шаге. В этом смысле, все концентрации по одному составу проходят исключение по очереди.

Пример:

  • Если обучающий датафрейм содержит концентрации:Ti-90Mo-10, Ti-80Mo-20, Ti-70Mo-30,
  • Тогда "Leave-one-out":На 1-м шаге исключается Ti-90Mo-10, а остальные используются для обучения.
    На 2-м шаге исключается Ti-80Mo-20, остальные обучаются.
    На 3-м шаге исключается Ti-70Mo-30, остальные обучаются.

Этот процесс отличается от стандартной кросс-валидации, в которой данные разделяются случайным образом на K подвыборок без такой систематической ротации исключения.

Почему "Leave-one-out" здесь не профанация?

  • В реальных экспериментах систематическое исключение одного состава позволяет проверить, насколько модель может интерполировать конкретные концентрации в рамках одной системы.
  • Например, модель должна быть способной предсказать Ti-80Mo-20, имея только Ti-70Mo-30 и Ti-90Mo-10 в обучении. Это важно для проверки способности модели "заполнять пробелы" между уже известными точками.

Фолды и сэмплы

Также для информации стоит отметить, что в "Leave-one-out" количество фолдов равно количеству сэмплов в данных. Например:

  • Если в наборе данных 100 сэмплов, то будет 100 фолдов.
  • Каждый фолд исключает один сэмпл из обучения, делая его тестовым.

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

Пример:

Каждый указанный состав является сэмплом:

Ti-90Mo-10,
Ti-80Mo-20,
Ti-70Mo-30.

В "Leave-one-out" каждый сэмпл по очереди становится тестовым, а остальные используются для обучения.

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

В "Leave-one-out" каждый сэмпл поочередно исключается из обучения, и на каждом шаге модель тестируется только на этом исключенном сэмпле.

Пример:

Допустим, у нас есть 3 записи в данных:

Ti-90Mo-10
Ti-80Mo-20
Ti-70Mo-30

Тогда процесс "Leave-one-out" будет иметь 3 фолда:

Фолд 1: исключается Ti-90Mo-10; модель обучается на Ti-80Mo-20 и Ti-70Mo-30.
Фолд 2: исключается Ti-80Mo-20; модель обучается на Ti-90Mo-10 и Ti-70Mo-30.
Фолд 3: исключается Ti-70Mo-30; модель обучается на Ti-90Mo-10 и Ti-80Mo-20.

Если в своих проектах по прогнозированию свойств материалов Вы примените описанный подход, то это будет очень круто! Это будет определенно hi level))

Сохранение состояния модели PICKLE

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

pickle — это модуль в Python, который позволяет сериализовать и десериализовать объекты, то есть сохранять объекты в файл и загружать их обратно. Сериализация (или "консервирование") — это процесс преобразования объекта в байтовый поток, который можно сохранить, а затем восстановить.

Почему pickle полезен в проектах машинного обучения:

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

Портативность: Сохраненную модель можно загрузить и использовать в другом скрипте или даже на другом устройстве.

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

Соответствующий раздел реализован в моём обновлённом проекте

Загружаем библиотеку
Загружаем библиотеку
Всё очень просто
Всё очень просто

Приемлемая точность

Ещё стоит упомянуть, что для похожих проектов прогнозирования объёмного модуля упругости (bulk_modulus) существует приемлемая точность.

Для поликристаллов это до 10 ГПа. Связано с тем, что свойства поликристаллов усреднены и более устойчивы к вариациям в составе.

Для монокристаллов до 1 ГПа. Это более строгий стандарт, так как свойства монокристаллов зависят от анизотропии структуры и более чувствительны к изменениям состава.

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

  • Отношение модулей сдвига к объемному модулю (G/B).
  • Коэффициент Пуассона или упругие константы (например, C44).

Включение таких параметров в качестве признаков в модель может значительно улучшить точность прогнозов.

Метод SISSO

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

Данный метод хорошо описан в приведенной статье. https://uspex-team.org/static/online_courses/thermoelectric_materials/Lecture_13.pdf

Его цель - оптимально сформировать и отобрать релевантные признаки для прогнозирования целевого свойства.

Метод SISSO (Sure Independence Screening and Sparsifying Operator) — это специализированный алгоритм, разработанный для задач материаловедения, и в стандартных библиотеках Python он не реализован. Чтобы использовать SISSO, требуется специализированное ПО или библиотека, созданная для работы с SISSO, такая как SISSO++, которая обычно работает отдельно от Python.

Планирую освоить работу с этим методом в будущих проектах.

Заключение

Надеюсь перечисленная в статье информация будет полезной для Вас. Лично для меня получение таких ценных замечаний было очень важным событием.

Частично указанные замечания отражены в обновлённой версии проекта, но конечно львиную долю ещё предстоит реализовать!