Bài 16, 17: Dimension Reduction

 

Bài 16: Hồi quy các thành phần chính (Principal Components Regression)


Một trong những vấn đề phổ biến nhất mà ta sẽ gặp phải khi xây dựng mô hình là đa cộng tuyến . Điều này xảy ra khi hai hoặc nhiều biến dự báo trong một tập dữ liệu có tương quan cao.

Khi điều này xảy ra, một mô hình nhất định có thể phù hợp tốt với tập dữ liệu đào tạo nhưng nó có thể sẽ hoạt động kém trên một tập dữ liệu mới mà nó chưa gặp, và rơi vào trường hợp overfitingtrên  tập hợp dữ liệu huấn luyện.

Một cách để tránh overfiting là sử dụng một số loại  phương pháp lựa chọn tập hợp con như:

Các phương pháp này cố gắng loại bỏ các yếu tố dự báo không thích hợp khỏi mô hình để chỉ còn lại các yếu tố dự báo quan trọng nhất có khả năng dự đoán sự thay đổi của biến phản ứng trong mô hình cuối cùng.

Một cách khác để tránh overfiting là sử dụng một số loại  phương pháp chính quy như:

Các phương pháp này cố gắng hạn chế hoặc điều hòa các hệ số của một mô hình để giảm phương sai và do đó tạo ra các mô hình có khả năng tổng quát hóa tốt cho dữ liệu mới.

Một cách tiếp cận hoàn toàn khác để đối phó với đa cộng tuyến được gọi là  giảm thứ nguyên (Dimension Reduction).

Một phương pháp giảm thứ nguyên phổ biến được gọi là hồi quy các thành phần chính, các bước thực hiện như sau:

1. Giả sử một tập dữ liệu nhất định chứa  p yếu tố dự đoán: X1 , X2 ,…, X p

2. Tính Z 1 ,…, Z M là M tổ hợp tuyến tính của p dự đoán ban đầu  .

  • m = ΣΦ jm X j  với  Φ 1m , Φ 2m , Φ pm , m = 1,…, M, là các hằng số.
  • Z1 là tổ hợp tuyến tính của các yếu tố dự đoán thu được nhiều phương sai nhất có thể.
  • 2 là tổ hợp tuyến tính tiếp theo của các yếu tố dự đoán thu được nhiều phương sai nhất và  trực giao (tức là không tương quan) với Z 1 .
  • Khi đó, Z 3 là tổ hợp tuyến tính tiếp theo của các yếu tố dự đoán tu được nhiều phương sai nhất và trực giao với Z2 .
  • Tiếp tục như thế cho các Zm  

3. Sử dụng phương pháp bình phương nhỏ nhất để fit với mô hình hồi quy tuyến tính sử dụng M thành phần chính đầu tiên  1 ,…, Z M  làm dự báo.

Khái niệm giảm thứ nguyên (dimension reduction) xuất phát từ thực tế là phương pháp này chỉ phải ước tính hệ số M + 1 thay vì hệ số p + 1, trong đó M <p.

Nói cách khác, chiều của bài toán đã được giảm từ p + 1 xuống M + 1.

Trong nhiều trường hợp có đa cộng tuyến trong tập dữ liệu, hồi quy các thành phần chính có thể tạo ra một mô hình có thể tổng quát hóa thành dữ liệu mới tốt hơn hồi quy tuyến tính bội.

Các bước để thực hiện hồi quy các thành phần chính

Trong thực tế, các bước sau được sử dụng để thực hiện hồi quy các thành phần chính:

1. Chuẩn hóa các yếu tố dự đoán

Đầu tiên, chúng ta thường chuẩn hóa dữ liệu sao cho mỗi biến dự đoán có giá trị trung bình là 0 và độ lệch chuẩn là 1. Điều này ngăn chặn một dự đoán bị ảnh hưởng quá mức, đặc biệt nếu nó được đo bằng các đơn vị khác nhau (tức là nếu X1 được đo bằng inch và X 2 được đo bằng mét).

2. Tính toán các thành phần chính và thực hiện hồi quy tuyến tính sử dụng các thành phần chính làm yếu tố dự báo

Tiếp theo, chúng ta tính toán các thành phần chính và sử dụng phương pháp bình phương nhỏ nhất để fit với mô hình hồi quy tuyến tính sử dụng M thành phần chính đầu tiên 1 ,…, Z M  làm dự báo.

3. Quyết định có bao nhiêu thành phần chính cần giữ lại

Tiếp theo, chúng ta sử dụng xác nhận chéo k-lần để tìm số lượng các thành phần chính tối ưu cần giữ trong mô hình. Số thành phần chính cần giữ lại “tối ưu” thường là số tạo ra sai số bình phương trung bình thử nghiệm (MSE) thấp nhất.

Ưu và nhược điểm của hồi quy các thành phần chính

Hồi quy các thành phần chính (PCR) có các ưu điểm sau :

  • PCR có xu hướng hoạt động tốt khi một vài thành phần chính đầu tiên có thể nắm bắt được hầu hết sự thay đổi trong các yếu tố dự báo cùng với mối quan hệ với biến phản hồi.
  • PCR có thể hoạt động tốt ngay cả khi các biến dự báo có tương quan cao vì nó tạo ra các thành phần chính trực giao (tức là không tương quan) với nhau.
  • PCR không yêu cầu bạn chọn biến dự báo nào cần loại bỏ khỏi mô hình vì mỗi thành phần chính là tổ hợp tuyến tính của tất cả các biến dự báo.
  • PCR có thể được sử dụng khi có nhiều biến dự báo hơn số lần quan sát, không giống như hồi quy tuyến tính bội.

Tuy nhiên, PCR đi kèm với một vấn đề:

  • PCR không xem xét biến phản hồi khi quyết định giữ hoặc loại bỏ thành phần chính nào. Thay vào đó, nó chỉ xem xét độ lớn của phương sai giữa các biến dự báo được các thành phần chính thu nhận. Có thể trong một số trường hợp, các thành phần chính có phương sai lớn nhất không thực sự có thể dự đoán tốt biến phản hồi.

Trên thực tế, chúng ta fitvới nhiều loại mô hình khác nhau (PCR, Ridge, Lasso, Multiple Linear Regression, v.v.) và sử dụng xác nhận chéo k-lần để xác định mô hình tạo ra MSE thử nghiệm thấp nhất trên dữ liệu mới.

Trong trường hợp có đa cộng tuyến trong tập dữ liệu ban đầu (thường xảy ra), PCR có xu hướng hoạt động tốt hơn so với hồi quy bình phương cực tiểu thông thường. Tuy nhiên, ta nên kết hợp nhiều mô hình khác nhau để có thể xác định mô hình nào tổng quát hóa tốt nhất cho dữ liệu chưa biết, cần dự báo.

Hồi quy các thành phần chính với Python


Cho một tập hợp p biến dự báo và một biến phản hồi, hồi quy tuyến tính bội  sử dụng một phương pháp được gọi là bình phương nhỏ nhất để giảm thiểu tổng các phần dư bình phương (RSS):

RSS = Σ (y i  - ŷ i ) 2

ở đây:

  • Σ : Ký hiệu  tổng
  • i : Giá trị phản hồi thực tế cho lần quan sát thứ i
  • ŷ i : Giá trị phản hồi dự đoán dựa trên mô hình hồi quy tuyến tính bội

Tuy nhiên, khi các biến dự báo có tương quan cao thì  đa cộng tuyến có thể trở thành một vấn đề. Điều này có thể làm cho các ước lượng hệ số của mô hình không đáng tin cậy và có phương sai cao.

Một cách để tránh vấn đề này là thay vào đó sử dụng hồi quy các thành phần chính , tìm M tổ hợp tuyến tính (được gọi là "thành phần chính") của p dự báo ban đầu và sau đó sử dụng bình phương nhỏ nhất để fit với mô hình hồi quy tuyến tính sử dụng các thành phần chính làm yếu tố dự báo.

Hướng dẫn sau cung cấp một ví dụ từng bước về cách thực hiện hồi quy các thành phần chính trong Python.

Bước 1: Nhập các gói cần thiết

Đầu tiên, chúng ta sẽ nhập các gói cần thiết để thực hiện hồi quy các thành phần chính (PCR) trong Python:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import scale 
from sklearn import model_selection
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

Bước 2: Tải dữ liệu

Đối với ví dụ này, chúng ta sẽ sử dụng một tập dữ liệu có tên là  mtcars , chứa thông tin về 33 chiếc xe khác nhau. Chúng ta sẽ sử dụng  hp  làm biến phản hồi và các biến sau làm yếu tố dự đoán:

  • mpg
  • disp
  • drat
  • wt
  • qsec

Đoạn mã sau cho biết cách tải và xem tập dữ liệu này:

#define URL where data is located
url = "https://raw.githubusercontent.com/Statology/Python-Guides/main/mtcars.csv"

#read in data
data_full = pd.read_csv(url)

#select subset of data
data = data_full[["mpg", "disp", "drat", "wt", "qsec", "hp"]]

#view first six rows of data
data[0:6]


        mpg	disp	drat	wt	qsec	hp
0	21.0	160.0	3.90	2.620	16.46	110
1	21.0	160.0	3.90	2.875	17.02	110
2	22.8	108.0	3.85	2.320	18.61	93
3	21.4	258.0	3.08	3.215	19.44	110
4	18.7	360.0	3.15	3.440	17.02	175
5	18.1	225.0	2.76	3.460	20.22	105

Bước 3: Điều chỉnh mô hình PCR

Đoạn mã sau đây cho thấy cách khớp mô hình PCR với dữ liệu này. Lưu ý những điều dưới đây:

  • pca.fit_transform (scale (X)) : Hàm này giúp cho Python biết rằng mỗi biến dự báo nên được chia tỷ lệ để có giá trị trung bình là 0 và độ lệch chuẩn là 1. Điều này đảm bảo rằng không có biến dự báo nào có ảnh hưởng quá mức đến mô hình nếu nó xảy ra được đo bằng các đơn vị khác nhau.
  • cv = RepeatedKFold() : Hàm này giúp  cho Python sử dụng xác thực chéo k-lần để đánh giá hiệu suất của mô hình. Với ví dụ này ta chọn k = 10 lần gấp, lặp lại 3 lần.
#define predictor and response variables
X = data[["mpg", "disp", "drat", "wt", "qsec"]]
y = data[["hp"]]

#scale predictor variables
pca = PCA()
X_reduced = pca.fit_transform(scale(X))

#define cross validation method
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)

regr = LinearRegression()
mse = []

# Calculate MSE with only the intercept
score = -1*model_selection.cross_val_score(regr,
           np.ones((len(X_reduced),1)), y, cv=cv,
           scoring='neg_mean_squared_error').mean()    
mse.append(score)

# Calculate MSE using cross-validation, adding one component at a time
for i in np.arange(1, 6):
    score = -1*model_selection.cross_val_score(regr,
               X_reduced[:,:i], y, cv=cv, scoring='neg_mean_squared_error').mean()
    mse.append(score)
    
# Plot cross-validation results    
plt.plot(mse)
plt.xlabel('Number of Principal Components')
plt.ylabel('MSE')
plt.title('hp')

Principal components regression in Python

Biểu đồ hiển thị số thành phần chính dọc theo trục x và MSE thử nghiệm (sai số bình phương trung bình) dọc theo trục y.

Từ biểu đồ, chúng ta có thể thấy rằng MSE thử nghiệm giảm bằng cách thêm vào hai thành phần chính, nhưng nó bắt đầu tăng lên khi chúng ta thêm nhiều hơn hai thành phần chính.

Do đó, mô hình tối ưu chỉ bao gồm hai thành phần chính đầu tiên.

Chúng ta cũng có thể sử dụng mã sau để tính toán phần trăm phương sai trong biến phản hồi được giải thích bằng cách thêm từng thành phần chính vào mô hình:

np.cumsum(np.round(pca.explained_variance_ratio_, decimals=4)*100)

array([69.83, 89.35, 95.88, 98.95, 99.99])

Chúng ta có thể thấy như sau:

  • Chỉ bằng cách sử dụng thành phần chính đầu tiên, chúng ta có thể giải thích 69,83% sự thay đổi trong biến phản hồi.
  • Bằng cách thêm vào thành phần chính thứ hai, chúng ta có thể giải thích  89,35% sự thay đổi trong biến phản hồi.

Lưu ý rằng chúng ta sẽ luôn có thể giải thích nhiều phương sai hơn bằng cách sử dụng nhiều thành phần chính hơn, nhưng chúng ta có thể thấy rằng việc thêm nhiều hơn hai thành phần chính không thực sự làm tăng nhiều phần trăm phương sai được giải thích.

Bước 4: Sử dụng Mô hình cuối cùng để đưa ra dự đoán

Chúng ta có thể sử dụng mô hình PCR cuối cùng với hai thành phần chính để đưa ra dự đoán về các quan sát mới.

Đoạn mã sau đây chỉ ra cách tách tập dữ liệu ban đầu thành tập huấn luyện và thử nghiệm và sử dụng mô hình PCR với hai thành phần chính để đưa ra dự đoán về tập thử nghiệm.

#split the dataset into training (70%) and testing (30%) sets
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0) 

#scale the training and testing data
X_reduced_train = pca.fit_transform(scale(X_train))
X_reduced_test = pca.transform(scale(X_test))[:,:1]

#train PCR model on training data 
regr = LinearRegression()
regr.fit(X_reduced_train[:,:1], y_train)

#calculate RMSE
pred = regr.predict(X_reduced_test)
np.sqrt(mean_squared_error(y_test, pred))

40.2096

Chúng ta có thể thấy rằng RMSE thử nghiệm là  40,2096 . Đây là độ lệch trung bình giữa giá trị dự đoán cho hp và giá trị quan sát; và  cho  hp quan sát trong tập thử nghiệm.

Có thể tìm thấy toàn bộ cách sử dụng mã Python trong bài này tại [https://github.com/Statology/Python-Guides/blob/main/principal_components_regression.py]

Nhận xét

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

Bài 11: Đánh giá chéo K-Fold

Bài 1, 2. Học máy theo cách tiếp cận thống kê và minh hoạ với Python