Học máy - Xác thực chéo
Trên trang này, W3schools.com hợp tác với Học viện Khoa học Dữ liệu NYC để cung cấp nội dung đào tạo kỹ thuật số cho sinh viên của chúng tôi.
Xác thực chéo
Khi điều chỉnh các mô hình, chúng tôi hướng tới việc tăng hiệu suất tổng thể của mô hình trên dữ liệu chưa được nhìn thấy. Điều chỉnh siêu tham số có thể mang lại hiệu suất tốt hơn nhiều trên các bộ thử nghiệm. Tuy nhiên, việc tối ưu hóa các tham số cho tập kiểm tra có thể dẫn đến rò rỉ thông tin khiến mô hình hoạt động kém hơn trên dữ liệu không nhìn thấy được. Để khắc phục điều này, chúng tôi có thể thực hiện xác nhận chéo.
Để hiểu rõ hơn về CV, chúng tôi sẽ thực hiện các phương pháp khác nhau trên tập dữ liệu mống mắt. Trước tiên chúng ta hãy tải vào và phân tách dữ liệu.
from sklearn import datasets
X, y = datasets.load_iris(return_X_y=True)
Có nhiều phương pháp để xác thực chéo, chúng ta sẽ bắt đầu bằng cách xem xét xác thực chéo k-Fold.
K -Fold
Dữ liệu huấn luyện được sử dụng trong mô hình được chia thành k tập nhỏ hơn để sử dụng để xác nhận mô hình. Mô hình sau đó được huấn luyện trên tập huấn luyện k-1. Phần còn lại sau đó được sử dụng làm bộ xác thực để đánh giá mô hình.
Vì chúng ta sẽ cố gắng phân loại các loài hoa diên vĩ khác nhau nên chúng ta sẽ cần nhập một mô hình phân loại, đối với bài tập này, chúng ta sẽ sử dụng DecisionTreeClassifier
. Chúng tôi cũng sẽ cần nhập mô-đun CV từ sklearn
.
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold, cross_val_score
Với dữ liệu được tải, giờ đây chúng ta có thể tạo và điều chỉnh mô hình để đánh giá.
clf = DecisionTreeClassifier(random_state=42)
Bây giờ, hãy đánh giá mô hình của chúng tôi và xem nó hoạt động như thế nào trên mỗi lần k -fold.
k_folds = KFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = k_folds)
Bạn cũng nên xem CV hoạt động tổng thể như thế nào bằng cách tính điểm trung bình cho tất cả các lần gấp.
Ví dụ
Chạy CV gấp k:
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
k_folds = KFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = k_folds)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
Chạy ví dụ »QUẢNG CÁO
K-Fold phân tầng
Trong trường hợp các lớp bị mất cân bằng, chúng ta cần một cách để giải quyết sự mất cân bằng trong cả tập huấn luyện và tập xác thực. Để làm như vậy, chúng ta có thể phân tầng các lớp mục tiêu, nghĩa là cả hai bộ sẽ có tỷ lệ tất cả các lớp bằng nhau.
Ví dụ
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
sk_folds = StratifiedKFold(n_splits = 5)
scores = cross_val_score(clf, X, y, cv = sk_folds)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
Chạy ví dụ »Mặc dù số lần gấp là như nhau nhưng CV trung bình sẽ tăng so với lần gấp k cơ bản khi đảm bảo có các lớp được phân tầng.
Nghỉ phép một lần (LOO)
Thay vì chọn số lần phân chia trong tập dữ liệu huấn luyện như LeaveOneOut gấp k lần, hãy sử dụng 1 quan sát để xác thực và n-1 quan sát để huấn luyện. Phương pháp này là một kỹ thuật đầy đủ.
Ví dụ
Chạy LOO CV:
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import LeaveOneOut, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
loo = LeaveOneOut()
scores = cross_val_score(clf, X, y, cv = loo)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
Chạy ví dụ »Chúng ta có thể quan sát thấy rằng số điểm xác thực chéo được thực hiện bằng số lượng quan sát trong tập dữ liệu. Trong trường hợp này có 150 quan sát trong tập dữ liệu mống mắt.
Điểm CV trung bình là 94%.
Nghỉ phép P-Out (LPO)
Leave-P-Out chỉ đơn giản là một sự khác biệt về sắc thái đối với ý tưởng Leave-One-Out, trong đó chúng ta có thể chọn số lượng p để sử dụng trong bộ xác thực của mình.
Ví dụ
Chạy CV LPO:
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import LeavePOut, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
lpo = LeavePOut(p=2)
scores = cross_val_score(clf, X, y, cv = lpo)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
Chạy ví dụ »Như chúng ta có thể thấy đây là một phương pháp toàn diện, chúng tôi tính toán nhiều điểm hơn so với Bỏ một lần, ngay cả với ap = 2, nhưng nó đạt được điểm CV trung bình gần như nhau.
Chia ngẫu nhiên
Không giống như KFold
, ShuffleSplit
loại bỏ một phần trăm dữ liệu, không được sử dụng trong tập huấn luyện hoặc tập hợp xác thực. Để làm như vậy, chúng ta phải quyết định kích thước đoàn tàu và thử nghiệm cũng như số lần phân chia.
Ví dụ
Chạy ngẫu nhiên chia CV:
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import ShuffleSplit, cross_val_score
X, y = datasets.load_iris(return_X_y=True)
clf = DecisionTreeClassifier(random_state=42)
ss = ShuffleSplit(train_size=0.6, test_size=0.3, n_splits = 5)
scores = cross_val_score(clf, X, y, cv = ss)
print("Cross Validation Scores: ", scores)
print("Average CV Score: ", scores.mean())
print("Number of CV Scores used in Average: ", len(scores))
Chạy ví dụ »Ghi chú kết thúc
Đây chỉ là một số phương pháp CV có thể áp dụng cho người mẫu. Có nhiều lớp xác thực chéo hơn, hầu hết các mô hình đều có lớp riêng. Kiểm tra xác thực chéo sklearns để có thêm tùy chọn CV.