Введение в новый метод уменьшения размерности.

Введение

Алгоритмы уменьшения размерности, такие как LDA, PCA или t-SNE, являются отличными инструментами для анализа немаркированных (или помеченных) данных и получения дополнительной информации об их структуре и закономерностях. Снижение размерности дает нам возможность визуализировать наборы данных большой размерности, которые могут быть чрезвычайно полезны при выборе модели. Я считаю, что это подмножество машинного обучения - назовем его исследованием данных - сильно недоработано по сравнению с его аналогами (такими как контролируемое обучение или глубокое обучение).

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

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

Идея BPDR была вдохновлена ​​компрессором изображений, который я написал для класса в колледже. Идея заключается в битовой упаковке: кодирование различных точек данных в одну длинную двоичную строку.

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

Алгоритм

Общий обзор алгоритма следующий: исходные столбцы данных (все должны быть числовыми) сначала ранжируются по важности. Затем данные нормализуются для центрирования вокруг 0. Затем создаются N 128-битных строк для представления n_components, до которых мы пытаемся сократить. Нормализованные данные двоично упаковываются в 128-битные строки в порядке важности их характеристик. Наконец, у нас остались упакованные двоичные числа, которые можно преобразовать обратно в целые числа.

Для набора данных из 4 столбцов, который будет сокращен до 2 столбцов, двоичная упаковка выглядит следующим образом:

binary string 1 -> 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0  (128-bits)
                  | most important  |2nd important col|
                   -----------------------------------
binary string 2 -> 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0  (128-bits)
                  |3rd important col|4th important col|
                   -----------------------------------
-> repeat this packing for each row

Еще раз, этот раздел сделан как общий обзор того, как работает алгоритм, однако он не очень глубок.

Как использовать BPDR

Я структурировал модуль BPDR таким образом, чтобы он имитировал работу других алгоритмов измерения размерности в пакете Scikit-Learn. Вот пример его использования в наборе данных радужной оболочки глаза.

Во-первых, репозиторий BPDR нужно клонировать с GitHub. После перехода в каталог BPDR запустите pip install -r requirements.txt, чтобы получить нужные пакеты для запуска алгоритма. Теперь мы, наконец, готовы открыть новый файл и начать изучение данных.

Во-первых, мы должны импортировать необходимые пакеты в наш модуль: очевидно, что мы будем использовать BPDR, а также популярный набор данных iris и matplotlib для некоторой визуализации:

from bitpack import BPDR
from sklearn import datasets
import matplotlib.pyplot as plt

Затем мы загружаем наш набор данных:

iris = datasets.load_iris()
iris_data = iris.data
iris_targets = iris.target
>>> iris_data[0]
[5.1 3.5 1.4 0.2]

Мы видим, что есть 4 столбца (все числовые). Давайте сократим этот набор данных до 2 столбцов, чтобы мы могли построить график и визуализировать уменьшенные компоненты. Сначала нам нужно создать экземпляр объекта сокращения и инициализировать его параметры.

bpdr = BPDR(n_components=2)

Затем, вызывая функцию fit_transform, переданные данные будут сокращены и возвращены в новом массиве:

bpdr_data = bpdr.fit_transform(iris_data, iris_targets)
>>> bpdr_data[0]
[7.686143364045647e+17, 4.0992764608243425e+18]

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

>>> print(bpdr.variances)
[3.476833771196913e+36, 4.83034889579370e+36, 9.75667133492751e+36]
>>> print(bpdr.scaled_variances)
[0.5774239158754918, 0.8022123454852088, 1.6203637386392993]
>>> print(bpdr.mean_variance)
6.021284667306044e+36

Для получения дополнительной информации о том, как рассчитываются эти отклонения, посетите документацию репозитория.

Наконец, теперь у нас есть набор данных шириной в 2 столбца, который можно изобразить и визуализировать. Когда компонент 1 изображен на оси X, а компонент 2 - на оси Y, график выглядит следующим образом:

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

Сокращение BPDR фактически создает набор данных, который более линейно разделяется, чем PCA. Это не означает, что BPDR - лучший алгоритм для всех данных, это просто означает, что его стоит изучить, особенно при выполнении моделей линейной регрессии.

Весь код для этой статьи доступен в Jupyter Notebook в репозитории GitHub.