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

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

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

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

Обучение на многообразии

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

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

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

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

Анализ главных компонент

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

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

где Xⱼ – это исходное пространство признаков X для всех признаков j, μ и σ – среднее значение и стандартное отклонение Xⱼ соответственно. Затем алгоритм вычисляет ковариационную матрицу S для стандартизированных данных:

выражая, как каждая переменная коррелирует со всеми остальными переменными. Затем PCA выполняет собственное разложение матрицы ковариации для определения собственных значений, λᵢ, и собственных векторов, vᵢ

Матрица, W, определяется этими собственными векторами, упорядоченными по убыванию собственных значений. Окончательная проекция преобразованных данных, Y, является просто произведением Z и W.

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

Интегрирование на локально-линейное пространство

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

Как ученого-исследователя данных вам необходимо определить количество ближайших соседей, k, что потребует тщательной настройки. Значение этого параметра для начала оптимизации – это массив весов Wᵢⱼ, который отображает каждую точку данных Xᵢ на касательную плоскость в виде линейной комбинации ее соседей:

подчиняющийся условию:

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

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

Спектральное интегрирование

Спектральное интегрирование (SE), также называемое интегрированием собственной карты Лапласиана, формирует граф сходства, который соединяет все точки данных вместе, которые затем взвешиваются на основе спектрального сходства между точками. Таким образом, SE не только сохраняет локальное отношение (как LLE), но и граф, связанный с этим, позволяет учесть глобальные отношения. Зависимость от спектральных свойств, наблюдаемых в графе Лапласиана, позволяет этому алгоритму выявлять сложные нелинейные структуры, которые другие методы могут не распознать.

Первый шаг этого алгоритма – построение графа:

где Wᵢⱼ – это ширина ребра между узлами i и j, и σ – настраиваемый параметр для контроля ширины окрестностей. Из него затем получается матрица графа Лапласиана, L, которая определяется как L=D-W, где W – матрица смежности графа, а D – диагональная матрица степеней со следующими элементами:

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

Изометрическое отображение функций

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

При построении графа вы можете выбрать ограничения для числа ближайших соседей, которых следует учитывать, и для относительного евклидова расстояния точки данных до ее соседей. Эти ограничения должны быть правильно настроены, например, не слишком большими, чтобы не образовывались сокращенные ребра (с утратой ключевой структурной информации), но и не слишком маленькими, чтобы не создать связный граф. Если эти условия окрестности удовлетворены, то между двумя узлами устанавливается ребро. С графом G алгоритм затем вычисляет геодезическое расстояние Dᵢⱼ между всеми парами точек с использованием алгоритма кратчайшего пути, такого как алгоритм Дейкстры или Флойда:

Последним шагом является отображение данных на подпространство, что включает применение MDS к Dᵢⱼ. Если мы вспомним ранее наш обзор метода PCA, мы оцениваем матрицу ковариации перед собственным разложением. MDS немного отличается тем, что вычисляет грамматическую матрицу B относительно матрицы центрирования H:

где e – это вектор из единиц, а n – количество точек данных. Окончательное вложение получается из d собственных векторов, соответствующих наибольшим собственным значениям:

Ввод шума

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

  1. Генерируйте замещающие наборы данных из исходного набора данных с добавлением гауссового шума, дисперсия которого мы будем масштабировать для каждого последующего замещающего набора.
  2. Вставьте эти наборы данных с использованием набора методов обучения на многообразии.
  3. Для каждого метода сравните внедренные с шумом вложения с вложением исходного пространства (без синтетического добавления шума) с помощью анализа Прокруста, популярного статистического метода сравнения двух форм. Этот метод оценки повернет, масштабирует и переместит одно пространство на другое с целью минимизировать сумму квадратов различий между каждой точкой данных. Это различие является мерой сходства, которая будет анализироваться для определения того, насколько хорошо каждый метод вложения преодолевает шум.
  4. Последний шаг – построить график изменения расстояния Прокруста относительно уровня синтетического добавочного шума, что позволит сделать выводы о производительности каждого метода.

Применим вышеуказанные шаги к классическому набору данных S-кривой:

import matplotlib.pyplot as pltfrom sklearn import manifold, datasetsimport numpy as npfrom scipy.spatial import procrustesfrom sklearn.decomposition import PCAdef compute_procrustes_distances(data, embedding_technique, max_noise, noise_step=0.05):    """    Вычисляет расстояния Прокруста для различных уровней гауссового шума.    Параметры:        data (np.array): Исходный набор данных.        embedding_technique (object): Экземпляр метода обучения многообразия.        max_noise (float): Максимальный уровень добавляемого шума.        noise_step (float): Приращение шага для добавления шума.    Возвращает:        list: Список расстояний Прокруста для каждого уровня шума.    """    base_embedding = embedding_technique.fit_transform(data)    noise_levels = np.arange(0, max_noise, noise_step)    distances = []    for noise in noise_levels:        noisy_data = data + np.random.normal(-noise, noise, data.shape)        noisy_embedding = embedding_technique.fit_transform(noisy_data)        _, _, disparity = procrustes(base_embedding, noisy_embedding)        distances.append(disparity)        return distancesdef plot_data(X, colour):    """    Визуализирует набор данных в 3D.    Параметры:        X (np.array): Точки данных.        colour (np.array): Цветовое отображение для точек данных.    """    fig = plt.figure(figsize=(30, 10))    ax = fig.add_subplot(111, projection='3d')    ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=colour, cmap=plt.cm.Spectral)    ax.view_init(4, -72)    plt.show()def plot_procrustes_distances(noise_range, distances, labels):    """    Визуализирует расстояния Прокруста для различных методов вложения.    Параметры:        noise_range (np.array): Диапазон уровней шума.        distances (dict): Словарь расстояний для каждого метода вложения.        labels (list): Список меток для каждого метода вложения.    """    plt.figure(figsize=(10, 6))    for label in labels:        plt.plot(noise_range, distances[label], label=label)    plt.xlabel('Диапазон шума')    plt.ylabel('Расстояние Прокруста')    plt.title('Сравнение методов вложения')    plt.legend()    plt.show()# Создание и визуализация набора данных S-кривойX, colour = datasets.make_s_curve(1000, random_state=0)plot_data(X, colour)# Вычисление расстояний Прокруста для различных методов вложенияmax_noise = 2noise_range = np.arange(0, max_noise, 0.05)embedding_techniques = {    "PCA": PCA(2),    "ISOMAP": manifold.Isomap(n_components=2),    "LLE": manifold.LocallyLinearEmbedding(n_neighbors=10, n_components=2),    "SE": manifold.SpectralEmbedding(n_components=2, n_neighbors=10)}distances = {label: compute_procrustes_distances(X, technique, max_noise) for label, technique in embedding_techniques.items()}# Визуализация вычисленных расстояний Прокрустапlot_procrustes_distances(noise_range, distances, embedding_techniques.keys())

Конечно, в реальных приложениях мы не будем знать истинную структуру, как в этом примере. Однако на данный момент давайте предположим, что мы не знаем истинную структуру. Что мы можем получить из графика выше? Фундаментально хорошая тенденция должна напоминать сигмоидную кривую, где в начале мы видим устойчивость к небольшому количеству шума с очень похожим вложением на исходное пространство, однако в некоторый момент это уже не так, так как шум разрушает исходную структуру. На этом этапе мы ожидаем резкого увеличения расстояния Прокруста при последующих вложениях, где захватывается шум с малым или без смысловой информации. Учитывая это и график выше, мы можем сделать следующие выводы:

PCA: Хотя расстояние Прокруста увеличивается с уровнем шума, тенденция достаточно линейна и, следовательно, вероятно не улавливает достаточную информацию об истинной структуре. Без учета других тенденций это однозначно говорит о необходимости использования нелинейного вложения.

LLE: Мы видим очень малую устойчивость даже к незначительным количествам шума, что, вероятно, связано с нарушением ключевого предположения о локальной линейности. Увеличение k, количество ближайших соседей, может уменьшить хрупкость этой вложенности, но это может привести к потере деталей (информации) в полученном подпространстве.

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

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

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

# Создание и построение набора данных S-криваяX, color = datasets.make_swiss_roll(1000, random_state=0)plot_data(X, color)# Вычисление расстояний Прокруста для разных методов вложенияmax_noise = 4noise_range = np.arange(0, max_noise, 0.05)embedding_techniques = {    "PCA": PCA(2),    "ISOMAP": manifold.Isomap(n_components=2),    "LLE": manifold.LocallyLinearEmbedding(n_neighbors=10, n_components=2),    "SE": manifold.SpectralEmbedding(n_components=2, n_neighbors=10)}distances = {label: compute_procrustes_distances(X, technique, max_noise) for label, technique in embedding_techniques.items()}# Построение вычисленных расстояний Прокрустаplot_procrustes_distances(noise_range, distances, embedding_techniques.keys())

Используя те же функции, описанные ранее, мы получаем вышеуказанные тенденции расстояний Прокруста для каждого метода вложения. Очевидно, что структура внутри этих данных значительно нелинейна, так как мы видим, что PCA плохо улавливает подлежащую структуру. Константная нелинейность в исходном пространстве также дополнительно подчеркивается плохими результатами LLE, вероятно, из-за неоднородного отображения соседних точек на касательные плоскости. Опять же, методы SE и ISOMAP показывают хорошие результаты, при этом последний немного превосходит первый, быстрее приближаясь к расстоянию Прокруста 1 после разрушения структуры шумом. Не было бы неразумно предположить, что SE захватывает некоторый шум во всех вложениях, что можно исправить настройкой параметров. Настройка этих алгоритмов может улучшить обобщение и соответствие встраиваемых данных, вот пример этого для вышеуказанного метода ISOMAP:

import numpy as npfrom scipy.spatial import procrustesimport matplotlib.pyplot as pltfrom sklearn import manifold, datasetsdef return_procrustes_distance(data, embedding_technique, max_noise, noise_step=0.05):    """    Вычислить расстояние Прокруста для различных уровней шума.    Параметры:        data (array_like): Исходные данные для встраивания.        embedding_technique (object): Метод вложения (например, PCA, SpectralEmbedding).        max_noise (float): Максимальный уровень шума для добавления.        noise_step (float): Шаг инкремента для уровня шума.    Возвращает:        list: Список расстояний Прокруста для каждого уровня шума.    """    embeddings = []    distances = []    noise_range = np.arange(0, max_noise, noise_step)    for noise_level in noise_range:        noisy_data = data + np.random.normal(0, noise_level, data.shape)        embedded_data = embedding_technique.fit_transform(noisy_data)        if not embeddings:  # если список вложений пустой            embeddings.append(embedded_data)        _, _, disparity = procrustes(embeddings[0], embedded_data)        distances.append(disparity)    return distances# Генерация набора данных S-криваяX, _ = datasets.make_swiss_roll(1000, random_state=0)# Параметрыmax_noise = 2k_values = [5, 7, 9]  # Разные значения k для ISOMAP# Вычисление и построение расстояний Прокруста для каждого значения knoise_levels = np.arange(0, max_noise, 0.05)plt.figure(figsize=(10, 6))for k in k_values:    embedding = manifold.Isomap(n_components=2, n_neighbors=k)    procrustes_distances = return_procrustes_distance(X, embedding, max_noise)    plt.plot(noise_levels, procrustes_distances, label=f'ISOMAP (k={k})')plt.xlabel('Уровень шума')plt.ylabel('Расстояние Прокруста')plt.title('Расстояние Прокруста по уровню шума для разных k в ISOMAP')plt.legend()plt.show()

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

Вывод

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

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

Если не указано иное, все изображения принадлежат автору.