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

 

Bài 11: Đánh giá chéo K-Fold (K-Fold Cross Validation)


Để đánh giá hiệu suất của một số mô hình trên tập dữ liệu, chúng ta cần đo lường mức độ phù hợp của các dự đoán của mô hình với dữ liệu quan sát.

Cách phổ biến nhất để đo điều này là sử dụng sai số bình phương trung bình (MSE), được tính như sau:

MSE = (1 / n) * Σ (y i - f (x i )) 2

ở đâu:

  • n: Tổng số quan sát
  • i : Giá trị phản hồi của lần quan sát thứ i
  • f (x i ): Giá trị phản hồi dự đoán của lần quan sát thứ i

Các dự đoán của mô hình càng gần với các quan sát, MSE sẽ càng nhỏ.

Trong thực tế, chúng ta sử dụng quy trình sau để tính toán MSE của một mô hình nhất định:

1.  Tách tập dữ liệu thành tập huấn luyện và tập thử nghiệm.

2.  Xây dựng mô hình chỉ sử dụng dữ liệu từ tập huấn luyện.

3. Sử dụng mô hình để đưa ra dự đoán trên bộ thử nghiệm và đo lường MSE thử nghiệm.

Thử nghiệm MSE cung cấp cho chúng ta một ý tưởng về mức độ hoạt động của một mô hình trên dữ liệu mà chúng ta chưa gặp. Tuy nhiên, hạn chế của việc chỉ sử dụng một tập thử nghiệm là MSE thử nghiệm có thể thay đổi rất nhiều tùy thuộc vào quan sát nào được sử dụng trong tập huấn luyện và thử nghiệm.

Một cách để tránh vấn đề này là điều chỉnh một mô hình nhiều lần bằng cách sử dụng một bộ huấn luyện và thử nghiệm khác nhau ở mỗi lần, sau đó tính MSE thử nghiệm là giá trị trung bình của tất cả MSE thử nghiệm.

Phương pháp chung này được gọi là đánh giá chéo và một dạng cụ thể của nó được gọi là đánh giá/xác thực chéo k-lần (K-Fold Cross Validation)

 .

Đánh giá chéo K-lần

Đánh giá chéo K-lần  sử dụng cách tiếp cận sau để đánh giá một mô hình:

Bước 1: Chia ngẫu nhiên một tập dữ liệu thành  k nhóm (“các nếp gấp”), có kích thước gần bằng nhau.

Chia tập dữ liệu thành k nếp gấp

Bước 2: Chọn một trong các nếp gấp để làm tập "holdout". Áp dụng mô hình vào k-1 nếp gấp còn lại. Tính toán MSE thử nghiệm trên các quan sát trong nếp gấp đã được đưa ra.

xác nhận chéo k-lần

Bước 3: Lặp lại quá trình này k lần, mỗi lần sử dụng một bộ khác nhau làm bộ "holdout" giữ nguyên.

Ví dụ về xác thực chéo k-lần

Bước 4: Tính MSE của bài kiểm tra tổng thể là giá trị trung bình của  k bài kiểm tra MSE.

Kiểm tra MSE = (1 / k) * ΣMSEi

ở đây:

  • k:  Số lần gấp
  • MSEi : Kiểm tra MSE ở lần lặp thứi

Cách chọn K

Nói chung, chúng ta sử dụng càng nhiều nếp gấp trong đánh giá chéo k lần thì độ chệch của MSE thử nghiệm càng thấp nhưng phương sai càng cao. Ngược lại, chúng ta sử dụng càng ít nếp gấp thì độ chệch càng cao nhưng phương sai càng thấp. Đây là một ví dụ cổ điển về sự cân bằng phương sai lệch trong học máy.

Trong thực tế, chúng ta thường chọn từ 5 đến 10 nếp gấp. 

Tóm lại, có một sự cân bằng phương sai lệch liên quan đến việc lựa chọn k trong đánh giá chéo k-lần.

 

Thông thường, với những cân nhắc này, người ta thực hiện đánh giá chéo k lần bằng cách sử dụng k = 5 hoặc k = 10.

 

 Ưu điểm của đánh giá chéo K-Fold

Khi chúng ta chia bộ dữ liệu chỉ thành một tập huấn luyện và một tập thử nghiệm, MSE thử nghiệm được tính toán dựa trên các quan sát trong tập thử nghiệm có thể thay đổi rất nhiều tùy thuộc vào quan sát nào được sử dụng trong tập huấn luyện và thử nghiệm.

Bằng cách sử dụng đánh giá chéo k-lần, chúng ta có thể sử dụng tính toán MSE thử nghiệm bằng cách sử dụng một số biến thể khác nhau của tập hợp huấn luyện và thử nghiệm. Điều này làm cho chúng ta có nhiều khả năng đạt được ước tính không thiên lệch khi tính MSE thử nghiệm.

Đánh giá chéo K-lần cũng mang lại lợi thế tính toán so với đánh giá chéo bỏ một lần (LOOCV), vì đánh giá chéo K-lần chỉ phải phù hợp với một mô hình k lần so với  n lần.

Đối với các mô hình mất nhiều thời gian để "fit", đánh giá chéo k-lần có thể tính toán MSE thử nghiệm nhanh hơn nhiều so với LOOCV và trong nhiều trường hợp, MSE thử nghiệm được tính theo từng phương pháp sẽ khá giống nhau nếu chúng ta sử dụng đủ số lần gấp.

Các phần mở rộng của K-Fold Cross-Validation

Có một số phần mở rộng của đánh giá chéo k-lần, bao gồm:

Xác thực chéo K lần lặp lại: Các thực chéo k lần chỉ được lặp lại n lần. Mỗi lần bộ huấn luyện và thử nghiệm được xáo trộn, do đó, sẽ làm giảm độ chệch trong ước tính của MSE thử nghiệm, mặc dù điều này mất nhiều thời gian hơn để thực hiện so với xác nhận chéo k-lần thông thường.

Xác thực chéo để lại một lần: Đây là một trường hợp đặc biệt của xác thực chéo k lần trong đó k = n . (Xem lại bài 10 về LOOCV).

Xác thực chéo K-Fold phân tầng: Đây là một phiên bản của xác thực chéo k-lần trong đó tập dữ liệu được sắp xếp lại theo cách mà mỗi nếp gấp là đại diện cho toàn bộ. Phương pháp này có xu hướng mang lại sự cân bằng tốt hơn giữa độ chệch và phương sai so với xác nhận chéo k-lần thông thường.

Xác thực chéo lồng nhau: Xác thực chéo k lần được thực hiện trong mỗi lần xác thực chéo. Điều này thường được sử dụng để thực hiện điều chỉnh siêu tham số trong quá trình đánh giá mô hình.

Xác thực chéo K-Fold với Python 

Hướng dẫn sau cung cấp một ví dụ qua từng bước về cách thực hiện xác thực chéo k-lần cho một mô hình trong Python.

Bước 1: Tải các thư viện cần thiết

from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
from numpy import mean
from numpy import absolute
from numpy import sqrt
import pandas as pd

Bước 2: Tạo dữ liệu

Tiếp theo, chúng ta sẽ tạo một DataFrame có chứa hai biến dự đoán, x1 và x2 và biến phản hồi y.

df = pd.DataFrame({'y': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
                   'x1': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
                   'x2': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})

Bước 3: Thực hiện xác thực chéo K-Fold

Tiếp theo, chúng ta sẽ thực hiện một mô hình hồi quy nhiều tuyến tính cho tập dữ liệu và thực hiện LOOCV để đánh giá hiệu suất của mô hình.

#define predictor and response variables
X = df[['x1', 'x2']]
y = df['y']

#define cross-validation method to use
cv = KFold(n_splits=10, random_state=1, shuffle=True)

#build multiple linear regression model
model = LinearRegression()

#use k-fold CV to evaluate model
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error',
                         cv=cv, n_jobs=-1)

#view mean absolute error
mean(absolute(scores))

3.6141267491803646

Từ kết quả đầu ra, chúng ta có thể thấy rằng sai số tuyệt đối trung bình (MAE) là  3,614 . Tức là, sai số tuyệt đối trung bình giữa dự đoán của mô hình và dữ liệu quan sát thực tế là 3.614.

Nói chung, MAE càng thấp thì mô hình càng có khả năng dự đoán các quan sát thực tế chặt chẽ hơn.

Một số liệu thường được sử dụng khác để đánh giá hiệu suất của mô hình là sai số bình phương trung bình gốc (RMSE). Đoạn mã sau cho biết cách tính số liệu này bằng LOOCV:

#define predictor and response variables
X = df[['x1', 'x2']]
y = df['y']

#define cross-validation method to use
cv = KFold(n_splits=5, random_state=1, shuffle=True) 

#build multiple linear regression model
model = LinearRegression()

#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring='neg_mean_squared_error',
                         cv=cv, n_jobs=-1)

#view RMSE
sqrt(mean(absolute(scores)))

4.284373111711816

Từ kết quả đầu ra, chúng ta có thể thấy rằng lỗi bình phương trung bình gốc (RMSE) là 4,284 . RMSE càng thấp, mô hình càng có khả năng dự đoán các quan sát thực tế chặt chẽ hơn.

Trong thực tế, chúng tôi thường phù hợp với một số mô hình khác nhau và so sánh RMSE hoặc MAE của mỗi mô hình để quyết định mô hình nào tạo ra tỷ lệ lỗi thử nghiệm thấp nhất và do đó là mô hình tốt nhất để sử dụng.

Cũng lưu ý rằng trong ví dụ này, chúng ta đã chọn sử dụng k = 5 nếp gấp, nhưng ta cũng có thể số nếp gấp tuỳ thích. Trong thực tế,  thường chọn từ 5 đến 10 lần gấp, vì đây là số lần gấp tối ưu tạo ra tỷ lệ lỗi thử nghiệm đáng tin cậy.

Bạn có thể tìm thấy tài liệu đầy đủ cho hàm KFold () từ sklearn tại: 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html

Nhận xét

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

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