Сокращение размерности признакового пространства с помощью PCA

На предыдущем занятии мы с вами познакомились с идеей метода главных компонент (PCA – principal component analysis), который позволяет формировать новую ортонормированную систему координат в виде системы собственных векторов матрицы Грама признакового пространства:

В результате, информация локализуется в первых координатных осях:

И здесь возникает вопрос, почему такая локализация в принципе возможна? За счет чего это достигается? Ответ прост – за счет наличия линейных зависимостей между различными признаками  в образах выборки. И, наоборот, если в исходном признаковом пространстве нет линейных зависимостей, то метод главных компонент не покажет никакой локализации. Это очень важный момент в понимании работы PCA. Если мы изначально знаем, что признаки независимы, то нет смыла применять метод главных компонент. А, вот если мы предполагаем, что некоторые признаки могут являться линейными преобразованиями от других признаков:

то здесь метод главных компонент позволит выделить такие данные и, при необходимости, исключить их.

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

(Здесь ). А третий признак будет образован на основе первых двух следующей линейной комбинацией:

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

Давайте, теперь, для нашего трехмерного признакового пространства:

вычислим собственные векторы и числа, согласно уравнению:

Я это сделаю на языке Python с  использованием пакета NumPy:

import numpy as np
import matplotlib.pyplot as plt
 
SIZE = 1000
np.random.seed(123)
x = np.random.normal(size=SIZE)
y = np.random.normal(size=SIZE)
z = (x + y)/2
 
F = np.vstack([x, y, z])
FF = 1/ SIZE * F @ F.T
L, W = np.linalg.eig(FF)
WW = sorted(zip(L, W.T), key=lambda lx: lx[0], reverse=True)
WW = np.array([w[1] for w in WW])

В конце я отсортировал собственные векторы по убыванию собственных чисел. Если теперь вывести на экран собственные значения:

print(sorted(L, reverse=True))

то увидим величины:

[1.4018930165258354, 0.9841864212968794, 0.0]

Смотрите, последнее значение равно нулю. Оно, как раз, соответствует третьему признаку, который мы сформировали, как сумму первых двух. То есть, нулевое (или близкое к нулевому) значение собственного числа говорит нам о сильной линейной зависимости данного признака от других. А, значит, в новом признаковом пространстве:

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

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

Конечно, порог θ нужно подбирать индивидуально для каждой задачи. Универсального значения здесь нет. Да и метод главных компонент имеет смысл применять, если размерность исходного признакового пространства не превышает десятков тысяч. Если же число коэффициентов модели миллион и более, то здесь уже нужно смотреть в сторону L1-регуляризатора, который, как вы уже знаете, тоже позволяет отбирать признаки, зануляя незначимые коэффициенты.

Общность метода главных компонент и L2-регуляризации

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

Существует гипотеза, которая гласит:

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

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

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

Здесь  - целевые значения;  - линейная модель, прогнозирующая целевые переменные .

Этот показатель качества удобнее представить в векторно-матричном виде, если ввести следующие обозначения:

  • вектор-столбец целевых значений:
  • вектор-столбец весовых коэффициентов:
  • матрица образов обучающей выборки:

Тогда:

Решая аналитически задачу минимизации данного функционала относительно вектора весовых коэффициентов ω:

получаем оптимальное решение:

Так вот, переобучение здесь возникает, если матрица  оказывается плохо обусловленной (имеет почти линейно зависимые строки или столбцы). Тогда в векторе ω появляются очень большие и малые значения. Алгоритм с такими коэффициентами начинает вести себя неустойчиво на реальных данных. Чтобы этого избежать, к элементам главной диагонали матрицы  добавляют некоторое небольшое значение τ > 0:

где  - единичная матрица. Такой подход еще называют гребневой регрессией и соответствует L2-регуляризации коэффициентов ω. Об этом мы также уже подробно говорили, когда рассматривали L2-регуляризатор.

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

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

Таким образом, получается, что и метод главных компонент и L2-регуляризация, по сути, избавляются от мультиколлинеарности векторов признакового пространства. Как следствие, это приводит к заметно не нулевым значениям собственных чисел.

Видео по теме