Làm cách nào để phân chia tập dữ liệu để xác thực chéo, đường cong học tập và đánh giá cuối cùng?


70

Một chiến lược thích hợp để chia dữ liệu là gì?

Tôi yêu cầu phản hồi về phương pháp sau đây (không phải trên các thông số cá nhân như test_sizehay n_iter, nhưng nếu tôi sử dụng X, y, X_train, y_train, X_test, và y_testmột cách thích hợp và nếu chuỗi có ý nghĩa):

(mở rộng ví dụ này từ tài liệu tìm hiểu scikit)

1. Tải tập dữ liệu

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Chia thành tập huấn luyện và kiểm tra (ví dụ: 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Chọn công cụ ước tính

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Chọn trình lặp xác thực chéo

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Điều chỉnh siêu âm

áp dụng trình lặp xác nhận chéo trên tập huấn luyện

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Thuật toán gỡ lỗi với đường cong học tập

X_trainđược chia ngẫu nhiên thành một khóa đào tạo và một bài kiểm tra 10 lần ( n_iter=10). Mỗi điểm trên đường cong điểm số đào tạo là trung bình 10 điểm trong đó mô hình được đào tạo và đánh giá trên các ví dụ đào tạo i đầu tiên . Mỗi điểm trên đường cong điểm xác nhận chéo là trung bình 10 điểm trong đó mô hình được đào tạo trên các ví dụ đào tạo i đầu tiên và được đánh giá trên tất cả các ví dụ về tập kiểm tra.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Đường cong học tập

plot_learning_curve () có thể được tìm thấy trong phiên bản dev hiện tại của scikit-learn (0.15-git).

7. Đánh giá cuối cùng về bộ thử nghiệm

classifier.score(X_test, y_test)

7a. Kiểm tra sự phù hợp quá mức trong lựa chọn mô hình với xác thực chéo lồng nhau (sử dụng toàn bộ tập dữ liệu)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Câu hỏi bổ sung: Có ý nghĩa gì khi thay thế bước 7 bằng xác nhận chéo lồng nhau? Hoặc cv lồng nhau nên được xem là bổ sung cho bước 7

(mã dường như hoạt động với xác thực chéo k-gấp trong scikit-learn, nhưng không phải với shuffle & split. Vì vậy, cvcần phải thay đổi ở trên để làm cho mã hoạt động)

8. Đào tạo mô hình cuối cùng trên toàn bộ dữ liệu

classifier.fit(X, y)

EDIT: Bây giờ tôi đồng ý với cbeleites rằng bước 7a không có ý nghĩa nhiều trong chuỗi này. Vì vậy, tôi sẽ không chấp nhận điều đó.


Bạn đang sử dụng quy tắc chấm điểm chính xác nào? Nếu đó là độ chính xác phân loại, quy tắc chấm điểm không phù hợp như vậy sẽ hoàn tác phần lớn công việc bạn đã thực hiện.
Frank Harrell

Tôi đã sử dụng mặc định đó thực sự là phân loại chính xác. Tôi biết rằng, ví dụ, F1 sẽ phù hợp hơn. Nhưng ở đây tôi chỉ quan tâm nếu các phần tách được sử dụng OK.
tobip

3
Tôi gần như chắc chắn rằng F1 là một tên mới cho một khái niệm cũ. Tôi nghĩ rằng nó là phản tác dụng để phát minh ra tên mới cho những thứ cũ. Quan trọng hơn, đó là một quy tắc chấm điểm không phù hợp sẽ dẫn đến việc lựa chọn các tính năng sai cũng như thêm một lượng nhiễu lớn vào toàn bộ quá trình.
Frank Harrell

3
... Trong mọi trường hợp, F1 chia sẻ các vấn đề về độ chính xác @FrankHarrell ám chỉ: những điều này xuất phát từ việc đếm các phân số của các trường hợp kiểm tra phân loại cứng. Để có được một trong những quy tắc chấm điểm thích hợp của Frank, bạn cần chuyển sang đầu ra xác suất của SVM, sau đó sử dụng điểm của Brier (có nghĩa là lỗi bình phương) thay vì độ chính xác. Tôi đoán bạn cũng có thể lấy được phiên bản F1 của MSE. Các biện pháp như vậy thực sự nên tốt hơn cho bước điều chỉnh. Để truyền đạt hiệu suất cuối cùng, bạn cũng có thể cần các cách điển hình (ví dụ: độ chính xác, F1) để thể hiện hiệu suất cho cộng đồng của bạn.
cbeleites

1
@ ta.ft: cách tiếp cận có sai hay không phụ thuộc vào những gì bạn cho là sai: tìm kiếm theo tỷ lệ có nguy cơ sai lệch nghiêm trọng trừ khi bạn có số lượng lớn các trường hợp độc lập. Vì vậy, trong nhiều tình huống, tuyên bố rằng tìm kiếm lưới mang lại mô hình tối ưu là sai. Tuy nhiên, nếu bạn thực hiện xác nhận hợp lệ lồng nhau, xác thực bên ngoài sẽ đưa ra thước đo trung thực về hiệu suất của mô hình "tối ưu" đã chọn. Vì vậy, điều đó không sai. Bạn không đảm bảo rằng tìm kiếm lưới có mô hình tối ưu. Đối với tài liệu, tôi sẽ cập nhật câu trả lời của tôi.
cbeleites

Câu trả lời:


41

Tôi không chắc bạn muốn làm gì trong bước 7a. Theo tôi hiểu ngay bây giờ, nó không có ý nghĩa với tôi.

Dưới đây là cách tôi hiểu mô tả của bạn: trong bước 7, bạn muốn so sánh hiệu suất giữ với kết quả xác thực chéo bao gồm các bước 4 - 6. (vì vậy, đó sẽ là một thiết lập lồng nhau).

Những điểm chính tại sao tôi không nghĩ so sánh này có nhiều ý nghĩa là:

  • So sánh này không thể phát hiện hai trong số các nguồn chính của kết quả xác thực quá mức mà tôi gặp trong thực tế:

    • rò rỉ dữ liệu (sự phụ thuộc) giữa dữ liệu huấn luyện và kiểm tra do cấu trúc dữ liệu phân cấp (còn gọi là cụm) và không được tính đến trong quá trình phân tách. Trong lĩnh vực của tôi, chúng tôi thường có nhiều (đôi khi hàng ngàn) số đọc (= hàng trong ma trận dữ liệu) của cùng một bệnh nhân hoặc sao chép sinh học của một thử nghiệm. Đây không phải là độc lập, vì vậy việc phân tách xác nhận cần phải được thực hiện ở cấp độ bệnh nhân. Tuy nhiên, rò rỉ dữ liệu như vậy xảy ra, bạn sẽ có cả hai trong phần tách cho tập hợp giữ ngoài và trong phần tách xác thực chéo. Nắm giữ sau đó sẽ được thiên vị lạc quan như xác nhận chéo.

    • Tiền xử lý dữ liệu được thực hiện trên toàn bộ ma trận dữ liệu, trong đó các phép tính không độc lập cho mỗi hàng nhưng nhiều / tất cả các hàng được sử dụng để tính toán các tham số cho quá trình tiền xử lý. Các ví dụ điển hình sẽ là ví dụ về phép chiếu PCA trước khi phân loại "thực tế".
      Một lần nữa, điều đó sẽ ảnh hưởng đến cả việc giữ lại của bạn và xác nhận chéo bên ngoài, vì vậy bạn không thể phát hiện ra nó.

    Đối với dữ liệu tôi làm việc cùng, cả hai lỗi có thể dễ dàng khiến tỷ lệ phân loại sai bị đánh giá thấp bởi một thứ tự cường độ!

  • Nếu bạn bị giới hạn ở loại tính hiệu suất của trường hợp kiểm thử này, so sánh mô hình cần số lượng cực lớn của trường hợp kiểm thử hoặc sự khác biệt lớn một cách lố bịch trong hiệu suất thực. So sánh 2 phân loại với dữ liệu đào tạo không giới hạn có thể là một khởi đầu tốt để đọc thêm.

Tuy nhiên, so sánh chất lượng mô hình, yêu cầu xác thực chéo bên trong cho mô hình "tối ưu" và xác thực chéo bên ngoài hoặc xác thực giữ ngoài có ý nghĩa: nếu sự khác biệt cao, có thể nghi ngờ liệu tối ưu hóa tìm kiếm lưới của bạn có hoạt động không (bạn có thể có phương sai bị bỏ qua do phương sai hiệu suất cao). Việc so sánh này dễ dàng hơn ở chỗ bạn có thể phát hiện ra rắc rối nếu bạn có ước tính bên trong tốt đến mức nực cười so với bên kia - nếu không, bạn không cần phải lo lắng nhiều về tối ưu hóa của mình. Nhưng trong mọi trường hợp, nếu phép đo hiệu suất (7) bên ngoài của bạn là trung thực và âm thanh, ít nhất bạn có một ước tính hữu ích về mô hình thu được, cho dù đó là tối ưu hay không.

IMHO đo đường cong học tập vẫn là một vấn đề khác. Có lẽ tôi nên giải quyết vấn đề đó một cách riêng biệt và tôi nghĩ bạn cần xác định rõ hơn những gì bạn cần về đường cong học tập (bạn có cần đường cong học tập cho một tập hợp dữ liệu của vấn đề, dữ liệu và phương pháp phân loại nhất định hoặc đường cong học tập đối với tập dữ liệu này của vấn đề đã cho, dữ liệu và phân loại mehtod) và một loạt các quyết định tiếp theo (ví dụ: làm thế nào để giải quyết sự phức tạp của mô hình như chức năng của cỡ mẫu đào tạo? Tối ưu hóa lại tất cả, sử dụng siêu âm cố định, quyết định Chức năng sửa lỗi siêu âm phụ thuộc vào kích thước tập huấn luyện?)

(Dữ liệu của tôi thường có rất ít trường hợp độc lập để có được phép đo đường cong học tập đủ chính xác để sử dụng nó trong thực tế - nhưng bạn có thể tốt hơn nếu 1200 hàng của bạn thực sự độc lập)


cập nhật: "sai" với ví dụ scikit-learn là gì?

Trước hết, không có gì sai với xác nhận chéo lồng nhau ở đây. Xác thực lồng nhau là vô cùng quan trọng đối với tối ưu hóa dựa trên dữ liệu và xác thực chéo là một cách tiếp cận rất mạnh mẽ (đặc biệt nếu lặp / lặp lại).

Sau đó, liệu có bất cứ điều gì sai hay không phụ thuộc vào quan điểm của bạn: miễn là bạn thực hiện xác nhận lồng nhau trung thực (giữ dữ liệu kiểm tra bên ngoài độc lập nghiêm ngặt), xác thực bên ngoài là thước đo phù hợp của hiệu suất của mô hình "tối ưu". Không có gì sai với điều đó.

Nhưng một số điều có thể và làm sai với tìm kiếm dạng lưới của các biện pháp hiệu suất loại tỷ lệ này để điều chỉnh siêu tham số của SVM. Về cơ bản, chúng có nghĩa là bạn có thể (có thể?) Không thể dựa vào tối ưu hóa. Tuy nhiên, miễn là phân chia bên ngoài của bạn được thực hiện đúng, ngay cả khi mô hình không phải là tốt nhất có thể, bạn có một ước tính trung thực về hiệu suất của mô hình bạn có.

Tôi sẽ cố gắng đưa ra những giải thích trực quan tại sao việc tối ưu hóa có thể gặp rắc rối:

  • p^np
    Var(p^)=p(1p)n

    Bạn cần số lượng lớn các trường hợp (ít nhất là so với số lượng các trường hợp tôi thường có) để đạt được độ chính xác cần thiết (cảm giác sai lệch / sai lệch) để ước tính thu hồi, độ chính xác (cảm giác hiệu suất học máy). Điều này tất nhiên cũng áp dụng cho các tỷ lệ bạn tính toán từ tỷ lệ như vậy. Có một cái nhìn vào khoảng tin cậy cho tỷ lệ nhị thức. Chúng lớn đến kinh ngạc! Thường lớn hơn sự cải thiện thực sự về hiệu suất so với lưới siêu tham số. Và theo thống kê, tìm kiếm lưới là một vấn đề so sánh lớn: bạn càng đánh giá nhiều điểm của lưới, nguy cơ tìm thấy một số kết hợp của siêu đường kính vô tình có vẻ rất tốt cho phân tách kiểm tra / thử nghiệm mà bạn đang đánh giá. Đây là những gì tôi có ý nghĩa với phương sai skinkle.

  • Theo trực giác, xem xét một sự thay đổi giả thuyết của một siêu tham số, từ từ làm cho mô hình xấu đi: một trường hợp thử nghiệm di chuyển đến ranh giới quyết định. Các biện pháp thực hiện tỷ lệ 'cứng' không phát hiện ra điều này cho đến khi trường hợp vượt qua biên giới và ở phía sai. Tuy nhiên, sau đó, họ ngay lập tức gán một lỗi đầy đủ cho một thay đổi nhỏ vô hạn trong siêu tham số.
    Để thực hiện tối ưu hóa số, bạn cần có biện pháp thực hiện tốt. Điều đó có nghĩa là: không phải phần tăng vọt (không liên tục khác biệt) của thước đo hiệu suất loại tỷ lệ cũng như thực tế là khác với bước nhảy đó, thực sự xảy ra thay đổi không phù hợp để tối ưu hóa.
    Quy tắc chấm điểm thích hợp được xác định theo cách đặc biệt phù hợp để tối ưu hóa. Chúng có mức tối đa toàn cầu khi xác suất dự đoán khớp với xác suất thực cho từng trường hợp thuộc về nhóm được đề cập.

  • Đối với các SVM, bạn có một vấn đề khác là không chỉ các biện pháp hiệu suất mà cả mô hình cũng phản ứng theo kiểu tăng vọt này: những thay đổi nhỏ của siêu tham số sẽ không thay đổi bất cứ điều gì. Mô hình chỉ thay đổi khi các siêu đường kính thay đổi đủ để khiến một số trường hợp dừng lại là vectơ hỗ trợ hoặc trở thành vectơ hỗ trợ. Một lần nữa, các mô hình như vậy là khó để tối ưu hóa.

Văn chương:


Cập nhật II: Phương sai

những gì bạn có thể đủ khả năng về mặt so sánh mô hình rõ ràng phụ thuộc vào số lượng các trường hợp độc lập. Chúng ta hãy thực hiện một số mô phỏng nhanh và bẩn về nguy cơ trượt phương sai ở đây:

scikit.learnnói rằng họ có 1797 trong digitsdữ liệu.

  • 10×10
  • giả sử rằng cả hai tham số (phạm vi) hoàn toàn không ảnh hưởng đến các mô hình,
  • tức là, tất cả các mô hình có cùng hiệu suất thực sự là 97% (hiệu suất điển hình cho tập digitsdữ liệu).

  • 104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")

Đây là bản phân phối cho hiệu suất quan sát tốt nhất:

mô phỏng phương sai

Đường màu đỏ đánh dấu hiệu suất thực sự của tất cả các mô hình giả thuyết của chúng tôi. Trung bình, chúng tôi chỉ quan sát 2/3 tỷ lệ lỗi thực sự đối với 100 mô hình được so sánh tốt nhất (đối với mô phỏng chúng tôi biết rằng tất cả chúng đều thực hiện như nhau với dự đoán đúng 97%).

Mô phỏng này rõ ràng là rất đơn giản:

  • Ngoài phương sai kích thước mẫu thử nghiệm, ít nhất có phương sai do mất ổn định mô hình, vì vậy chúng tôi đánh giá thấp phương sai ở đây
  • Các tham số điều chỉnh ảnh hưởng đến độ phức tạp của mô hình thường sẽ bao gồm các bộ tham số trong đó các mô hình không ổn định và do đó có phương sai cao.
  • Đối với các chữ số UCI từ ví dụ, cơ sở dữ liệu ban đầu có ca. 11000 chữ số được viết bởi 44 người. Điều gì xảy ra nếu dữ liệu được phân cụm theo người đã viết? (Tức là dễ dàng nhận ra số 8 được viết bởi ai đó nếu bạn biết người đó viết như thế nào, giả sử là 3?) Kích thước mẫu hiệu quả sau đó có thể thấp đến 44.
  • Điều chỉnh siêu đường kính mô hình có thể dẫn đến mối tương quan giữa các mô hình (trên thực tế, điều đó sẽ được coi là hành xử tốt từ góc độ tối ưu hóa số). Thật khó để dự đoán ảnh hưởng của điều đó (và tôi nghi ngờ điều này là không thể nếu không tính đến loại phân loại thực tế).

Tuy nhiên, nói chung, cả hai trường hợp thử nghiệm độc lập thấp và số lượng mô hình so sánh cao đều làm tăng độ lệch. Ngoài ra, bài báo Cawley và Talbot đưa ra hành vi quan sát theo kinh nghiệm.


@cbleites: Nếu tìm kiếm dạng lưới có thể không phải là một phương pháp thích hợp để tìm mô hình tối ưu, tôi nên chọn phương pháp nào sau đó?
tobip

1
@ ta.ft: hai cách tiếp cận là a) kết hợp càng nhiều kiến ​​thức bên ngoài về ứng dụng và dữ liệu của bạn vào mô hình để giảm đáng kể số lượng mô hình cần so sánh (= quyết định siêu âm thay vì tối ưu hóa). Có thể nói chung là tốt hơn để thay đổi thành một bộ phân loại có siêu đường kính có ý nghĩa nội tại, tức là nơi bạn có thể biết từ ứng dụng và loại dữ liệu nên siêu tham số nên (xấp xỉ). b) so sánh một vài mô hình còn lại theo quy tắc chấm điểm thích hợp. Ví dụ: điểm Brier có thuộc tính phương sai tốt hơn nhiều đối với nhiều phân loại.
cbeleites

1
Bạn cũng có thể từ chối tối ưu hóa tất cả (thông qua các quyết định (a)). Nếu bạn nhận được một trình phân loại đủ tốt và có thể lập luận rằng bạn không có cơ hội chứng minh sự vượt trội của một trình phân loại khác với kích thước mẫu có sẵn (ví dụ: thực hiện một số tính toán McNemar demo, hãy tìm kích thước mẫu cần thiết để so sánh tỷ lệ cho phân loại tốt hơn giả thuyết - có một cơ hội tốt rằng những thứ này sẽ lớn đến mức nực cười ngay cả đối với những cải tiến giả thuyết lớn một cách lố bịch), bạn có thể lập luận rằng tối ưu hóa không có ý nghĩa gì và chỉ tạo ra nguy cơ thừa.
cbeleites

Tôi không đồng ý với bạn về "phương sai lướt qua". Nếu bạn có rất nhiều điểm trong lưới để tối ưu hóa siêu tham số, một điểm có thể gặp may mắn trong một lần CV; nhưng nếu bạn có, giả sử CV gấp 10 lần, rất có thể một bộ tham số sẽ vô tình gặp may mắn trên tất cả 10 lần CV.
RNA

1
@RNA: Xác suất "may mắn" trong tất cả các nếp gấp được kết nối trực tiếp với tổng số trường hợp (trong tất cả 10 lần) và thường chỉ xem xét trung bình trên tất cả các nếp gấp đó. Tôi đã cập nhật câu trả lời với một mô phỏng về việc chọn giả thuyết trong số 100 mô hình tốt nhất (giả sử, 2 siêu âm với 10 bước mỗi mô hình), vốn đã được liên kết với độ lệch đáng kể cho kịch bản ví dụ (tỷ lệ lỗi quá thấp 1/3) . Nhiều người ở đây hiếm khi có vài nghìn trường hợp độc lập trong tay - ví dụ tôi hiếm khi có 44 cá nhân viết chữ số cho bộ dữ liệu chữ số UCI đầy đủ.
cbeleites
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.