Руководство для начинающих по PCA и как его реализовать с помощью sklearn (с кодом!)

Распространенная проблема для специалистов по данным при создании алгоритма - слишком много переменных. Естественно, вы могли бы подумать, что добавление дополнительной информации только улучшит вашу модель, но с каждой добавленной вами функцией появляется новое измерение. Как люди, мы можем визуализировать вещи только в 2-х или 3-х измерениях. Для данных это правило не действует! Данные могут иметь бесконечное количество измерений, но именно здесь вступает в игру проклятие размерности .

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

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

Что такое анализ основных компонентов и для чего он используется?

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

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

Итак, как узнать, сколько информации хранится в вашем PCA?

Мы используем Explained Variance Ratio в качестве метрики, чтобы оценить полезность ваших основных компонентов и выбрать, сколько компонентов использовать в вашей модели. Коэффициент объясненной дисперсии - это процент отклонения, который приписывается каждому из выбранных компонентов. В идеале вы должны выбрать количество компонентов для включения в вашу модель, добавив объясненный коэффициент дисперсии каждого компонента, пока вы не достигнете в целом около 0,8 или 80%, чтобы избежать переобучения.

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

Пример PCA с использованием Sklearn

  1. Во-первых, давайте загрузим набор данных радужной оболочки глаза для нашего примера code-a-long. Набор данных ириса - это известный набор данных, содержащий измерения для 150 цветков ириса трех разных видов.
from sklearn import datasets
import pandas as pd
 
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['Target'] = iris.get('target')
df.head()

2. Затем мы разделим все столбцы в списке «features» на переменную «X», а переменную «target» - на «y».

# Create features and target datasets
features = ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
X = df[features].values
y = df['Target'].values

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

from sklearn.preprocessing import StandardScaler

# Standardize the features
X = StandardScaler().fit_transform(X)

# Preview X
pd.DataFrame(data=X, columns=features).head()

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

# Import PCA from sklearn
from sklearn.decomposition import PCA

# Instantiate PCA
pca = PCA(n_components=2)

# Fit PCA to features
principalComponents = pca.fit_transform(X)

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

# Create a new dataset from principal components 
df = pd.DataFrame(data = principalComponents, 
                  columns = ['PC1', 'PC2'])

target = pd.Series(iris['target'], name='target')

result_df = pd.concat([df, target], axis=1)
result_df.head(5)

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

# Visualize Principal Components with a scatter plot
fig = plt.figure(figsize = (12,10))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('First Principal Component ', fontsize = 15)
ax.set_ylabel('Second Principal Component ', fontsize = 15)
ax.set_title('Principal Component Analysis (2PCs) for Iris Dataset', fontsize = 20)

targets = [0, 1, 2]
colors = ['r', 'g', 'b']
for target, color in zip(targets, colors):
    indicesToKeep = iris['target'] == target
    ax.scatter(result_df.loc[indicesToKeep, 'PC1'], 
               result_df.loc[indicesToKeep, 'PC2'], 
               c = color, 
               s = 50)
ax.legend(targets)
ax.grid()

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

# Calculate the variance explained by priciple components
print('Variance of each component:', pca.explained_variance_ratio_)
print('\n Total Variance Explained:', round(sum(list(pca.explained_variance_ratio_))*100, 2)

Мы видим, что наши первые два основных компонента объясняют большую часть дисперсии в этом наборе данных (95,81%)! Это показатель общей представленной информации по сравнению с исходными данными.

Резюме

Ключевые выводы из этой статьи:

  • PCA - это широко используемый метод уменьшения размера.
  • Цель PCA - просто объединить элементы вашей модели в меньшее количество некоррелированных функций, чтобы помочь визуализировать закономерности в ваших данных и помочь ей работать быстрее.
  • Применяйте PCA только к непрерывным данным.
  • Перед применением PCA убедитесь, что ваши данные нормализованы !!

***

Спасибо за прочтение!

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

***

Ссылки:

  1. Https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c
  2. Https://deepai.org/machine-learning-glossary-and-terms/curse-of-dimensionality
  3. Https://elitedatascience.com/overfitting-in-machine-learning
  4. Https://www.geeksforgeeks.org/principal-component-analysis-with-python/
  5. Https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
  6. Https://www.researchgate.net/profile/Dominique_Valentin/publication/239542271_Multiple_Correspondence_Analysis/links/54a979900cf256bf8bb95c95.pdf
  7. Https://www.visiondummy.com/2014/03/eigenvalues-eigenvectors/
  8. Https://sebastianraschka.com/Articles/2015_pca_in_3_steps.html
  9. Https://etav.github.io/python/scikit_pca.html
  10. Учебный план Flatiron Data Science, раздел 37