Chuyển đến nội dung chính

Hướng dẫn toàn diện về kiểm định chéo K-Fold

Tìm hiểu cách hoạt động của kiểm định chéo K-Fold cùng ưu và nhược điểm. Khám phá cách triển khai K-Fold Cross-Validation trong Python với scikit-learn.
· 10 phút đọc

Khám phá cùng AI

Hãy tưởng tượng bạn đang huấn luyện một mô hình học máy nhưng không chắc mô hình sẽ hoạt động thế nào trên dữ liệu mới, chưa từng thấy. Đó là lúc K-Fold Cross-Validation phát huy tác dụng. Kỹ thuật này cho bạn cái nhìn sớm về cách mô hình có thể vận hành trong thế giới thực. Nó giúp đảm bảo dự đoán của bạn không chỉ là một lần ăn may, mà ổn định và đáng tin cậy trên các tập dữ liệu mới, chưa từng thấy.

Trong hướng dẫn này, chúng ta sẽ mở hộp các khái niệm cơ bản của K-Fold Cross-Validation và so sánh nó với phương pháp đơn giản hơn như Train-Test Split. Bạn sẽ khám phá nhiều phương pháp kiểm định chéo bằng Python và hiểu vì sao chọn đúng phương pháp có thể tác động lớn đến dự án của bạn. Cuối bài, bạn sẽ sẵn sàng áp dụng các chiến lược này với scikit-learn. 

Hãy bắt đầu để biến nỗ lực học máy của bạn trở nên thực sự đáng tin cậy!

K-Fold Cross-Validation là gì?

K-Fold Cross-Validation là một kỹ thuật mạnh mẽ dùng để đánh giá hiệu năng của mô hình học máy. Nó giúp đảm bảo mô hình khái quát hóa tốt lên dữ liệu chưa thấy bằng cách dùng các phần khác nhau của tập dữ liệu cho huấn luyện và kiểm tra qua nhiều vòng lặp. 

K-Fold Cross-Validation so với Train-Test Split

Trong khi K-Fold Cross-Validation chia tập dữ liệu thành nhiều tập con để lặp lại việc huấn luyện và kiểm tra mô hình, phương pháp Train-Test Split chỉ chia tập dữ liệu thành hai phần: một cho huấn luyện và một cho kiểm tra. Train-Test Split đơn giản và nhanh triển khai, nhưng ước lượng hiệu năng có thể phụ thuộc mạnh vào cách chia cụ thể, dẫn đến phương sai cao trong kết quả. 

Các hình dưới đây minh họa khác biệt cấu trúc giữa hai phương pháp này. Hình đầu cho thấy phương pháp Train-Test Split, trong đó tập dữ liệu được chia thành 80% huấn luyện và 20% kiểm tra.

Minh họa cho việc chia một tập dữ liệu thành phần huấn luyện và kiểm tra. Tập dữ liệu được chia thành 80% huấn luyện và 20% kiểm tra. Hình nhấn mạnh rằng chỉ có một mô hình được chấm điểm.

Minh họa Train/Test Split. Hình do tác giả thực hiện

Hình thứ hai mô tả 5-Fold Cross-Validation, trong đó tập dữ liệu được chia thành năm phần, mỗi phần lần lượt đóng vai trò tập kiểm tra trong một trong năm vòng lặp, đảm bảo mỗi đoạn dữ liệu đều được dùng cho cả huấn luyện và kiểm tra.

Sơ đồ 5-Fold Cross-Validation

Sơ đồ 5-Fold Cross-Validation. Hình do tác giả thực hiện

Ta có thể thấy K-Fold Cross-Validation mang lại ước lượng hiệu năng vững chắc và đáng tin cậy hơn vì nó giảm ảnh hưởng của tính biến động dữ liệu. Bằng cách dùng nhiều vòng huấn luyện và kiểm tra, nó giảm rủi ro quá khớp với một cách chia dữ liệu cụ thể. Phương pháp này cũng đảm bảo mọi điểm dữ liệu đều được dùng cho cả huấn luyện và xác thực, dẫn đến đánh giá toàn diện hơn về hiệu năng của mô hình. 

Triển khai K-Fold Cross-Validation trong Python với scikit-learn

Giờ hãy minh họa K-Fold Cross-Validation bằng bộ dữ liệu California Housing để đánh giá hiệu năng của một mô hình hồi quy tuyến tính. Cách này cung cấp ước lượng chính xác, vững chắc bằng cách kiểm tra lặp trên các tập con khác nhau của dữ liệu, đảm bảo đánh giá toàn diện.

Tổng quan về bộ dữ liệu California Housing

Bộ dữ liệu California Housing, do Pace và Barry (1997) tổng hợp, chứa dữ liệu từ Tổng điều tra Dân số Hoa Kỳ năm 1990 về nhà ở tại California. Nó bao gồm 20.640 quan sát với các đặc trưng như vị trí, tuổi nhà và dân số. Biến mục tiêu là giá trị nhà trung vị cho các quận tại California. 

Bộ dữ liệu cung cấp tập đặc trưng đa dạng về địa lý, nhân khẩu và kinh tế, rất phù hợp cho khoa học dữ liệu và ứng dụng học máy. Chúng ta sẽ bắt đầu ví dụ mã bằng cách tải trực tiếp từ thư viện scikit-learn. 

Tải bộ dữ liệu

Trước khi bắt đầu huấn luyện và đánh giá mô hình, chúng ta cần tải bộ dữ liệu. 

from sklearn.datasets import fetch_california_housing 
data = fetch_california_housing()

Đoạn mã này nhập hàm fetch_california_housing từ sklearn.datasets và gọi nó để tải bộ dữ liệu California Housing. Bộ dữ liệu được lưu trong biến data, chứa cả đặc trưng và biến mục tiêu. 

Chuẩn bị dữ liệu

Sau khi tải bộ dữ liệu, bước tiếp theo là chuẩn bị dữ liệu cho phân tích. 

import pandas as pd 
X = pd.DataFrame(data.data, columns=data.feature_names) 
y = data.target

Tại đây, ta dùng thư viện pandas để tạo DataFrame X chứa dữ liệu đặc trưng từ data.data. Các cột của DataFrame được gán nhãn bằng data.feature_names. Biến mục tiêu, đại diện giá trị nhà trung vị, được lưu riêng trong y. 

Thiết lập K-Fold Cross-Validation

Giờ là lúc thiết lập mô hình của chúng ta, bao gồm chọn giá trị cho K. Việc chọn K phù hợp là một bước quan trọng sẽ được đề cập chi tiết bên dưới. 

from sklearn.model_selection import KFold
k = 5 
kf = KFold(n_splits=k, shuffle=True, random_state=42)

Đoạn mã này khởi tạo K-Fold Cross-Validation bằng lớp KFold từ sklearn.model_selection. Chúng ta tạo đối tượng kf với 5 phần chia. Tùy chọn shuffle=True xáo trộn thứ tự các điểm dữ liệu, và random_state=42 đảm bảo việc xáo trộn nhất quán giữa các lần chạy. Thiết lập này thường là đủ để bắt đầu đánh giá hiệu năng mô hình với kiểm định chéo.  

Khởi tạo mô hình

Khi dữ liệu đã sẵn sàng và kiểm định chéo đã thiết lập, bước tiếp theo là chọn và khởi tạo mô hình. 

from sklearn.linear_model import LinearRegression 
model = LinearRegression()

Chúng ta nhập lớp LinearRegression từ sklearn.linear_model và tạo một thể hiện model. Mô hình này sẽ được dùng để thực hiện hồi quy tuyến tính trên bộ dữ liệu. 

Tiến hành kiểm định chéo

Giờ mô hình đã được khởi tạo, chúng ta có thể chuyển sang phần thú vị: thực hiện kiểm định chéo để đánh giá hiệu năng của mô hình trên các tập con dữ liệu khác nhau.

from sklearn.model_selection import cross_val_score 
scores = cross_val_score(model, X, y, cv=kf, scoring='r2')

Dòng này sử dụng hàm cross_val_score để đánh giá mô hình với tập dữ liệu X và mục tiêu y. Kiểm định chéo được thực hiện bằng thể hiện Kfold kf, và hiệu năng mô hình được đo bằng điểm R². 

Tính điểm R2 trung bình

Chúng ta có thể dùng R-squared làm thước đo để đánh giá tỷ lệ phương sai của biến phụ thuộc có thể dự đoán từ các biến độc lập, từ đó cung cấp cái nhìn về độ phù hợp của mô hình hồi quy.

import numpy as np 

average_r2 = np.mean(scores) 

print(f"R² Score for each fold: {[round(score, 4) for score in scores]}")
print(f"Average R² across {k} folds: {average_r2:.2f}")

Phần này tính điểm R² trung bình cho tất cả các fold. Trước tiên in ra điểm của từng fold, sau đó đến điểm trung bình. Việc dùng np.mean() tính trung bình các điểm thu thập được trong quá trình kiểm định chéo.

Hiển thị kết quả cuối cùng

Giờ chúng ta tổng hợp kết quả để có cái nhìn toàn diện về hiệu năng của mô hình. Điểm R² trung bình cung cấp một chỉ số duy nhất cho thấy mức độ hiệu quả của mô hình. 

R² Score for each fold: [0.5758, 0.6137, 0.6086, 0.6213, 0.5875]
Average R² across 5 folds: 0.60

Đây là đầu ra của đoạn mã ở bước trước. Nó hiển thị điểm R² cho từng fold và điểm R² trung bình.

Chữ ‘K’ trong K-Fold Cross-Validation đại diện cho gì?

Trong K-Fold Cross-Validation, ‘K’ là số nhóm mà tập dữ liệu được chia. Con số này quyết định số vòng kiểm tra mà mô hình trải qua, đảm bảo mỗi phần đều được dùng làm tập kiểm tra một lần. 

Một số kinh nghiệm thực tiễn: 

  • K = 2 hoặc 3: Các lựa chọn này hữu ích khi tài nguyên tính toán hạn chế hoặc cần đánh giá nhanh hơn. Chúng giảm số vòng huấn luyện, tiết kiệm thời gian và công suất tính toán trong khi vẫn cung cấp ước lượng hiệu năng hợp lý. 
  • K = 5 hoặc 10: Chọn K = 5 hoặc K = 10 là phổ biến vì cân bằng tốt giữa hiệu quả tính toán và ước lượng hiệu năng mô hình. 
  • K = 20: Dùng giá trị K lớn hơn có thể cho đánh giá chi tiết hơn. Tuy nhiên, nó tăng gánh nặng tính toán và có thể dẫn đến phương sai cao nếu các tập con quá nhỏ.

Để tìm hiểu thêm về ước lượng hiệu năng mô hình, hãy cân nhắc khóa học Model Validation in Python toàn diện của chúng tôi.

Những lưu ý quan trọng khi dùng K-Fold Cross-Validation

Số lượng fold, hay 'K', trong K-Fold Cross-Validation ảnh hưởng đến cả độ chi tiết của quá trình xác thực lẫn tải tính toán. K nhỏ hơn (ví dụ, 3–5) có thể nhanh hơn nhưng cho ước lượng kém tin cậy hơn vì mỗi fold đại diện phần lớn hơn của tập dữ liệu, có thể bỏ lỡ các kịch bản dữ liệu đa dạng. K lớn hơn (ví dụ, 10) cung cấp đánh giá chi tiết hơn với chi phí tính toán tăng lên. Điểm khởi đầu thường dùng là K=5 hoặc K=10, thường đủ để có ước lượng tin cậy mà không quá tốn kém tính toán.

Rất khuyến nghị xáo trộn dữ liệu trong K-Fold Cross-Validation để nâng cao tính hợp lệ của đánh giá mô hình. Bằng cách đặt shuffle=True, việc xáo trộn phá vỡ bất kỳ trật tự cố hữu nào trong tập dữ liệu có thể gây thiên lệch trong quá trình xác thực. Điều này đảm bảo mỗi fold đại diện cho toàn bộ tập dữ liệu, rất quan trọng để đánh giá mức độ mô hình khái quát hóa lên dữ liệu mới. Tuy nhiên, cần tránh xáo trộn trong các trường hợp chuỗi thời gian, nơi thứ tự các điểm dữ liệu có ý nghĩa, để bảo toàn tính toàn vẹn của quá trình học. 

Đảm bảo kết quả của K-Fold Cross-Validation có thể tái lập là rất quan trọng để kiểm chứng độ ổn định và hiệu năng mô hình. Có thể đạt được điều này bằng cách thiết lập tham số random_state, đảm bảo việc xáo trộn dữ liệu nhất quán giữa các lần chạy khác nhau, cho phép các lần chia dữ liệu giống hệt nhau và do đó kết quả có thể tái lập.  

K-Fold tiêu chuẩn so với các phương pháp kiểm định chéo khác

Chọn kỹ thuật kiểm định chéo phù hợp là điều then chốt trong việc xây dựng các mô hình học máy đáng tin cậy. Lựa chọn này phụ thuộc nhiều vào đặc điểm cụ thể của tập dữ liệu và loại tác vụ học máy. Các kỹ thuật khác nhau được thiết kế để xử lý nhiều thách thức như dữ liệu mất cân bằng hoặc cấu trúc dữ liệu theo nhóm. 

Bảng dưới đây cung cấp so sánh toàn diện các phương pháp kiểm định chéo phổ biến, làm nổi bật đặc điểm riêng và trường hợp sử dụng tốt nhất của chúng để giúp bạn chọn kỹ thuật hiệu quả nhất cho nhu cầu mô hình hóa cụ thể.

Loại kiểm định chéoMục đích sử dụngMô tảKhi nào nên dùng
K-Fold Cross-Validation tiêu chuẩnCả hồi quy và phân loạiChia tập dữ liệu thành k fold có kích thước bằng nhau. Mỗi fold được dùng một lần làm tập kiểm tra.Tốt nhất cho các tập dữ liệu cân bằng để đảm bảo đánh giá mô hình toàn diện.
Stratified K-Fold Cross-ValidationChủ yếu cho phân loạiGiữ nguyên tỷ lệ nhãn lớp trong mỗi fold như ở tập dữ liệu gốc.Tuyệt vời cho bài toán phân loại với lớp mất cân bằng để duy trì tỷ lệ nhóm.
Leave-One-Out Cross-Validation (LOOCV)Cả hồi quy và phân loạiMỗi điểm dữ liệu được dùng một lần làm tập kiểm tra, phần còn lại làm huấn luyện.Tốt cho tập dữ liệu nhỏ để tối đa hóa dữ liệu huấn luyện, dù chi phí tính toán cao.
Leave-P-Out Cross-ValidationCả hồi quy và phân loạiTương tự LOOCV, nhưng loại ra p điểm dữ liệu cho tập kiểm tra.Lý tưởng cho tập dữ liệu nhỏ để kiểm tra tác động của thay đổi mẫu dữ liệu lên độ ổn định mô hình.
Group K-Fold Cross-ValidationCả hồi quy và phân loại có nhómĐảm bảo không nhóm nào xuất hiện đồng thời trong tập huấn luyện và kiểm tra, hữu ích khi các điểm dữ liệu không độc lập.Tuyệt vời cho tập dữ liệu có phân nhóm logic để kiểm tra hiệu năng trên các nhóm độc lập.
Stratified Group K-Fold Cross-ValidationChủ yếu cho phân loại với dữ liệu theo nhómKết hợp phân tầng và toàn vẹn nhóm, đảm bảo các nhóm không bị tách giữa các fold.Tuyệt vời cho tập dữ liệu vừa có nhóm vừa mất cân bằng để duy trì cả tính toàn vẹn lớp và nhóm.

Kết luận

Hướng dẫn này đã chỉ ra K-Fold Cross-Validation là công cụ mạnh mẽ để đánh giá mô hình học máy. Nó tốt hơn Train-Test Split đơn giản vì kiểm tra mô hình trên nhiều phần dữ liệu của bạn, giúp bạn tin tưởng rằng mô hình cũng sẽ vận hành tốt trên dữ liệu chưa thấy.

Nếu bạn đang bước vào lĩnh vực học máy, dưới đây là vài tài nguyên hữu ích đồng hành cùng bạn: 

  • Khóa học Supervised Learning with Scikit-Learn của DataCamp: Khóa học này giúp bạn nắm vững mô hình dự đoán. Thực hành và trực quan, lý tưởng để bắt đầu hành trình. Xem khóa học tại đây.
  • Tutorial Machine Learning với Python: Hướng dẫn này phân tích các ý tưởng cốt lõi của học máy và cách áp dụng. Hoàn hảo để củng cố kiến thức của bạn. Đọc hướng dẫn tại đây.
  • Cheat Sheet Scikit-Learn: Hãy giữ bảng tóm tắt này bên mình. Rất hữu ích như một gợi nhớ nhanh cách dùng các hàm học máy khi bạn làm dự án. Tải bảng tóm tắt tại đây.
  • Khóa học Kaggle Competition của DataCamp: Nếu bạn muốn thử thách kỹ năng, khóa học này rất hay. Nó dạy cách tỏa sáng trong các cuộc thi Kaggle, nơi bạn có thể áp dụng những gì đã học một cách thú vị và cạnh tranh. Bắt đầu khóa học tại đây.

Những tài nguyên này sẽ dẫn đường cho bạn, dù mới bắt đầu hay muốn ôn luyện kỹ năng. Chúng kết hợp lý thuyết và mẹo thực hành, giúp bạn sẵn sàng xây dựng và tinh chỉnh các mô hình chính xác.

Câu hỏi thường gặp

Bạn diễn giải các điểm số kiểm định chéo thu được từ K-Fold Cross-Validation như thế nào?

Các điểm số kiểm định chéo cung cấp ước lượng về hiệu năng của mô hình trên dữ liệu chưa thấy. Điểm trung bình cao hơn trên các fold cho thấy khả năng khái quát hóa tốt hơn. Tuy nhiên, cũng cần xem xét phương sai của điểm số giữa các fold. Phương sai cao cho thấy hiệu năng của mô hình nhạy với cách chia dữ liệu cụ thể, có thể chỉ ra hiện tượng quá khớp hoặc cần thêm dữ liệu. Hãy hướng tới điểm trung bình cao cùng phương sai thấp để có mô hình vững chắc và đáng tin cậy.

Bạn có thể dùng K-Fold Cross-Validation cho dữ liệu chuỗi thời gian không?

K-Fold Cross-Validation tiêu chuẩn giả định dữ liệu độc lập và phân phối đồng nhất, điều này bị vi phạm trong chuỗi thời gian do phụ thuộc theo thời gian. Với chuỗi thời gian, bạn nên dùng các kỹ thuật như Time Series Split hoặc forward chaining, trong đó tập huấn luyện chỉ bao gồm các điểm dữ liệu xảy ra trước tập kiểm tra.

Những sai lầm thường gặp cần tránh khi thiết lập K-Fold Cross-Validation là gì?

Một số sai lầm thường gặp gồm không xáo trộn dữ liệu, có thể gây thiên lệch nếu tập dữ liệu có trật tự cố hữu, và bỏ qua tính ngẫu nhiên trong việc gán fold, có thể dẫn đến biến thiên hiệu năng giữa các lần chạy. Đảm bảo dữ liệu được xáo trộn (khi phù hợp) và đặt random_state cố định để tái lập là những thực hành then chốt để tránh các vấn đề này.

K-Fold Cross-Validation có thể được dùng cho các tác vụ học không giám sát không?

K-Fold Cross-Validation thường được dùng cho học có giám sát để ước lượng hiệu năng dự đoán, nhưng có thể điều chỉnh cho một số tác vụ không giám sát như phân cụm bằng cách đánh giá độ ổn định của phân cụm qua các fold. Tuy nhiên, nó không trực quan như trong bối cảnh có giám sát.

K-Fold Cross-Validation xử lý các tập dữ liệu có nhiều thang đo đặc trưng như thế nào?

Bản thân K-Fold Cross-Validation không xử lý trực tiếp các thang đo đặc trưng khác nhau. Điều quan trọng là tiền xử lý tập dữ liệu, thường bằng chuẩn hóa hoặc tiêu chuẩn hóa, trước khi áp dụng K-Fold Cross-Validation. Điều này đảm bảo các đặc trưng có thang đo lớn hơn không lấn át quá trình học của mô hình, giúp việc đánh giá công bằng và khả năng khái quát hóa tốt hơn.

Vinod Chugani

Tác giả

Vinod Chugani

Vinod Chugani bắt đầu sự nghiệp tại Tokyo với vai trò Trưởng bàn giao dịch bán hàng Quỹ phòng hộ trẻ nhất của JPMorgan, sau đó lập kỷ lục doanh số cá nhân tại Lehman Brothers, rồi xây dựng một doanh nghiệp phân phối điện tử tại 30 quốc gia vượt mốc doanh thu 100 triệu đô la Singapore trước khi chuyển hướng sang dữ liệu. Tốt nghiệp Kinh tế Duke và là cựu học viên NYC Data Science Academy, anh là một trong ba người nhận học bổng trong hơn 100 ứng viên cho khóa học Building AI Applications của Hugo Bowne-Anderson trên Maven. Hiện nay, anh viết cho DataCamp, KDnuggets, Machine Learning Mastery và Statology về các chủ đề từ thống kê đến AI hành động, và cố vấn cho các chuyên gia dữ liệu tại NYC Data Science Academy với hơn 1.000 buổi kèm 1-1 đã thực hiện.

 

Chủ đề

Liên quan