Подробное объяснение наиболее широко используемого метода уменьшения размерности.

Кто-нибудь сталкивался с ситуацией, связанной с большим количеством переменных при построении модели, и беспокоился о низкой точности и эффективности? В таком случае вам на помощь придет анализ основных компонентов (PCA) ✌️

Что такое анализ главных компонентов (PCA)?

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

Необходимость PCA?

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

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

Мы собираемся использовать набор данных Pizza с 8 переменными. Вы можете найти набор данных [здесь].

Ниже приведены несколько первых записей набора данных Pizza. «Бренд» - целевая переменная, а остальные - независимые переменные.

Удаляем столбец «Бренд», так как нам нужно делать PCA только для независимых переменных.

Пройдем по шагам

👉 Шаг 1. Стандартизация данных

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

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

Из библиотеки sklearn мы можем использовать приведенный ниже код для стандартизации данных.

from sklearn.preprocessing import StandardScaler
df_std = StandardScaler().fit_transform(df)
df_std

👉 Шаг 2. Вычисление ковариационной матрицы со стандартизованными данными

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

Если запись в матрице имеет отрицательный знак, это означает, что они косвенно пропорциональны друг другу. Положительный знак означает, что они прямо пропорциональны.

df_cov_matrix = np.cov(df_std.T)
df_cov_matrix

👉 Шаг 3. Вычисление собственных векторов и собственных значений ковариационной матрицы

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

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

Чтобы узнать больше о собственных векторах и собственных значениях, посетите эту [ссылку]

eig_vals, eig_vecs = np.linalg.eig(df_cov_matrix)
print(‘Eigenvectors \n%s’ %eig_vecs)
print(‘\nEigenvalues \n%s’ %eig_vals)

👉 Шаг 4. Сортировка списка собственных значений в порядке убывания

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

eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]
print(‘Eigenvalues in descending order:’)
for i in eig_pairs:
 print(i[0])

👉 Шаг 5. Выбор количества основных компонентов

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

total = sum(eig_vals)
var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)]
cum_var_exp = np.cumsum(var_exp)
print(“Variance captured by each component is \n”,var_exp)
print(“Cumulative variance captured as we travel with each component \n”,cum_var_exp)

Из приведенного выше мы видим, что первый главный компонент (PC1) улавливает в целом 60% дисперсии, за ним следует PC2 с дисперсией 32,7%.

Из совокупной дисперсии в целом 92% приходится на 2 компонента, а 98% дисперсии объясняются первыми 3 компонентами. Следовательно, мы можем решить, что количество основных компонентов для нашего набора данных равно 3.

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

pca = PCA().fit(df_std)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel(‘No of components’)
plt.ylabel(‘Cumulative explained variance’)
plt.show()

👉 Шаг 6. Создание основных компонентов

С учетом всех шагов, упомянутых выше, мы определили, что количество компонентов, необходимых для нашего набора данных, составляет 3 с учетом максимальной дисперсии.

from sklearn.decomposition import PCA
pca = PCA(n_components = 3)
pcs = pca.fit_transform(df_std)
df_new = pd.DataFrame(data=pcs, columns={‘PC1’,’PC2',’PC3'})
df_new[‘target’] = df1[‘Brand’] 
df_new.head()

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

Резюме

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

Этот метод PCA может быть применен и будет большим подспорьем, если вы имеете дело с проблемами мультиколлинеарности в своем наборе данных. Если вы хотите узнать больше о мультиколлинеарности, посетите мой предыдущий блог [здесь]

Вы можете получить набор данных и полный код на моем Github [здесь]

Спасибо за чтение и удачного обучения! 🙂