Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

Học các tham số của hàm dự đoán và kiểm tra nó trên cùng một dữ liệu là một sai lầm về phương pháp: một mô hình sẽ lặp lại nhãn của các mẫu mà nó vừa thấy sẽ có một số điểm hoàn hảo nhưng sẽ không dự đoán bất cứ điều gì hữu ích trên Dữ liệu vô hình. Tình huống này được gọi là quá mức. Để tránh nó, đó là thực tế phổ biến khi thực hiện một thí nghiệm học máy (có giám sát) để giữ một phần dữ liệu có sẵn dưới dạng tập kiểm tra

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
4. Lưu ý rằng từ thử nghiệm của người Viking không nhằm biểu thị việc sử dụng học tập, bởi vì ngay cả trong cài đặt thương mại, học máy thường bắt đầu thực nghiệm. Dưới đây là một sơ đồ của quy trình xác nhận chéo điển hình trong đào tạo mô hình. Các tham số tốt nhất có thể được xác định bằng các kỹ thuật tìm kiếm lưới.overfitting. To avoid it, it is common practice when performing a (supervised) machine learning experiment to hold out part of the available data as a test set
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
4. Note that the word “experiment” is not intended to denote academic use only, because even in commercial settings machine learning usually starts out experimentally. Here is a flowchart of typical cross validation workflow in model training. The best parameters can be determined by grid search techniques.

Show
Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

Trong scikit-learn, một bộ chia ngẫu nhiên thành các bộ đào tạo và thử nghiệm có thể nhanh chóng được tính toán với hàm trợ giúp

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
5. Hãy để tải dữ liệu IRIS để phù hợp với máy vectơ hỗ trợ tuyến tính trên đó:

>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import datasets
>>> from sklearn import svm

>>> X, y = datasets.load_iris(return_X_y=True)
>>> X.shape, y.shape
((150, 4), (150,))

Bây giờ chúng tôi có thể nhanh chóng lấy mẫu một bộ đào tạo trong khi giữ 40% dữ liệu để kiểm tra (đánh giá) trình phân loại của chúng tôi:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...

Khi đánh giá các cài đặt khác nhau (Hyperparameter,) cho các công cụ ước tính, chẳng hạn như cài đặt

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
6 phải được đặt thủ công cho SVM, vẫn có nguy cơ quá mức trên tập kiểm tra vì các tham số có thể được điều chỉnh cho đến khi công cụ ước tính thực hiện tối ưu. Bằng cách này, kiến ​​thức về bộ thử nghiệm có thể rò rỉ vào mô hình và các số liệu đánh giá không còn báo cáo về hiệu suất tổng quát hóa. Để giải quyết vấn đề này, nhưng một phần khác của bộ dữ liệu có thể được đưa ra như một cái gọi là bộ xác thực đã được , Đánh giá cuối cùng có thể được thực hiện trên bộ thử nghiệm.

Tuy nhiên, bằng cách phân vùng dữ liệu có sẵn thành ba bộ, chúng tôi giảm đáng kể số lượng mẫu có thể được sử dụng để học mô hình và kết quả có thể phụ thuộc vào một lựa chọn ngẫu nhiên cụ thể cho cặp (Train, xác thực).

Một giải pháp cho vấn đề này là một thủ tục gọi là xác thực chéo (viết tắt là CV). Một bộ thử nghiệm vẫn nên được tổ chức để đánh giá cuối cùng, nhưng bộ xác nhận không còn cần thiết khi thực hiện CV. Theo cách tiếp cận cơ bản, được gọi là CV gấp K, tập huấn luyện được chia thành các bộ nhỏ hơn (các phương pháp khác được mô tả dưới đây, nhưng thường tuân theo các nguyên tắc tương tự). Quy trình sau đây được tuân thủ cho mỗi lần K Kiêu:

  • Một mô hình được đào tạo bằng cách sử dụng \ (K-1 \) của các nếp gấp làm dữ liệu đào tạo;\(k-1\) of the folds as training data;

  • Mô hình kết quả được xác nhận trên phần còn lại của dữ liệu (nghĩa là, nó được sử dụng làm bộ thử nghiệm để tính toán một biện pháp hiệu suất như độ chính xác).

Biện pháp hiệu suất được báo cáo bởi xác nhận chéo gấp K sau đó là trung bình của các giá trị được tính toán trong vòng lặp. Cách tiếp cận này có thể tốn kém về mặt tính toán, nhưng không lãng phí quá nhiều dữ liệu (như trường hợp khi sửa một bộ xác thực tùy ý), đây là một lợi thế lớn trong các vấn đề như suy luận nghịch đảo trong đó số lượng mẫu rất nhỏ.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

3.1.1. Điện toán các số liệu được xác nhận chéoComputing cross-validated metrics¶

Cách đơn giản nhất để sử dụng xác thực chéo là gọi hàm trợ giúp

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
7 trên công cụ ước tính và bộ dữ liệu.

Ví dụ sau đây cho thấy cách ước tính độ chính xác của máy vectơ hỗ trợ nhân tuyến tính trên bộ dữ liệu IRIS bằng cách chia dữ liệu, lắp mô hình và tính toán điểm 5 lần liên tiếp (với các lần chia khác nhau mỗi lần):

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])

Điểm trung bình và độ lệch chuẩn được đưa ra bởi:

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02

Theo mặc định, điểm số được tính toán tại mỗi lần lặp CV là phương pháp

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
8 của công cụ ước tính. Có thể thay đổi điều này bằng cách sử dụng tham số tính điểm:

>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])

Xem tham số tính điểm: Xác định quy tắc đánh giá mô hình để biết chi tiết. Trong trường hợp của bộ dữ liệu IRIS, các mẫu được cân bằng giữa các lớp đích do đó độ chính xác và điểm F1 gần như bằng nhau.The scoring parameter: defining model evaluation rules for details. In the case of the Iris dataset, the samples are balanced across target classes hence the accuracy and the F1-score are almost equal.

Khi đối số

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
9 là một số nguyên,
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
7 sử dụng các chiến lược
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 hoặc
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
2 theo mặc định, thì sau này sẽ được sử dụng nếu công cụ ước tính bắt nguồn từ
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
3.

Cũng có thể sử dụng các chiến lược xác thực chéo khác bằng cách chuyển một trình lặp xác thực chéo, ví dụ::

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])

Một tùy chọn khác là sử dụng một phần phân tách năng suất (tàu, kiểm tra) có thể lặp lại như các mảng của các chỉ số, ví dụ:

>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])

3.1.1.1. Chức năng Cross_Validate và đánh giá nhiều số liệuThe cross_validate function and multiple metric evaluation¶

Hàm

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
4 khác với
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
7 theo hai cách:

  • Nó cho phép chỉ định nhiều số liệu để đánh giá.

  • Nó trả về một chế độ chứa thời gian phù hợp, thời gian điểm (và điểm đào tạo tùy chọn cũng như các công cụ ước tính được trang bị) ngoài điểm số kiểm tra.

Để đánh giá số liệu đơn, trong đó tham số tính điểm là một chuỗi, có thể gọi được hoặc không có, các khóa sẽ là -

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
6

Và đối với đánh giá nhiều số liệu, giá trị trả lại là một lệnh với các khóa sau -

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
7

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
8 được đặt thành
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
9 theo mặc định để tiết kiệm thời gian tính toán. Để đánh giá điểm số trong tập huấn luyện cũng như bạn cần đặt nó thành
>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
0.

Bạn cũng có thể giữ lại công cụ ước tính được trang bị trên mỗi bộ đào tạo bằng cách cài đặt

>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
1.

Nhiều số liệu có thể được chỉ định dưới dạng danh sách, tuple hoặc tập hợp tên ghi bàn được xác định trước:

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])

Hoặc như một tên ghi bàn lập bản đồ dict cho chức năng chấm điểm được xác định trước hoặc tùy chỉnh:

>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])

Dưới đây là một ví dụ về

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
4 bằng cách sử dụng một số liệu duy nhất:

>>> scores = cross_validate(clf, X, y,
...                         scoring='precision_macro', cv=5,
...                         return_estimator=True)
>>> sorted(scores.keys())
['estimator', 'fit_time', 'score_time', 'test_score']

3.1.1.2. Có được dự đoán bằng cách xác thực chéoObtaining predictions by cross-validation¶

Hàm

>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
3 có giao diện tương tự như
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
7, nhưng trả về, cho mỗi phần tử trong đầu vào, dự đoán thu được cho phần tử đó khi nó nằm trong bộ thử nghiệm. Chỉ các chiến lược xác thực chéo gán tất cả các yếu tố cho tập kiểm tra chính xác một lần có thể được sử dụng (nếu không, một ngoại lệ được nâng lên).

Cảnh báo

Lưu ý về việc sử dụng Cross_Val_Predict không phù hợp

Kết quả của

>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
3 có thể khác với kết quả thu được bằng cách sử dụng
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
7 vì các yếu tố được nhóm theo những cách khác nhau. Hàm
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
7 có trung bình trên các nếp gấp xác thực chéo, trong khi
>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
3 chỉ đơn giản trả lại các nhãn (hoặc xác suất) từ một số mô hình riêng biệt không được phân biệt. Do đó,
>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
3 không phải là thước đo phù hợp của lỗi tổng quát hóa.

Hàm
>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
3 phù hợp với:
  • Trực quan hóa các dự đoán thu được từ các mô hình khác nhau.

  • Pha trộn mô hình: Khi dự đoán của một công cụ ước tính được giám sát được sử dụng để đào tạo một công cụ ước tính khác trong các phương pháp hòa tấu.

Các trình lặp xác thực chéo có sẵn được giới thiệu trong phần sau.

3.1.2. Xác thực chéo iterators¶Cross validation iterators¶

Các phần sau đây danh sách các tiện ích để tạo các chỉ số có thể được sử dụng để tạo ra các phân tách bộ dữ liệu theo các chiến lược xác thực chéo khác nhau.

3.1.2.1. Trình lặp xác nhận chéo cho I.I.D. dữ liệu¶Cross-validation iterators for i.i.d. data¶

Giả sử rằng một số dữ liệu là độc lập và phân phối giống hệt nhau (i.i.d.) đang đưa ra giả định rằng tất cả các mẫu bắt nguồn từ cùng một quy trình thế hệ và quy trình tổng quát được giả định là không có bộ nhớ về các mẫu được tạo trong quá khứ.

Các validators chéo sau đây có thể được sử dụng trong các trường hợp như vậy.

Ghi chú

Trong khi I.I.D. Dữ liệu là một giả định phổ biến trong lý thuyết học máy, nó hiếm khi giữ trong thực tế. Nếu người ta biết rằng các mẫu đã được tạo bằng cách sử dụng quy trình phụ thuộc vào thời gian, sẽ an toàn hơn khi sử dụng sơ đồ xác nhận chéo chuỗi thời gian. Tương tự, nếu chúng ta biết rằng quy trình tổng quát có cấu trúc nhóm (các mẫu được thu thập từ các đối tượng, thí nghiệm, thiết bị đo khác nhau), sẽ an toàn hơn khi sử dụng xác thực chéo theo nhóm.time-series aware cross-validation scheme. Similarly, if we know that the generative process has a group structure (samples collected from different subjects, experiments, measurement devices), it is safer to use group-wise cross-validation.

3.1.2.1.1. K-gấpK-fold¶

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 Chia tất cả các mẫu trong các nhóm mẫu \ (k \), được gọi là nếp gấp (nếu \ (k = n \), điều này tương đương với chiến lược để lại một), có kích thước bằng nhau (nếu có thể). Hàm dự đoán được học bằng cách sử dụng các nếp gấp \ (k - 1 \) và nếp gấp còn lại được sử dụng để kiểm tra.\(k\) groups of samples, called folds (if \(k = n\), this is equivalent to the Leave One Out strategy), of equal sizes (if possible). The prediction function is learned using \(k - 1\) folds, and the fold left out is used for test.

Ví dụ về xác thực chéo 2 lần trên bộ dữ liệu với 4 mẫu:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
0

Dưới đây là hình dung của hành vi xác thực chéo. Lưu ý rằng

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 không bị ảnh hưởng bởi các lớp hoặc nhóm.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

Mỗi nếp gấp được cấu thành bởi hai mảng: bản đầu tiên có liên quan đến tập huấn luyện và thứ hai của tập kiểm tra. Do đó, người ta có thể tạo các bộ đào tạo/kiểm tra bằng cách sử dụng lập chỉ mục Numpy:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
1

3.1.2.1.2. Lặp đi lặp lại k-gấpRepeated K-Fold¶

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
3 Lặp lại K-Fold n lần. Nó có thể được sử dụng khi người ta yêu cầu chạy
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 N lần, tạo ra các phân tách khác nhau trong mỗi lần lặp lại.

Ví dụ về gấp 2 lần K lần lặp lại 2 lần:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
2

Tương tự,

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
5 lặp lại phân tầng K lần n lần với ngẫu nhiên khác nhau trong mỗi lần lặp lại.

3.1.2.1.3. Để một cái ra (loo) ¶Leave One Out (LOO)¶

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
6 (hoặc LOO) là một xác thực chéo đơn giản. Mỗi bộ học tập được tạo bằng cách lấy tất cả các mẫu ngoại trừ một, tập kiểm tra là mẫu bị bỏ lại. Do đó, đối với các mẫu \ (n \), chúng tôi có các bộ đào tạo khác nhau \ (n \) và các thử nghiệm khác nhau \ (n \). Quy trình xác thực chéo này không lãng phí nhiều dữ liệu vì chỉ có một mẫu được xóa khỏi tập huấn luyện:\(n\) samples, we have \(n\) different training sets and \(n\) different tests set. This cross-validation procedure does not waste much data as only one sample is removed from the training set:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
3

Người dùng tiềm năng của LOO để lựa chọn mô hình nên nặng một vài cảnh báo đã biết. Khi so sánh với \ (k \)-Xác thực chéo gấp, một mô hình xây dựng \ (n \) từ các mẫu \ (n \) thay vì các mô hình \ (k \), trong đó \ (n> k \). Hơn nữa, mỗi mẫu được đào tạo trên các mẫu \ (n - 1 \) chứ không phải \ ((k -1) n / k \). Theo cả hai cách, giả sử \ (k \) không quá lớn và \ (k \(k\)-fold cross validation, one builds \(n\) models from \(n\) samples instead of \(k\) models, where \(n > k\). Moreover, each is trained on \(n - 1\) samples rather than \((k-1) n / k\). In both ways, assuming \(k\) is not too large and \(k < n\), LOO is more computationally expensive than \(k\)-fold cross validation.

Về độ chính xác, LOO thường dẫn đến phương sai cao như một công cụ ước tính cho lỗi kiểm tra. Theo trực giác, vì \ (n - 1 \) của các mẫu \ (n \) được sử dụng để xây dựng từng mô hình, các mô hình được xây dựng từ các nếp gấp hầu như giống hệt nhau và với mô hình được xây dựng từ toàn bộ tập huấn luyện.\(n - 1\) of the \(n\) samples are used to build each model, models constructed from folds are virtually identical to each other and to the model built from the entire training set.

Tuy nhiên, nếu đường cong học tập dốc về kích thước đào tạo được đề cập, thì xác thực chéo 5 hoặc 10 lần có thể đánh giá quá cao lỗi tổng quát hóa.

Theo nguyên tắc chung, hầu hết các tác giả và bằng chứng thực nghiệm, cho thấy rằng xác nhận chéo 5 hoặc 10 lần nên được ưu tiên để loo.

3.1.2.1.4. Để P Out (LPO) ¶Leave P Out (LPO)¶

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
7 rất giống với
>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
6 vì nó tạo ra tất cả các bộ đào tạo/kiểm tra có thể bằng cách xóa các mẫu \ (p \) khỏi bộ hoàn chỉnh. Đối với các mẫu \ (n \), điều này tạo ra các cặp thử nghiệm \ ({n \ chọn p} \). Không giống như
>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
6 và
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1, các bộ kiểm tra sẽ trùng nhau cho \ (p> 1 \).\(p\) samples from the complete set. For \(n\) samples, this produces \({n \choose p}\) train-test pairs. Unlike
>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
6 and
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1, the test sets will overlap for \(p > 1\).

Ví dụ về Rời bỏ-2 trên bộ dữ liệu với 4 mẫu:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
4

3.1.2.1.5. HYMUTATION ngẫu nhiên xác nhận chéo a.k.a. Shuffle & Split¶Random permutations cross-validation a.k.a. Shuffle & Split¶

Trình lặp

>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
1 sẽ tạo ra một số lượng người dùng được xác định bởi các phân tách bộ dữ liệu / thử nghiệm độc lập. Các mẫu đầu tiên được xáo trộn và sau đó chia thành một cặp tàu và bộ thử nghiệm.

Có thể kiểm soát tính ngẫu nhiên đối với khả năng tái tạo của các kết quả bằng cách gieo hạt rõ ràng bộ tạo số ngẫu nhiên giả.

Đây là một ví dụ sử dụng:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
5

Dưới đây là hình dung của hành vi xác thực chéo. Lưu ý rằng

>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
1 không bị ảnh hưởng bởi các lớp hoặc nhóm.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

Do đó,

>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
1 là một giải pháp thay thế tốt cho xác thực chéo
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 cho phép kiểm soát tốt hơn về số lần lặp và tỷ lệ mẫu ở mỗi bên của việc phân chia tàu / thử nghiệm.

3.1.2.2. Trình lặp xác nhận chéo với sự phân tầng dựa trên nhãn lớp.¶Cross-validation iterators with stratification based on class labels.¶

Một số vấn đề phân loại có thể thể hiện sự mất cân bằng lớn trong phân phối các lớp mục tiêu: ví dụ: có thể có nhiều lần mẫu âm hơn nhiều lần so với các mẫu dương tính. Trong những trường hợp như vậy, nên sử dụng lấy mẫu phân tầng như được triển khai trong

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
2 và
>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
7 để đảm bảo rằng các tần số lớp tương đối được bảo tồn xấp xỉ trong mỗi tàu và xác nhận.

3.1.2.2.1. Phân tầng K-Fold¶Stratified k-fold¶

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
2 là một biến thể của K-Fold trả về các nếp gấp phân tầng: mỗi bộ chứa xấp xỉ tỷ lệ phần trăm của các mẫu của mỗi lớp mục tiêu như được đặt hoàn chỉnh.

Dưới đây là một ví dụ về xác thực chéo 3 lần phân tầng trên bộ dữ liệu với 50 mẫu từ hai lớp không cân bằng. Chúng tôi hiển thị số lượng mẫu trong mỗi lớp và so sánh với

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1.

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
6

Chúng ta có thể thấy rằng

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
2 bảo tồn các tỷ lệ lớp (khoảng 1/10) trong cả bộ dữ liệu đào tạo và thử nghiệm.

Dưới đây là hình dung của hành vi xác thực chéo.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])
5 có thể được sử dụng để lặp lại lần n-gấp n lần với các ngẫu nhiên khác nhau trong mỗi lần lặp lại.

3.1.2.2.2. Phân tầng chia táchStratified Shuffle Split¶

>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
7 là một biến thể của Shufflesplit, trả về các phân tách phân tầng, tức là tạo ra sự phân chia bằng cách bảo tồn cùng một tỷ lệ phần trăm cho mỗi lớp mục tiêu như trong tập hợp hoàn chỉnh.

Dưới đây là hình dung của hành vi xác thực chéo.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

>>> from sklearn.model_selection import ShuffleSplit >>> n_samples = X.shape[0] >>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0) >>> cross_val_score(clf, X, y, cv=cv) array([0.977..., 0.977..., 1. ..., 0.955..., 1. ]) 5 có thể được sử dụng để lặp lại lần n-gấp n lần với các ngẫu nhiên khác nhau trong mỗi lần lặp lại.Cross-validation iterators for grouped data¶

3.1.2.2.2. Phân tầng chia tách

>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
7 là một biến thể của Shufflesplit, trả về các phân tách phân tầng, tức là tạo ra sự phân chia bằng cách bảo tồn cùng một tỷ lệ phần trăm cho mỗi lớp mục tiêu như trong tập hợp hoàn chỉnh.

3.1.2.3. Trình lặp xác nhận chéo cho dữ liệu được nhóm

I.I.D. Giả định bị phá vỡ nếu các nhóm sản lượng thế hệ cơ bản của các mẫu phụ thuộc.

Một nhóm dữ liệu như vậy là miền cụ thể. Một ví dụ sẽ là khi có dữ liệu y tế được thu thập từ nhiều bệnh nhân, với nhiều mẫu được lấy từ mỗi bệnh nhân. Và dữ liệu đó có khả năng phụ thuộc vào nhóm riêng lẻ. Trong ví dụ của chúng tôi, ID bệnh nhân cho mỗi mẫu sẽ là định danh nhóm của nó.Group k-fold¶

Trong trường hợp này, chúng tôi muốn biết liệu một mô hình được đào tạo trên một tập hợp các nhóm cụ thể khái quát tốt cho các nhóm chưa thấy. Để đo lường điều này, chúng tôi cần đảm bảo rằng tất cả các mẫu trong nếp gấp xác thực đến từ các nhóm hoàn toàn không được thể hiện trong nếp gấp đào tạo được ghép nối.

Các bộ chia xác thực chéo sau đây có thể được sử dụng để làm điều đó. Định danh nhóm cho các mẫu được chỉ định thông qua tham số

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
3.

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
7

Mỗi đối tượng nằm trong một nếp gấp thử nghiệm khác nhau, và cùng một đối tượng không bao giờ trong cả thử nghiệm và đào tạo. Lưu ý rằng các nếp gấp không có cùng kích thước do sự mất cân bằng trong dữ liệu. Nếu tỷ lệ lớp phải được cân bằng trên các nếp gấp,

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
6 là một lựa chọn tốt hơn.

Dưới đây là hình dung của hành vi xác thực chéo.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

Tương tự như

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1, các bộ thử nghiệm từ
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
4 sẽ tạo thành một phân vùng hoàn chỉnh của tất cả các dữ liệu. Không giống như
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1,
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
4 hoàn toàn không được chọn ngẫu nhiên, trong khi
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 được chọn ngẫu nhiên khi
>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
2.

3.1.2.3.2. Stratifiedgroupkfold¶StratifiedGroupKFold¶

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
6 là một sơ đồ xác thực chéo kết hợp cả
>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
2 và
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
4. Ý tưởng là cố gắng bảo tồn phân phối các lớp trong mỗi lần phân chia trong khi giữ cho mỗi nhóm trong một phân chia. Điều đó có thể hữu ích khi bạn có một bộ dữ liệu không cân bằng để chỉ sử dụng
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
4 có thể tạo ra các phân tách sai lệch.

Example:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
8

Ghi chú thực hiện:

  • Với việc triển khai đầy đủ hiện tại là không thể trong hầu hết các kịch bản. Khi shuffle = true, điều sau đây xảy ra:

    1. Tất cả các nhóm được xáo trộn.

    2. Các nhóm được sắp xếp theo độ lệch chuẩn của các lớp bằng cách sử dụng sắp xếp ổn định.

    3. Các nhóm được sắp xếp được lặp lại và được gán cho các nếp gấp.

    Điều đó có nghĩa là chỉ các nhóm có cùng độ lệch chuẩn của phân phối lớp sẽ bị xáo trộn, điều này có thể hữu ích khi mỗi nhóm chỉ có một lớp.

  • Thuật toán tham lam chỉ định từng nhóm cho một trong các bộ kiểm tra N_Splits, chọn bộ kiểm tra để giảm thiểu phương sai trong phân phối lớp trên các bộ kiểm tra. Tiền chuyển nhượng nhóm từ các nhóm có phương sai cao nhất đến thấp nhất về tần số lớp, tức là các nhóm lớn đạt đỉnh trên một hoặc một vài lớp được chỉ định trước.

  • Sự phân chia này là tối ưu theo nghĩa là nó có thể tạo ra sự phân chia mất cân bằng ngay cả khi có thể phân tầng hoàn hảo. Nếu bạn có phân phối các lớp tương đối gần trong mỗi nhóm, sử dụng

    >>> from sklearn.model_selection import cross_validate
    >>> from sklearn.metrics import recall_score
    >>> scoring = ['precision_macro', 'recall_macro']
    >>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
    >>> scores = cross_validate(clf, X, y, scoring=scoring)
    >>> sorted(scores.keys())
    ['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
    >>> scores['test_recall_macro']
    array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
    
    4 là tốt hơn.

Dưới đây là hình dung của hành vi xác thực chéo cho các nhóm không đồng đều:

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

3.1.2.3.3. Để một nhóm ra ngoàiLeave One Group Out¶

>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
8 là một sơ đồ xác thực chéo, giữ các mẫu theo một mảng của bên thứ ba được cung cấp của các nhóm số nguyên. Thông tin nhóm này có thể được sử dụng để mã hóa các nếp gấp xác thực chéo được xác định trước cụ thể của miền.

Do đó, mỗi bộ đào tạo được cấu thành bởi tất cả các mẫu ngoại trừ các mẫu liên quan đến một nhóm cụ thể. Điều này về cơ bản giống như

>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
9 với
>>> scores = cross_validate(clf, X, y,
...                         scoring='precision_macro', cv=5,
...                         return_estimator=True)
>>> sorted(scores.keys())
['estimator', 'fit_time', 'score_time', 'test_score']
0.

Ví dụ, trong các trường hợp của nhiều thí nghiệm,

>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
8 có thể được sử dụng để tạo xác thực chéo dựa trên các thí nghiệm khác nhau: chúng tôi tạo ra một tập huấn luyện bằng cách sử dụng các mẫu của tất cả các thí nghiệm ngoại trừ một thí nghiệm:

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
9

Một ứng dụng phổ biến khác là sử dụng thông tin thời gian: Ví dụ, các nhóm có thể là năm thu thập các mẫu và do đó cho phép xác thực chéo chống lại các phân tách dựa trên thời gian.

3.1.2.3.4. Bỏ các nhóm p ra ngoàiLeave P Groups Out¶

>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
9 tương tự như
>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
8, nhưng loại bỏ các mẫu liên quan đến các nhóm \ (p \) cho mỗi bộ đào tạo/kiểm tra. Tất cả các kết hợp có thể có của các nhóm \ (p \) bị bỏ lại, có nghĩa là các bộ kiểm tra sẽ trùng lặp cho \ (p> 1 \).\(P\) groups for each training/test set. All possible combinations of \(P\) groups are left out, meaning test sets will overlap for \(P>1\).

Ví dụ về Rời khỏi-2 nhóm:

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
0

3.1.2.3.5. Nhóm xáo trộn chia táchGroup Shuffle Split¶

Trình lặp

>>> scores = cross_validate(clf, X, y,
...                         scoring='precision_macro', cv=5,
...                         return_estimator=True)
>>> sorted(scores.keys())
['estimator', 'fit_time', 'score_time', 'test_score']
4 hoạt động như một sự kết hợp của
>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
1 và
>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
9, và tạo ra một chuỗi các phân vùng ngẫu nhiên trong đó một tập hợp con của các nhóm được giữ cho mỗi lần phân chia. Mỗi lần phân chia tàu/thử nghiệm được thực hiện độc lập có nghĩa là không có mối quan hệ nào được đảm bảo giữa các bộ thử nghiệm liên tiếp.

Đây là một ví dụ sử dụng:

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
1

Dưới đây là hình dung của hành vi xác thực chéo.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

Lớp này rất hữu ích khi hành vi của

>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
9 là mong muốn, nhưng số lượng nhóm đủ lớn để tạo ra tất cả các phân vùng có thể với các nhóm \ (p \) bị giữ lại sẽ rất tốn kém. Trong một kịch bản như vậy,
>>> scores = cross_validate(clf, X, y,
...                         scoring='precision_macro', cv=5,
...                         return_estimator=True)
>>> sorted(scores.keys())
['estimator', 'fit_time', 'score_time', 'test_score']
4 cung cấp một mẫu ngẫu nhiên (với sự thay thế) của các phân tách tàu / thử nghiệm được tạo bởi
>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
9.\(P\) groups withheld would be prohibitively expensive. In such a scenario,
>>> scores = cross_validate(clf, X, y,
...                         scoring='precision_macro', cv=5,
...                         return_estimator=True)
>>> sorted(scores.keys())
['estimator', 'fit_time', 'score_time', 'test_score']
4 provides a random sample (with replacement) of the train / test splits generated by
>>> from sklearn.metrics import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
...            'rec_macro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, X, y, scoring=scoring,
...                         cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro',
 'train_prec_macro', 'train_rec_macro']
>>> scores['train_rec_macro']
array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
9.

3.1.2.4. Đã xác định trước các bộ chia / xác thực bộ xác thựcPredefined Fold-Splits / Validation-Sets¶

Đối với một số bộ dữ liệu, việc phân chia dữ liệu được xác định trước thành nếp gấp đào tạo và xác thực hoặc thành một số nếp gấp xác thực chéo đã tồn tại. Sử dụng

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
00 có thể sử dụng các nếp gấp này, ví dụ: Khi tìm kiếm hyperparameter.

Ví dụ: khi sử dụng bộ xác thực, đặt

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
01 thành 0 cho tất cả các mẫu là một phần của tập xác thực và -1 cho tất cả các mẫu khác.

3.1.2.5. Sử dụng các trình lặp xác nhận chéo để phân chia tàu và thử nghiệmUsing cross-validation iterators to split train and test¶

Các chức năng xác thực chéo của nhóm trên cũng có thể hữu ích để chia một bộ dữ liệu thành các tập hợp con đào tạo và thử nghiệm. Lưu ý rằng hàm tiện lợi

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
5 là một trình bao bọc xung quanh
>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
1 và do đó chỉ cho phép phân tách phân tầng (sử dụng nhãn lớp) và không thể giải thích cho các nhóm.

Để thực hiện phân tách tàu và thử nghiệm, hãy sử dụng các chỉ số cho các tập hợp tàu và các tập hợp thử nghiệm được tạo ra bởi đầu ra của trình tạo bằng phương pháp

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
04 của bộ chia xác thực chéo. Ví dụ:

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
2

3.1.2.6. Xác thực chéo dữ liệu chuỗi thời gianCross validation of time series data¶

Dữ liệu chuỗi thời gian được đặc trưng bởi mối tương quan giữa các quan sát gần thời gian (tự tương quan). Tuy nhiên, các kỹ thuật xác nhận chéo cổ điển như

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1 và
>>> def custom_cv_2folds(X):
...     n = X.shape[0]
...     i = 1
...     while i <= 2:
...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
...         yield idx, idx
...         i += 1
...
>>> custom_cv = custom_cv_2folds(X)
>>> cross_val_score(clf, X, y, cv=custom_cv)
array([1.        , 0.973...])
1 giả định các mẫu độc lập và phân phối giống hệt nhau, và sẽ dẫn đến mối tương quan không hợp lý giữa các trường hợp đào tạo và thử nghiệm (mang lại ước tính kém về lỗi tổng quát hóa) về dữ liệu chuỗi thời gian. Do đó, điều rất quan trọng là đánh giá mô hình của chúng tôi về dữ liệu chuỗi thời gian về các quan sát tương lai của người Hồi giáo ít giống như các quan sát được sử dụng để đào tạo mô hình. Để đạt được điều này, một giải pháp được cung cấp bởi
>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
07.

3.1.2.6.1. Chuỗi thời gian chia táchTime Series Split¶

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
07 là một biến thể của K-Fold trả về các nếp gấp đầu tiên \ (k \) dưới dạng bộ tàu và nếp gấp \ ((k+1) \) dưới dạng thử nghiệm. Lưu ý rằng không giống như các phương pháp xác thực chéo tiêu chuẩn, các bộ đào tạo liên tiếp là các siêu của những người đến trước chúng. Ngoài ra, nó thêm tất cả dữ liệu thặng dư vào phân vùng đào tạo đầu tiên, luôn được sử dụng để đào tạo mô hình.\(k\) folds as train set and the \((k+1)\) th fold as test set. Note that unlike standard cross-validation methods, successive training sets are supersets of those that come before them. Also, it adds all surplus data to the first training partition, which is always used to train the model.

Lớp này có thể được sử dụng để xử lý chéo các mẫu dữ liệu chuỗi thời gian được quan sát thấy trong các khoảng thời gian cố định.

Ví dụ về xác thực chéo chuỗi thời gian 3-split trên bộ dữ liệu với 6 mẫu:

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
3

Dưới đây là hình dung của hành vi xác thực chéo.

Hướng dẫn what is cross validation in python? - xác thực chéo trong python là gì?

3.1.3. Một ghi chú về xáo trộnA note on shuffling¶

Nếu thứ tự dữ liệu không tùy ý (ví dụ: các mẫu có cùng nhãn lớp là tiếp giáp), thì việc xáo trộn nó trước tiên có thể rất cần thiết để có được kết quả xác nhận chéo có ý nghĩa. Tuy nhiên, điều ngược lại có thể đúng nếu các mẫu không được phân phối độc lập và giống hệt nhau. Ví dụ: nếu các mẫu tương ứng với các bài báo và được đặt hàng theo thời gian xuất bản của chúng, thì việc xáo trộn dữ liệu có thể sẽ dẫn đến một mô hình không có gì và điểm xác nhận tăng cao: nó sẽ được kiểm tra trên các mẫu tương tự trong thời gian) để đào tạo các mẫu.

Một số trình lặp xác thực chéo, chẳng hạn như

>>> print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
0.98 accuracy with a standard deviation of 0.02
1, có tùy chọn sẵn có để xáo trộn các chỉ số dữ liệu trước khi chia chúng. Lưu ý rằng:

  • Điều này tiêu thụ ít bộ nhớ hơn là xáo trộn dữ liệu trực tiếp.

  • Theo mặc định, không có sự xáo trộn nào xảy ra, bao gồm cả xác thực chéo (phân tầng) K được thực hiện bằng cách chỉ định

    >>> X_train, X_test, y_train, y_test = train_test_split(
    ...     X, y, test_size=0.4, random_state=0)
    
    >>> X_train.shape, y_train.shape
    ((90, 4), (90,))
    >>> X_test.shape, y_test.shape
    ((60, 4), (60,))
    
    >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.96...
    
    10 đến
    >>> from sklearn.model_selection import cross_val_score
    >>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
    >>> scores = cross_val_score(clf, X, y, cv=5)
    >>> scores
    array([0.96..., 1. , 0.96..., 0.96..., 1. ])
    
    7, tìm kiếm lưới, v.v. Hãy nhớ rằng
    >>> from sklearn.model_selection import cross_val_score
    >>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
    >>> scores = cross_val_score(clf, X, y, cv=5)
    >>> scores
    array([0.96..., 1. , 0.96..., 0.96..., 1. ])
    
    5 vẫn trả về một sự phân chia ngẫu nhiên.

  • Tham số

    >>> def custom_cv_2folds(X):
    ...     n = X.shape[0]
    ...     i = 1
    ...     while i <= 2:
    ...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
    ...         yield idx, idx
    ...         i += 1
    ...
    >>> custom_cv = custom_cv_2folds(X)
    >>> cross_val_score(clf, X, y, cv=custom_cv)
    array([1.        , 0.973...])
    
    2 mặc định là
    >>> X_train, X_test, y_train, y_test = train_test_split(
    ...     X, y, test_size=0.4, random_state=0)
    
    >>> X_train.shape, y_train.shape
    ((90, 4), (90,))
    >>> X_test.shape, y_test.shape
    ((60, 4), (60,))
    
    >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.96...
    
    14, có nghĩa là sự xáo trộn sẽ khác nhau mỗi khi
    >>> X_train, X_test, y_train, y_test = train_test_split(
    ...     X, y, test_size=0.4, random_state=0)
    
    >>> X_train.shape, y_train.shape
    ((90, 4), (90,))
    >>> X_test.shape, y_test.shape
    ((60, 4), (60,))
    
    >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.96...
    
    15 được lặp lại. Tuy nhiên,
    >>> X_train, X_test, y_train, y_test = train_test_split(
    ...     X, y, test_size=0.4, random_state=0)
    
    >>> X_train.shape, y_train.shape
    ((90, 4), (90,))
    >>> X_test.shape, y_test.shape
    ((60, 4), (60,))
    
    >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.96...
    
    16 sẽ sử dụng cùng một sự xáo trộn cho mỗi bộ tham số được xác thực bằng một cuộc gọi duy nhất theo phương thức
    >>> X_train, X_test, y_train, y_test = train_test_split(
    ...     X, y, test_size=0.4, random_state=0)
    
    >>> X_train.shape, y_train.shape
    ((90, 4), (90,))
    >>> X_test.shape, y_test.shape
    ((60, 4), (60,))
    
    >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.96...
    
    17 của nó.

  • Để có được kết quả giống hệt nhau cho mỗi lần phân chia, đặt

    >>> def custom_cv_2folds(X):
    ...     n = X.shape[0]
    ...     i = 1
    ...     while i <= 2:
    ...         idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int)
    ...         yield idx, idx
    ...         i += 1
    ...
    >>> custom_cv = custom_cv_2folds(X)
    >>> cross_val_score(clf, X, y, cv=custom_cv)
    array([1.        , 0.973...])
    
    2 thành một số nguyên.

Để biết thêm chi tiết về cách kiểm soát tính ngẫu nhiên của các bộ chia CV và tránh những cạm bẫy thông thường, xem kiểm soát tính ngẫu nhiên.Controlling randomness.

3.1.4. Xác thực chéo và lựa chọn mô hìnhCross validation and model selection¶

Trình lặp xác thực chéo cũng có thể được sử dụng để thực hiện trực tiếp lựa chọn mô hình bằng cách sử dụng tìm kiếm lưới cho các siêu âm tối ưu của mô hình. Đây là chủ đề của phần tiếp theo: điều chỉnh các tham số siêu của một công cụ ước tính.Tuning the hyper-parameters of an estimator.

3.1.5. Điểm kiểm tra hoán vịPermutation test score¶

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
19 cung cấp một cách khác để đánh giá hiệu suất của các trình phân loại. Nó cung cấp một giá trị p dựa trên hoán vị, thể hiện khả năng hiệu suất quan sát của bộ phân loại sẽ được có khả năng như thế nào. Giả thuyết khống trong thử nghiệm này là trình phân loại không tận dụng bất kỳ sự phụ thuộc thống kê nào giữa các tính năng và nhãn để đưa ra dự đoán chính xác về dữ liệu còn lại.
>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
19 tạo ra phân phối null bằng cách tính toán các hoán vị khác nhau của dữ liệu. Trong mỗi hoán vị, các nhãn được xáo trộn ngẫu nhiên, do đó loại bỏ bất kỳ sự phụ thuộc nào giữa các tính năng và nhãn. Đầu ra giá trị p là phần của các hoán vị mà điểm xác thực chéo trung bình thu được từ mô hình tốt hơn so với điểm xác thực chéo thu được từ mô hình bằng cách sử dụng dữ liệu gốc. Đối với kết quả đáng tin cậy
>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
21 thường lớn hơn 100 và
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1, random_state=42)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores
array([0.96..., 1. , 0.96..., 0.96..., 1. ])
9 trong khoảng 3-10 lần.

Giá trị p thấp cung cấp bằng chứng cho thấy bộ dữ liệu chứa sự phụ thuộc thực sự giữa các tính năng và nhãn và trình phân loại có thể sử dụng điều này để có được kết quả tốt. Giá trị p cao có thể là do thiếu sự phụ thuộc giữa các tính năng và nhãn (không có sự khác biệt về giá trị tính năng giữa các lớp) hoặc do trình phân loại không thể sử dụng sự phụ thuộc trong dữ liệu. Trong trường hợp sau, sử dụng một trình phân loại phù hợp hơn có thể sử dụng cấu trúc trong dữ liệu, sẽ dẫn đến giá trị p thấp hơn.

Xác định chéo cung cấp thông tin về mức độ phân loại tổng quát hóa, cụ thể là phạm vi các lỗi dự kiến ​​của trình phân loại. Tuy nhiên, một trình phân loại được đào tạo trên một bộ dữ liệu chiều cao không có cấu trúc vẫn có thể hoạt động tốt hơn dự kiến ​​về xác thực chéo, chỉ tình cờ. Điều này thường có thể xảy ra với các bộ dữ liệu nhỏ với ít hơn vài trăm mẫu.

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
19 cung cấp thông tin về việc phân loại có tìm thấy cấu trúc lớp thực và có thể giúp đánh giá hiệu suất của trình phân loại hay không.

Điều quan trọng cần lưu ý là thử nghiệm này đã được chứng minh là tạo ra các giá trị p thấp ngay cả khi chỉ có cấu trúc yếu trong dữ liệu vì trong các bộ dữ liệu được hoán vị tương ứng, hoàn toàn không có cấu trúc. Do đó, thử nghiệm này chỉ có thể hiển thị khi mô hình đáng tin cậy vượt trội so với đoán ngẫu nhiên.

Cuối cùng,

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
19 được tính toán bằng cách sử dụng vũ lực và các mô hình phù hợp bên trong
>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
26. Do đó, chỉ có thể điều khiển được với các bộ dữ liệu nhỏ để phù hợp với mô hình riêng lẻ là rất nhanh.

Mục đích của Cross là gì

Xác thực chéo là một phương pháp thống kê được sử dụng để ước tính hiệu suất của các mô hình học máy.Đây là một phương pháp để đánh giá kết quả phân tích thống kê sẽ khái quát hóa thành một tập dữ liệu độc lập như thế nào.to estimate the performance of machine learning models. It is a method for assessing how the results of a statistical analysis will generalize to an independent data set.

Cross là gì

Xác định chéo là một kỹ thuật để đánh giá các mô hình ML bằng cách đào tạo một số mô hình ML trên các tập hợp con của dữ liệu đầu vào có sẵn và đánh giá chúng trên tập hợp con bổ sung của dữ liệu.Sử dụng xác thực chéo để phát hiện quá mức, tức là không khái quát hóa một mẫu.to detect overfitting, ie, failing to generalize a pattern.

Cross là gì

Ví dụ: cài đặt K = 2 dẫn đến xác thực chéo 2 lần.Trong xác thực chéo 2 lần, chúng tôi ngẫu nhiên xáo trộn bộ dữ liệu thành hai bộ D0 và D1, do đó cả hai bộ đều có kích thước bằng nhau (điều này thường được triển khai bằng cách xáo trộn mảng dữ liệu và sau đó chia thành hai).setting k = 2 results in 2-fold cross-validation. In 2-fold cross-validation, we randomly shuffle the dataset into two sets d0 and d1, so that both sets are equal size (this is usually implemented by shuffling the data array and then splitting it in two).