Bài 24: Phân tích các thành phần chính (Principal Components Analysis - PCA) với Python

[https://www.kindsonthegenius.com/principal-components-analysispca-in-python-step-by-step/]

Phân tích các thành phần chính trong Python. Hướng dẫn này sẽ được thực hiện trên Jupyter NotebookChúng ta cũng có thể tìm hiểu về khái niệm PCA từ các hướng dẫn sau:

Dưới đây là tám bước để thực hiện PCA trong Python:

Bước 1: Nhập các mô-đun cần thiết

Các mô-đun chúng ta cần là pandas, numpy, sklearn và matplotlib. 

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn import preprocessing
import matplotlib.pyplot as plt

Bước 2: Lấy tập dữ liệu

Tập dữ liệu sẽ được lấy từ Kho lưu trữ Học máy UCI. Để làm điều đó, bạn có thể nhấp chuột phải vào liên kết bên dưới và lưu bản sao của tập dữ liệu vào ổ đĩa cục bộ của bạn.

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

df = pd.read_csv(url, names=['sepal length', 'sepal width' , 'petal lenght', 'petal width', 'target'])

Lấy và tải tập dữ liệu

Trong đoạn mã trên, dòng đầu tiên chỉ định url của tập dữ liệu, dòng thứ hai tải tập dữ liệu vào một khung dữ liệu df (khung dữ liệu đơn giản được sử dụng để chứa dữ liệu).

pd.read_csv () là một hàm trong pandas. Đối số đầu tiên là đường dẫn đến dữ liệu, đối số thứ hai là danh sách tên cột. Điều này có nghĩa là cột đầu tiên của dữ liệu sẽ được đặt tên là 'sepal lenght', cột thứ hai là 'sepal_width', v.v.

 Bước 3: Xem trước dữ liệu của bạn

Có thể xem dữ liệu bằng cách gõ df vào ô tiếp theo và chạy nó như trong Hình 1.0. Ta cũng có thể nhập print (df). Trong bảng, có bốn tính năng (features) và một mục tiêu (target) (hoặc lớp):

Hình 1.0: Data in DataFrame
Bước 4: Thực hiện chia tỷ lệ và chuẩn hoá dữ liệu

Giá trị trung bình của mỗi bản ghi sẽ là 0 và phương sai cho mỗi bản ghi sẽ là 1.

Để chia tỷ lệ dữ liệu, chúng ta sẽ sử dụng StandardScalar có sẵn trong sklearn.

Lưu ý rằng chúng ta sẽ chỉ tính tỷ lệ cho các tính năng chứ không phải mục tiêu. Vì vậy, để làm điều này, chúng ta chỉ cần

  • Nhập lần đầu tiên của  StandardScalar
  • Tách các tính năng khỏi mục tiêu
  • Tính tỷ lệ cho các tính năng

Ba hoạt động này được thực hiện bằng cách sử dụng bốn dòng mã dưới đây:

from sklearn.preprocessing import StandardScaler

features = ['sepal length', 'sepal width', 'petal length', 'petal width']

x = df.loc[:, features].values

y = df.loc[:, ['target']].values

x = StandardScaler().fit_transform(x)

Tách các đối tượng khỏi mục tiêu và chuẩn hóa các đối tượng

 Bước 5: Thực hiện PCA

Sau đó, để thực hiện PCA, chúng ta sẽ sử dụng mô-đun PCA từ sklearn mà chúng ta đã nhập ở Bước 1. Trong đoạn mã dưới đây, dòng đầu tiên và dòng thực hiện PCA, dòng thứ ba tải các thành phần chính vào khung dữ liệu. 

pca = PCA(n_components=2)

principalComponents = pca.fit_transform(x)

principalDataframe = pd.DataFrame(data = principalComponents, columns = ['PC1', 'PC2'])

PCA cho hai thành phần chính

 Bước 6: Kết hợp mục tiêu và các thành phần chính

Hãy nhớ rằng dữ liệu gốc có năm cột, trong đó có một cột mục tiêu. Bây giờ sau khi thực hiện PCA, chúng ta chỉ có hai cột cho các tính năng. Tập dữ liệu đích là y, sẽ không được chạm vào. Do đó, chúng ta đã gắn lại cột đích vào tập hợp các thành phần chính mới. Để làm điều đó, ta sử dụng mã bên dưới đây.

targetDataframe = df[['target']]

newDataframe = pd.concat([principalDataframe, targetDataframe],axis = 1)

Kết hợp các thành phần chính với đích

Ta cũng có thể xem tập dữ liệu mới của mình bằng cách nhập newDataframe và chạy ô. Do đó, đầu ra của ta sẽ như trong Hình 1.1

Hình 1.1: Tập dữ liệu mới sau khi thực hiện PCA

 Bước 7: Vẽ biểu đồ scree của các thành phần chính

Biểu đồ scree giống như một biểu đồ thanh hiển thị kích thước của từng thành phần chính. Nó giúp chúng ta hình dung phần trăm sự thay đổi được thu thập bởi từng thành phần chính. Để thực hiện một biểu đồ scree, ta cần:

  • trước hết, hãy tạo một danh sách các cột
  •  sau đó, tạo danh sách các thành phần chính
  • cuối cùng, thực hiện biểu đổ scree trên màn hình bằng cách sử dụng plt

percent_variance = np.round(pca.explained_variance_ratio_* 100, decimals =2)
columns = ['PC1', 'PC2', 'PC3', 'PC4']
plt.bar(x= range(1,5), height=percent_variance, tick_label=columns)
plt.ylabel('Percentate of Variance Explained')
plt.xlabel('Principal Component')
plt.title('PCA Scree Plot')
plt.show()

Vẽ biểu đồ scree PCA

Hình 1.3: Biểu đồ scree

 

Bước 8: Vẽ các thành phần chính trên 2D

Có thể hình ảnh hoá tập dữ liệu mới, để xem PCA giúp giải thích dữ liệu gốc dễ dàng hơn như thế nào. Chúng ta sẽ sử dụng biểu đồ phân tán

plt.scatter(principalDataframe.PC1, principalDataframe.PC2)
plt.title('PC1 against PC2')
plt.xlabel('PC1')
plt.ylabel('PC2')

Biểu đồ 2D của PC1 và PC2

Hình 1.3: Biểu đồ PCA của PC1 và PC2

Chúng ta lặp lại biểu đồ trên  với màu sắc cho từng mục tiêu (Iris-setosa, Iris-versicolor và Iris-virginica). Theo cách này, chúng ta sẽ thấy cách PCA giúp giải thích dữ liệu. 

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')

ax.set_title('Plot of PC1 vs PC2', fontsize = 20)

targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']

colors = ['r', 'g', 'b']

for target, color in zip(targets,colors):
    indicesToKeep = newDataframe['target'] == target
    ax.scatter(newDataframe.loc[indicesToKeep, 'PC1']
               , newDataframe.loc[indicesToKeep, 'PC2']
               , c = color
               , s = 50)
    
ax.legend(targets)
ax.grid()

Biểu đồ  PC1 vs PC2 

Tương tự như vậy, nếu ta thực thi đoạn mã  ở trên, ta sẽ có kết quả được đưa ra trong hình dưới đây:

Hình 1.4: Lô cuối cùng của PC1 và PC2

Giải thích phương sai sử dụng thành phần chính

Cuối cùng, chúng ta cần xem hai thành phần chính giải thích dữ liệu của chúng ta như thế nào. Để làm điều đó, chúng ta sẽ sử dụng lệnh dưới đây:

pca.explained_variance_ratio_

Sau đó, sẽ nhận được đầu ra:

array([0.72770452, 0.23030523])

Các giá trị này cho thấy rằng thành phần chính đầu tiên PC1 giải thích 72,77% sự thay đổi trong dữ liệu gốc trong khi thành phần chính thứ hai giải thích 23,03% sự thay đổi trong dữ liệu gốc.

Tóm lại, điều này có nghĩa là dữ liệu 4 chiều ban đầu có thể được giảm xuống 2 chiều một cách an toàn bằng cách sử dụng PCA vì tập dữ liệu chỉ có thể được giải thích bằng hai thành phần!

Nhận xét

Bài đăng phổ biến từ blog này

Phân tích đề thi Tốt nghiệp THPT, môn Tin học 2025 và Đề thi tương tự, theo yêu cầu cần đạt và mức độ nhận thức Bloom.

Hướng Dẫn: TẠO GIA SƯ AI HỖ TRỢ HỌC TIN HỌC

10 CÁCH ĐẶT CÂU HỎI/HƯỚNG DẪN CHO HỌC SINH ĐỂ HỌC TẬP TỐT HƠN