Bài 17: Phương pháp bình phương tối thiểu từng phần (Partial Least Squares - PLS)
Một trong những vấn đề phổ biến nhất mà ta sẽ gặp phải trong học máy 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 có thể fit tốt với tập dữ liệu huấn luyện nhưng nó có thể hoạt động kém trên một tập dữ liệu mới mà nó chưa biết vì gặp phải trường hợp overfits với tập dữ liệu huấn luyện.
Một cách để giải quyết vấn đề đa cộng tuyến là sử dụng hồi quy các thành phần chính , tính toán M tổ hợp tuyến tính (được gọi là "thành phần chính") của p biến dự báo ban đầu và sau đó 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 bằng cách sử dụng các thành phần chính làm yếu tố dự báo.
Hạn chế của hồi quy các thành phần chính (PCR) là nó không xem xét biến phản hồi khi tính toán các thành phần chính.
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. Do đó, 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.
Một kỹ thuật có liên quan đến PCR được gọi là bình phương tổi thiểu từng phần (PLS). Tương tự như PCR, phương pháp bình phương nhỏ nhất từng phần (PLS) tính toán M tổ hợp tuyến tính (được gọi là "thành phần PLS") của p biến dự báo ban đầu 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 các thành phần PLS làm các biến dự báo.
Nhưng không giống như PCR, phương pháp bình phương tối thiểu từng phần (PLS) cố gắng tìm các tổ hợp tuyến tính giải thích sự thay đổi trong cả biến phản hồi và biến dự đoán.
Các bước để thực hiện PLS
Các bước sau đây được sử dụng để thực hiện PLS.
1. Chuẩn hoá dữ liệu để tất cả các biến dự đoán và biến phản hồi có kỳ vọng là từ 0 và độ lệch chuẩn là 1. Đảm bảo điều để mỗi biến được đo trên cùng một tỷ lệ.
2. Tính Z 1 ,…, Z M là M tổ hợp tuyến tính của p dự đoán ban đầu .
- Z m = ΣΦ jmX j với Φ 1m , Φ 2m , Φ pm, m = 1,…, M, là các hằng số.
- Tính Z1, đặt Φj1 bằng hệ số từ hồi quy tuyến tính đơn giản của Y lên Xj 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ể.
- Tính Z2, hồi quy từng biến trên Z1 và lấy các phần dư. Sau đó, tính Z2 bằng cách sử dụng tập dữ liệu trực giao này theo đúng cách mà Z1 đã được tính.
- Lặp lại quá trình này M lần để có được M thành phần PLS.
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 các thành phần PLS, là Z 1 ,…, Z M làm dự báo.
4. Cuối cùng, sử dụng xác nhận chéo k-lần để tìm số lượng thành phần PLS tối ưu để lưu trong mô hình. Số thành phần PLS “tối ưu” cần giữ lại thường là số tạo ra sai số bình phương trung bình thử nghiệm (MSE) thấp nhất.
Kết luận
Trong trường hợp có đa cộng tuyến trong tập dữ liệu, PLS có xu hướng hoạt động tốt hơn hồi quy bình phương tối thiểu thông thường. Tuy nhiên, ta nên kết hợp với một số 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.
Trên thực tế, chúng ta kết hợp nhiều loại mô hình khác nhau (PLS, PCR , Ridge , Lasso , Hồi quy tuyến tính bội, v.v.) vào một tập dữ liệu và sử dụng xác thực 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 .
PLS với Python
Hướng dẫn sau cung cấp một ví dụ từng bước về cách thực hiện PLS 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 PLS 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.cross_decomposition import PLSRegression
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 với PLS
Đoạn mã sau đây cho thấy cách điều chỉnh mô hình với PLS cho dữ liệu này.
Lưu ý rằng cv = RepeatedKFold() yêu cầu 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"]]
#define cross-validation method
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
mse = []
n = len(X)
# Calculate MSE with only the intercept
score = -1*model_selection.cross_val_score(PLSRegression(n_components=1),
np.ones((n,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):
pls = PLSRegression(n_components=i)
score = -1*model_selection.cross_val_score(pls, scale(X), y, cv=cv,
scoring='neg_mean_squared_error').mean()
mse.append(score)
#plot test MSE vs. number of components
plt.plot(mse)
plt.xlabel('Number of PLS Components')
plt.ylabel('MSE')
plt.title('hp')
Biểu đồ hiển thị số lượng thành phần PLS 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 PLS, nhưng nó bắt đầu tăng lên khi chúng tathêm nhiều hơn hai thành phần PLS.
Do đó, mô hình tối ưu chỉ bao gồm hai thành phần PLS đầu tiên.
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 PLS cuối cùng với hai thành phần PLS để đưa ra dự đoán về các quan sát mới.
Đoạn mã sau cho biết cách tách tập dữ liệu gốc thành tập huấn luyện và thử nghiệm và sử dụng mô hình PLS với hai thành phần PLS để đư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)
#calculate RMSE
pls = PLSRegression(n_components=2)
pls.fit(scale(X_train), y_train)
np.sqrt(mean_squared_error(y_test, pls.predict(scale(X_test))))
29.9094
Chúng ta có thể thấy rằng RMSE thử nghiệm là 29,9094 . Đây là độ lệch trung bình giữa giá trị dự đoán cho hp và giá trị quan sát cho hp cho các 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 này tại [https://github.com/Statology/Python-Guides/blob/main/partial_least_squares.py]
Trong bài này và bài trước, chúng ta có sử dụng 2 khái niệm:
Trả lờiXóa- Trực giao là một khái niệm cơ bản trong đại số tuyến tính. Để hiểu khái niệm này thì phải hiểu khái niệm không gian vector, khái niệm tập hợp, phép toán.....
- Bình phương tối thiếu, muốn hiểu được nó, phairi hiểu được bài toán tối ưu và để giải nó phải hiểu được bài toán đạo hàm, định lý lagrange....
Sơ sơ vậy, mà có người cứ tung hộ AI, máy học....... búa xua, mà nói ko cần học toán!