# Implementing PCA in Python with scikit-learn

## Introduction

Extraction of useful information from high-dimensional datasets is made easier by Principal component analysis, (PCA) a popular dimensionality reduction method. It does this by re-projecting data onto a different axis, where the highest variance can be captured. The complexity of the dataset is reduced while its basic structure is preserved by PCA. It helps with things like feature selection, data compression, and noise reduction in data analysis, and it can even reduce the dimensionality of the data being analyzed. Image processing, bioinformatics, economics, and the social sciences are just a few of the places PCA has been put to use.

It has several applications, including image recognition (both human and non-human), genetics, finance, consumer segmentation, recommender systems, and sentiment analysis. In sum, principal component analysis is a flexible method that may be used in a wide variety of settings.

## Understanding the Theory behind PCA

### What is Principal Component Analysis (PCA)?

Principal Component Analysis (PCA) is a dimensionality reduction technique used to transform high-dimensional data into a lower-dimensional representation while preserving the most important information. It identifies the directions (principal components) along which the data varies the most.

### Mathematical concepts in PCA

PCA involves linear algebra and matrix operations. It uses concepts such as eigenvectors and eigenvalues to calculate the principal components. Eigenvectors represent the directions of maximum variance, and eigenvalues represent the amount of variance explained by each eigenvector.

### Explained Variance Ratio

The explained variance ratio represents the proportion of the total variance in the data that is explained by each principal component. It helps in determining how many principal components to retain for an optimal trade-off between dimensionality reduction and preserving information.

## Implementing PCA with scikit-learn

### Installing scikit-learn

To install scikit-learn, you can use the following command −

### Python Code

pip install scikit-learn


In Python, you need to import the required libraries for PCA implementation −

### Python Code

from sklearn.decomposition import PCA
import numpy as np


### Data Preprocessing

Scaling the features

Before applying PCA, it is recommended to scale the features to have zero mean and unit variance. This can be achieved using scikit-learn's StandardScaler −

### Python Code

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)


Handling missing values (if applicable)

If your data contains missing values, you may need to handle them before performing PCA. Depending on the nature of the missing data, techniques like imputation or removal may be used.

### Performing PCA

To perform PCA on the scaled data, create an instance of the PCA class and fit it to the data −

### Python Code

pca = PCA()
pca.fit(scaled_data)


### Choosing The Number of Components

You can choose the number of components based on the explained variance ratio. For example, to retain 95% of the variance, you can use −

### Python Code

n_components = np.argmax(np.cumsum(pca.explained_variance_ratio_) >= 0.95) + 1


### Interpreting The Principal Components

The principal components can be accessed using pca.components. Principal components are linear combinations of the original features that each stand for a unique axis of data variation. The coefficients of the principle components can be analyzed to reveal their relative importance in explaining the total variance.

## Visualizing PCA Results

### Biplot

A biplot is a type of scatter plot that shows both the points and the PCs at the same time. The connection between the data and the primary components may therefore be seen. Matplotlib and scikit-learn are two examples of libraries that can be used to generate a biplot −

### Python Code

import matplotlib.pyplot as plt

# Assuming X is the original data matrix
X_pca = pca.transform(scaled_data)

plt.scatter(X_pca[:, 0], X_pca[:, 1])  # Replace 0 and 1 with the desired principal components
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()


### Scree Plot

The eigenvalues (or explained variances) of the principal components are plotted in a scree plot from highest to lowest. It's useful for figuring out how many pieces to keep. Matplotlib may be used to create the screen plot −

### Python Code

plt.plot(range(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, marker='o')
plt.xlabel('Principal Components')
plt.ylabel('Explained Variance Ratio')
plt.show()


These visualizations provide insights into the data structure and the importance of each principal component in capturing the variability of the original data.

## Assessing the Performance of PCA

### Evaluating The Explained Variance Ratio

It is crucial to evaluate the amount of data variation explained by each principle component after applying PCA. This data is useful for deciding how many parts to keep. Explained variance ratio may be accessed in Python using scikit-learn's PCA object's 'explained_variance_ratio_' field. Here's a sample piece of code −

### Python Code

from sklearn.decomposition import PCA

# Assume 'X' is your preprocessed data
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# Accessing the explained variance ratio
explained_variance_ratio = pca.explained_variance_ratio_
print("Explained Variance Ratio:", explained_variance_ratio)


### Reconstructing the Original Data

By mapping the data onto a lower-dimensional space, PCA is able to reduce the data's dimensionality. Using the 'inverse_transform()' function, you can get back to the original data from the compressed representation. Here's a sample piece of code −

### Python Code

# Reconstructing the original data
X_reconstructed = pca.inverse_transform(X_pca)


### Assessing The Impact of Dimensionality Reduction on Model Performance

After using PCA, you need to figure out how the reduction in dimensions affects the success of your machine learning models. Before and after applying PCA, you can compare performance measures like accuracy or mean squared error. Here's an example code snippet −

### Python Code

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# Assume 'y' is your target variable
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42)

# Train and evaluate a logistic regression model on the reduced data
model = LogisticRegression()
model.fit(X_train, y_train)
accuracy_pca = model.score(X_test, y_test)

# Train and evaluate a logistic regression model on the original data
model_original = LogisticRegression()
model_original.fit(X_train_original, y_train)
accuracy_original = model_original.score(X_test_original, y_test)

print("Accuracy with PCA:", accuracy_pca)
print("Accuracy without PCA:", accuracy_original)


By comparing how well the model works with and without PCA, you can figure out how dimensionality reduction affects your particular job.

## Conclusion

In conclusion, dimensionality reduction and feature extraction may be accomplished with great efficiency by using PCA implemented in Python with scikit-learn. When properly understood, implemented, and evaluated, PCA paves the way for more effective data analysis, visualization, and modeling across a wide range of application areas.

Someswar Pal

Studying Mtech/ AI- ML

Updated on: 05-Oct-2023

123 Views