Введение в новый метод уменьшения размерности.
Введение
Алгоритмы уменьшения размерности, такие как 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.