Регрессия с использованием основных компонентов и ElasticNet | Навстречу AI

Прогнозирование относительного расположения КТ-срезов на КТ-изображениях

Прогнозирование относительного расположения КТ-срезов на осевой оси человеческого тела с использованием методов регрессии на очень многомерных данных

Регрессия - один из самых фундаментальных методов машинного обучения. Проще говоря, это означает «прогнозирование непрерывной переменной с помощью других независимых категориальных / непрерывных переменных». Проблема возникает, когда у нас есть высокая размерность, т.е. слишком много независимых переменных. В этой статье мы обсудим метод регрессионного моделирования с многомерными данными с использованием основных компонентов и ElasticNet. Мы также увидим, как сохранить эту модель для использования в будущем.

Получение данных и определение проблемы

Мы будем использовать Python 3.x в качестве языка программирования и «sci-kit learn», «seaborn» в качестве библиотек для этой статьи.

Используемые здесь данные можно найти в Репозитории машинного обучения UCI. Название набора данных - Относительное расположение срезов CT на наборе данных осевой оси. Он содержит извлеченные особенности медицинских изображений компьютерной томографии для различных пациентов (мужчин и женщин). Характеристики имеют числовой характер. Согласно UCI, цель состоит в предсказании относительного расположения КТ-среза на осевой оси человеческого тела.

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

Из вышеприведенного набора данных мы видим, что переменные с именами «значение0», «значение1», .. «значение383» содержат значения характеристик изображений компьютерной томографии для каждого пациента. Последняя переменная - «ссылка». Эта «ссылка» является нашей целевой переменной и содержит относительное расположение CT-среза.

Итак, наша проблема заключается в том, чтобы предсказать «упоминание» по другим функциям. Всего имеется 384 функции (независимые переменные, такие как «значение0», «значение1» и т. Д.), А общий размер набора данных составляет 53500. Поскольку наша целевая переменная «ссылка» является непрерывной по своей природе, это проблема регрессии.

Анализ данных

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

Во-первых, нам нужно удалить ненужную переменную ‘PatientId’, разделив функции и целевые переменные.

df = df.drop(['patientId'], axis=1)
df_y = df['reference']
df_x = df.drop(['reference'], axis=1)

Следовательно, фрейм данных «df_y» является нашей целевой переменной, а фрейм данных «df_x» содержит все функции.

Анализ главных компонентов (PCA) может выявить множество деталей и уменьшить количество функций. Посмотрим, как мы можем это сделать.

Мы сделали PCA, который может содержать до 95% дисперсии данных. Оказалось, что всего может быть 212 основных компонентов (ПК), ответственных за 95% отклонение.

«Pca_vectors» выглядят так:

Мы можем рассматривать эти ПК как функции. Таким образом, мы можем уменьшить габариты с 384 до 212 (уменьшение габаритов почти на 44,7%).

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

Теперь мы увидим, как эти ПК объясняют нашу целевую переменную «ссылка». Мы построим «график регрессии», используя первые 3 (наиболее важные) и последние 3 (наименее важные) ПК. (поскольку они отсортированы в порядке убывания по проценту объясненной дисперсии)

График регрессии

Мы видим, что первые 3 ПК являются довольно доминирующими и влияют на «эталонный». Далее идут последние 3 шт.

График регрессии

Поскольку линии регрессии почти параллельны оси x, мы можем сказать, что последние 3 ПК наименее важны.

Построение модели машинного обучения

Пришло время заняться реальной работой, т. Е. Построением модели. У нас уже есть набор функций. Мы будем использовать регуляризованную модель линейной регрессии. ElasticNet обеспечивает лучшую точность при работе с большим количеством функций. Это компромисс между регрессией «лассо» и «гребень». Его параметр регуляризации задается как α (альфа). Для α = 1 он становится «Lasso», а для α = 0 - «Ridge». Мы должны установить α между 0 и 1 для большей точности. α здесь гиперпараметр.

Во-первых, мы должны разделить данные на обучающий и тестовый набор.

Мы должны выполнить перекрестную проверку для оптимального гиперпараметра. Мы будем держать значения α в тестовом диапазоне (0,1, 0,3, 0,5, 0,7, 1,0).

Посмотрим на точность

print('R2 value : ', r2_en)

Модель объясняет почти 85% дисперсию. Это неплохо.

Посмотрим значения коэффициентов, значение α и точку пересечения

print('Intercept: ', regr_en.intercept_) 
print('Alpha: ', regr_en.alpha_) 
print('Coefficients: ' , regr_en.coef_)

Анализ результата

Мы получили точность 85% согласно методологии линейной регрессии. Теперь посмотрим, как на него повлияли самые важные и наименее важные ПК, как в предыдущем анализе.

Мы построим «график регрессии», используя оценочное «эталонное» значение нашей модели вместо исходного значения (в отличие от предыдущего анализа).

Использование первых 3 ПК

График регрессии

Использование последних 3 ПК

График регрессии

Мы увидели значительное улучшение на Рисунке 10 по сравнению с Рисунком 7. Это означает, что оценочные значения хорошие.

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

residuals = test_y - regr_en.predict(test_x)

Теперь мы увидим график остатка для тестовых данных.

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

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

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

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

pl_test_x[20:21]

"Ссылка" значение в исходном наборе данных

pl_test_y[20:21].values

Теперь давайте спрогнозируем "эталонное" значение, используя нашу модель, и сравним его с исходным значением набора данных.

pl_model.predict(pl_test_x[20:21])

Есть незначительное отклонение.

Сохранение модели для будущего использования

Мы можем сохранить модель и загрузить ее по запросу для дальнейшего использования.

Заключение

Мы узнали, как использовать основные компоненты для описания функций и зависимостей, построения регрессионной модели и прогнозирования значений. Есть и другие модели регрессии. Читатели этой статьи могут это попробовать. Блокнот Jupyter для этого можно найти на Github.

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

[1] Анализ основных компонентов - https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c

[2] Регрессия эластичной сети, лассо и гребня - https://medium.com/@yongddeng/regression-analysis-lasso-ridge-and-elastic-net-9e65dc61d6d3

Недавно я написал книгу по ML (https://twitter.com/bpbonline/status/1256146448346988546)