Снижение размерности данных python

Снижаем размерность

Всем привет! Рассмотрю два популярных алгоритма уменьшения размерности, а именно T-distributed Stochastic Neighbor Embedding (t-SNE) и Uniform Manifold Approximation and Projection (UMAP). Их удобно использовать, когда необходимо визуализировать данные с большим количеством параметром (также будем называть это размерностью данных).

Оба алгоритма осуществляют преобразование данных большой размерности в меньшую. На выходе, обычно, получают два измерения, оси которых или расстояния между полученным объектами не поддаются прямой интерпретации, в отличии, например, от метода главных компонент (Principal component analysis, PCA).

Указанное выше не значит, что PCA лучше рассматриваемых нами алгоритмов. По своей сути они различны. PCA является линейным алгоритмом, присваивающим равные веса всем попарным расстояниям. Что касается t-SNE и UMAP, то они не линейны, и умеют определять приоритеты расстояний между соседями, что дает возможность выявить внутреннюю двумерность данных. При этом отличие t-SNE от UMAP заключается в том, что последний лучше сохраняет глобальную структуру при выводе итоговых результатов.

Сравним оба алгоритма на примере базы изображений COIL-20, созданной сотрудниками лаборатории CAVE Колумбийского университета, США. База содержит изображения 20 предметов по 76 штук изображений на каждый из 20 предметов Рис 1.

Рис.1

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

data = [] path = 'datasets/coil-20-proc/' for file in os.listdir(path): im = Image.open('datasets/coil-20-proc/'+file) pixels = list(im.getdata()) cl = int(file.split('__')[0][3:]) data.append([cl] + pixels) df = pd.DataFrame(data) df.columns = ['label'] + ['a<>'.format(i) for i in range(df.shape[1]-1)]

Мы получили матрицу с параметрами рассматриваемых изображений и теперь можем применять t-SNE и UMAP.

tsne = TSNE() embedding_tsne = tsne.fit_transform(df.drop('label', axis = 1)) umap = UMAP() embedding_umap = umap.fit_transform(df.drop('label', axis = 1))

Рис.2

Заметно, что UMAP уплотнил данные и развел большинство из них сильнее, чем t-SNE (рис 2). При этом UMAP затратил на работу 29 секунд, а t-SNE около 103 секунд. С этой точки зрения UMAP выглядит предпочтительнее. Однако, существует мнение, что такое сравнение не корректно, из-за стохастического характера t-SNE. Для нивелирования данного момента необходимо сделать t-SNE детерминированным, инициализировав через PCA. Давайте попробуем это сделать, применив PCA также к UMAP.

Хотя данные изображения визуально выглядят приятнее, но получились они менее плотные (рис.3). Попытки поработать с параметрами алгоритмов t-SNE и UMAP в контексте инициализации через PCA существенного изменения изображений выше не дали. Таким образом можно сделать вывод, что для нашего случая применение PCA не оправдано. А значит вывод о предпочтительности UMAP, остается прежним.

Давайте рассмотрим основные параметры алгоритма UMAP:

A) n_components – это размерность итоговых данных. Для двухмерного представления необходимо установить значение 2, для трехмерного, соответственно, 3.

B) n-neighbours – определяет работу алгоритма с глобальной структурой данных. Значение по умолчанию установлено 15. Чем большая величина задается, тем большее количество соседних значений рассматривает UMAP, то есть смещает свое внимание с локальной структуры данных в пользу глобальной.

Рис. 4

На рисунке 4 видно, что данные лучше всего разделились при значениях n_neighbors равным пяти и восьми. Это обусловлено небольшим размером рассматриваемого нами датасета.

C) min_dist – параметр задает минимальное расстояние для точек в итоговом представлении меньшей размерности. По умолчанию величина 0.1.

Рис. 5

При устремлении параметра к нулю алгоритм начинает искать различия внутри полученных кластеров. При увеличении – внутренние различия стираются и структура данных представляется в виде единого целого (рис.5).

D) spread – задает максимальное расстояние между точками в группе. По умолчанию значение равно 1. В сочетании с min_dist определяет на сколько сгруппированы и разгруппированы точки.

В сочетании с min_dist, позволяет более тонко балансировать между отражением внутренней структуры и глобальной картины. (рис.6)

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

Источник

Новая библиотека для уменьшения размерности данных ITMO_FS — зачем она нужна и как устроена

Студенты и сотрудники лаборатории Машинного обучения Университета ИТМО разработали библиотеку для Python, которая решает ключевую задачу машинного обучения.

Расскажем, почему появился этот инструмент и что он умеет.

Нехватка алгоритмов

Одна из ключевых задач машинного обучения — снижение размерности данных. Дата-саентисты сокращают число переменных, вычленяя среди них значения, наибольшим образом влияющие на результат. После этой операции модель машинного обучения требует меньше памяти, работает быстрее и качественнее. Пример ниже показывает, что исключение дублирующих признаков увеличивает точность классификации с 0,903 до 0,943.

>>> from sklearn.linear_model import SGDClassifier >>> from ITMO_FS.embedded import MOS >>> X, y = make_classification(n_samples=300, n_features=10, random_state=0, n_informative=2) >>> sel = MOS() >>> trX = sel.fit_transform(X, y, smote=False) >>> cl1 = SGDClassifier() >>> cl1.fit(X, y) >>> cl1.score(X, y) 0.9033333333333333 >>> cl2 = SGDClassifier() >>> cl2.fit(trX, y) >>> cl2.score(trX, y) 0.9433333333333334

Существует два подхода к уменьшению размерности — конструирование и выбор признаков. В областях вроде биоинформатики и медицины чаще используют последний, так как он позволяет выделить значимые признаки с сохранением семантики, то есть не меняет исходный смысл признаков. Однако в самых распространенных библиотеках машинного обучения на Python — scikit-learn, pytorch, keras, tensorflow — нет полноценного набора методов выбора признаков.

Для решения этой проблемы студенты и аспиранты Университета ИТМО разработали открытую библиотеку — ITMO_FS. Над ней трудится команда под руководством Ивана Сметанникова, доцента факультета информационных технологий и программирования, заместителя заведующего лабораторией Машинного обучения. Ведущий разработчик — Никита Пильненьский, закончивший магистратуру «Машинное обучение и анализ данных». Теперь он поступает в аспирантуру.

«За последние несколько лет в нашу лабораторию приходили запросы на решение задач, для которых не подходил стандартный инструментарий. Например, нам требовались ансамблирующие алгоритмы на основе объединения фильтров, или алгоритмы, учитывающие наличие заранее известных (экспертно-размеченных) значимых признаков.

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

Что умеет библиотека

ITMO_FS реализована на Python и совместима со scikit-learn, которая де-факто считается основным инструментом анализа данных. Ее селекторы признаков принимают те же параметры:

data: array-like (2-D list, pandas.Dataframe, numpy.array); targets: array-like (1-D list, pandas.Series, numpy.array).

Библиотека поддерживает все классические подходы к отбору признаков — фильтры, обертки и встраиваемые методы. Среди них числятся такие алгоритмы, как фильтры на основе корреляций Спирмена и Пирсона, критерий соответствия (Fit Criterion), QPFS, hill climbing filter и другие.

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

Какие есть аналоги

Библиотек алгоритмов выбора признаков существует не так много — особенно на Python. Одной из крупных считают разработку инженеров из Государственного университета Аризоны (ASU). Она поддерживает большое количество алгоритмов, но последнее время почти не обновляется.

В самой scikit-learn также есть несколько механизмов выбора признаков, но на практике их оказывается недостаточно.

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

Перспективы проекта

Авторы ITMO_FS планируют интегрировать свой продукт с scikit-learn, добавив его в список официально совместимых библиотек. На данный момент библиотека уже содержит наибольшее среди всех библиотек число алгоритмов выбора признаков, но их добавление продолжается. Дальше на дорожной карте добавление новых алгоритмов, включая собственные разработки.

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

Ожидается, что ITMO_FS найдет применение в областях медицины и биоинформатики — в таких задачах, как диагностика различных раковых заболеваний, построение прогностических моделей фенотипических характеристик (например, возраста человека) и синтез лекарственных препаратов.

Где скачать

Если вас заинтересовал проект ITMO_FS, вы можете скачать библиотеку и опробовать её на практике — вот репозиторий на GitHub. Начальная версия документации доступна на readthedocs. Там же можно посмотреть инструкцию по установке (поддерживается pip). Мы будем рады любой обратной связи.

Дополнительные материалы из нашего блога на Хабре:

Источник

Читайте также:  Php свойства get set
Оцените статью