Использование Pycaret, OpenFace, Pandas и другой магии Python

Фон

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

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

Подготовка данных

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

Чтобы узнать больше о базе данных Delaware Pain, прочтите статью ниже:



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



Движения мышц лица также известны как «единицы действия». Каждая единица действия, извлеченная из OpenFace, представляет собой непрерывную переменную по шкале от 0 до 5, представляющую интенсивность выражения. Интенсивность единиц действия была приведена в соответствие с меткой боли или нейтральной метки из базы данных боли Делавэра в файле .xlsx. Эти данные использовались для обучения модели.

Изображения, проанализированные OpenFace, сначала были загружены из репозитория Delaware Pain Database.

Как указывалось ранее, каждая фотография была помечена заранее (болезненная или нейтральная). Каталог изображений был проанализирован с помощью функции OpenFace FaceLandmarkImg в командной строке.

!FaceLandmarkImg.exe -fdir <directory_of_pain_neutral>

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

Настройка данных модели

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





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

Загрузка данных

Pandas читает наши данные, а dataset.sample рандомизирует индекс.

import pandas as pd
dataset = pd.read_excel("combined_pain_csv.xlsx")
dataset = dataset.sample(frac=1).reset_index(drop=True)
dataset

Разделение данных

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

data = dataset.sample(frac=0.95, random_state=786)
data_unseen = dataset.drop(data.index)
data.reset_index(inplace=True, drop=True)
data_unseen.reset_index(inplace=True, drop=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions ' + str(data_unseen.shape))

Импорт Pycaret

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

  • Регресс
  • Классификация
  • Обнаружение аномалий
  • Кластеризация
  • Обработка естественного языка
  • Майнинг правил ассоциации

Поскольку наша модель будет стремиться различать прогнозы на основе двух классов, мы импортируем pycaret.classification для создания модели классификации.

from pycaret.classification import *

Создание эксперимента

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

exp_clf102 = setup(data = data, target = 'class')

Для целей этого эксперимента боль обозначена 1, а никакая боль не обозначена 0. Таким образом, наш целевой класс - это ярлыки «боль / нейтральный», а наши 17 характеристик - это интенсивности различных движений лицевых мышц.

Сравнить модели

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

# Compare metrics of 24 different machine learning models 
top3 = compare_models(n_select = 3)

Как видно из таблицы, Extra Tress Classifier - самая эффективная модель с нашими данными, за ней следуют Light Gradient Boosting Machine и Logistic Regression.

Наивысшие баллы по каждому показателю выделяются желтым цветом.

Создать модель

Затем мы создаем модель на основе нашего анализа лучших моделей сверху. Blend_models Pycaret позволяет нам создать классификатор голосования из трех верхних моделей в нашей таблице. Следовательно, наша модель - et + lightgbm + lr, и наша система голосования принимает предсказание по крайней мере двух моделей в соответствии.

Наш смешанный классификатор работает лучше, чем один дополнительный классификатор.

Оценить производительность модели

Pycaret упрощает нам оценку производительности нашей модели с помощью Assessment_model.

Мы можем просмотреть классификацию этикеток с помощью матрицы неточностей.

Мы также можем просмотреть график AUC.

Настройте и доработайте модель

Давайте внесем последние штрихи в модель, настроив и доработав.

tune = tune_model(blend)
final = finalize_model(tune)
predict_model(final)

После настройки и доработки наша модель достигает 100% точности!

Заключение

Так вот оно! Мы научили компьютер предсказывать выражение боли на основе набора изображений боли и нейтральных поз. Наша модель предсказывала метки «боль / нейтральный» на основе интенсивности мышечных движений на основе анализа лица. Автоматизированные системы с машинным обучением - это будущее исследований и лечения боли. С помощью этих инструментов мы можем найти быстрые и точные способы контроля боли.

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

Похожие статьи от автора -





Спасибо за чтение!!