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 Notebook. Chúng ta cũng có thể tìm hiểu về khái niệm PCA từ các hướng dẫn sau:
- Giới thiệu về PCA và giảm chiều/kích thước của dữ liệu (https://www.kindsonthegenius.com/pca-tutorial-1-introduction-to-pca-and-dimensionality-reduction/)
- Cách thực hiện phân tích các thành phần chính - PCA (Lý thuyết) [https://www.kindsonthegenius.com/pca-tutorial-1-how-to-perform-principal-components-analysis-pca/]
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
- Bước 2: Lấy tập dữ liệu của bạn
- Bước 3: Xem trước dữ liệu của bạn
- Bước 4: Chuẩn hóa dữ liệu
- Bước 5: Thực hiện PCA
- Bước 6: Kết hợp các thành phần chính và mục tiêu
- Bước 7: Vẽ biểu đồ scree các thành phần chính
- Bước 8: Trực quan hóa dữ liệu mới ở dạng 2D
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):

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

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

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

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:

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
Đăng nhận xét