Как справиться с проклятием размерности

Авторы: Вайшнави Малхотра и Неда Золактаф

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

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

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

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

Что такое PCA? 🤔

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

Предположим, у нас есть n наблюдений и d переменных в нашем наборе данных, и мы хотим изучить взаимосвязь между различными переменными в рамках EDA. Для большего значения d, скажем 60, мы получим d (d-1) / 2 двух -мерных диаграмм рассеяния. Такое огромное количество графиков (в данном случае 1770), безусловно, затрудняет определение взаимосвязи между объектами. Кроме того, эти двухмерные графики содержат только часть всей информации, содержащейся в наборе данных.

И тут на сцену выходит PCA. PCA - это метод извлечения признаков - он объединяет входные переменные определенным образом, а затем избавляется от «наименее важных» переменных, сохраняя при этом наиболее ценные части (или главные компоненты ) всех переменных!

Вы говорите "Основные компоненты"?

Главный компонент - это нормализованная линейная комбинация исходных объектов в наборе данных. Предположим, мы начали с d-мерных векторов и хотим суммировать их, проецируя их вниз в k-мерное подпространство так, чтобы оси нового подпространства указывали в направлениях самая высокая дисперсия данных. Нашим окончательным результатом будет проекция исходных векторов на направления k, обозначенная как Основные компоненты (ПК).

Как видно из графика (Рис. 1), направление первого главного компонента (сплошная зеленая линия) имеет максимальное отклонение данных, и оно также определяет линию, которая ближайший ко всем n наблюдениям. Первый главный компонент захватывает большую часть информации, содержащейся в функциях, так что чем больше вариативность, фиксируемая первым ПК, тем больше информации фиксируется компонентом.

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

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

Но сколько основных компонентов нам нужно?

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

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

Кривая, показанная на рис. 3, количественно определяет, какая часть общей 200-мерной дисперсии содержится в первых n компонентах. Например, мы видим, что с гранями первые 40 компонентов содержат более 80% дисперсии, в то время как нам нужно около 150 компонентов для описания почти 100% дисперсии.

Где бы вы использовали PCA?

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

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

Как же формулируется PCA?

Дана матрица X,, которая соответствует n наблюдениям с d функциями , и входом k , основная цель PCA - разложить матрицу X на две меньшие матрицы, Z и W, такое, что X = ZW, где Z имеет размеры n * k, а W имеет размеры k * d (см. рис. 4). Каждая строка Z представляет собой факторную нагрузку. Каждая строка W называется главным компонентом.

В PCA мы минимизируем квадратичную ошибку следующей целевой функции:

Существует три общих подхода к решению PCA, которые мы описываем ниже.

  1. Разложение по сингулярным значениям (SVD)
    В этом подходе сначала используется алгоритм разложения по сингулярным значениям (SVD) для поиска ортогонального W. Затем он использует ортогональный W для вычисления Z следующим образом.

2. Альтернативная минимизация
Это итеративный подход, в котором чередуются:

  • Исправление Z и поиск оптимальных значений для W

  • Исправление W и поиск оптимальных значений для Z

3. Стохастический градиентный спуск
Это итерационный подход, когда матрица X очень велика. На каждой итерации он выбирает случайный пример i и содержит j и обновляет W и Z как

PCA в действии: сокращение функций

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

Данные содержат четыре атрибута: длина чашелистики, ширина чашелистика, длина лепестка, ширина лепестка трех видов, а именно Setosa, Versicolor, Virginica

После применения PCA 95% отклонение улавливается двумя основными компонентами.

PCA в действии: извлечение признаков

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

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

Скачивание и просмотр данных

Мы загрузим данные лиц из sklearn.datasets.fetch_lfw_people. Набор данных состоит из 1867 изображений, каждое с разрешением 62x47.

import numpy as np
import matplotlib.pyplot as plt
import warnings
from sklearn.datasets import fetch_lfw_people
# Download dataset
with warnings.catch_warnings():
    warnings.filterwarnings("ignore",category=DeprecationWarning)
    faces = fetch_lfw_people(min_faces_per_person=40)
# plot images
fig, axes = plt.subplots(3, 10, figsize=(12, 4),
                         subplot_kw={'xticks':[], 'yticks':[]},
                         gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i, ax in enumerate(axes.flat):
    ax.imshow(faces.data[i].reshape(62, 47), cmap='bone')

Применение PCA к набору данных

Чтобы создать быструю демонстрацию, мы просто используем модуль PCA scikit-learn для уменьшения размеров набора данных лиц и выбора 150 компонентов (собственных лиц), чтобы максимизировать дисперсию набора данных.

from sklearn.decomposition import PCA
faces_pca = PCA(n_components=150, svd_solver=’randomized’).fit(faces.data)
# Plot principal components
fig, axes = plt.subplots(3, 10, figsize=(12, 4),
                         subplot_kw={'xticks':[], 'yticks':[]},
                         gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i, ax in enumerate(axes.flat):
    ax.imshow(faces_pca.components_[i].reshape(62, 47), cmap='bone')

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

components = faces_pca.transform(faces.data)
projected = faces_pca.inverse_transform(components)
# Plot the results
fig, ax = plt.subplots(2, 15, figsize=(15, 2.5),
 subplot_kw={‘xticks’:[], ‘yticks’:[]},
 gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i in range(15):
 ax[0, i].imshow(faces.data[i].reshape(62, 47), cmap=’binary_r’)
 ax[1, i].imshow(projected[i].reshape(62, 47), cmap=’binary_r’)
 
ax[0, 0].set_ylabel(‘complete\nresolution’)
ax[1, 0].set_ylabel(‘150-D\nprojections’);

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

То, что нужно запомнить

Вот некоторые важные моменты, которые следует помнить при выполнении PCA:

  1. Перед проведением PCA данные должны быть сначала нормализованы. Это важно, поскольку разные переменные в наборе данных могут измеряться в разных единицах. PCA для ненормализованного набора данных приводит к более высоким собственным значениям для переменной, имеющей максимальную дисперсию, соответствующую собственному вектору ее первого ПК.
  2. PCA может применяться только к числовым данным. Таким образом, если данные также содержат категориальные переменные, их необходимо преобразовать в числовые значения. Такие переменные могут быть представлены с использованием схемы кодирования 1 из N без искусственного упорядочивания.
  3. Однако PCA НЕ следует проводить, когда большинство независимых функций являются категориальными. Вместо этого CATPCA можно использовать для преобразования категорий в числовые значения с помощью оптимального масштабирования.

Что мы узнали?

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

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

Литература и ссылки