(Tôi chắc chắn rằng tôi đã viết hầu hết những điều này trong một số câu trả lời - nhưng không thể tìm thấy nó ngay bây giờ. Nếu có ai tình cờ thấy câu trả lời đó, vui lòng liên kết nó). Tôi thấy 2 cách tiếp cận hơi khác nhau ở đây, mà tôi nghĩ là cả hai đều hợp lý.
Nhưng trước tiên một số thuật ngữ:
- Đến từ một lĩnh vực ứng dụng, một mô hình (được trang bị / đào tạo) đối với tôi là một mô hình sẵn sàng để sử dụng. Tức là mô hình chứa tất cả thông tin cần thiết để tạo dự đoán cho dữ liệu mới. Do đó, mô hình cũng chứa các siêu đường kính . Như bạn sẽ thấy, quan điểm này có liên quan chặt chẽ với cách tiếp cận 2 dưới đây.
- OTOH, thuật toán đào tạo theo kinh nghiệm của tôi không được xác định rõ theo nghĩa sau: để có được mô hình (được trang bị), không chỉ - hãy gọi nó là "khớp chính" - của các tham số mô hình "bình thường" cần phải được thực hiện, nhưng cũng cần phải cố định các siêu đường kính. Từ quan điểm ứng dụng của tôi, thực sự không có nhiều khác biệt giữa các tham số và siêu liên kết: cả hai đều là một phần của mô hình và cần được ước tính / quyết định trong quá trình đào tạo.
Tôi đoán sự khác biệt giữa chúng có liên quan đến sự khác biệt giữa ai đó đang phát triển thuật toán đào tạo mới, người thường mô tả một lớp thuật toán đào tạo cùng với một số tham số chỉ đạo ( siêu âm) rất khó / không thể sửa chữa (hoặc ít nhất là khắc phục cách chúng được quyết định / ước tính) mà không có kiến thức về ứng dụng / tên miền.
Cách tiếp cận 1: yêu cầu kết quả tối ưu hóa ổn định
Với phương pháp này, "đào tạo mô hình" là sự phù hợp của các tham số mô hình "bình thường" và siêu âm được đưa ra. Ví dụ bên trong, ví dụ xác thực chéo sẽ đảm nhận việc tối ưu hóa siêu tham số.
Bước / giả định quan trọng ở đây để giải quyết tình trạng tiến thoái lưỡng nan của tập hợp siêu tham số nên được chọn là yêu cầu tối ưu hóa để ổn định . Xác thực chéo cho các mục đích xác nhận giả định rằng tất cả các mô hình thay thế đều tương tự như mô hình cuối cùng (có được bằng thuật toán đào tạo tương tự áp dụng cho toàn bộ tập dữ liệu) để cho phép đối xử với chúng như nhau (giữa chúng cũng như với mô hình cuối cùng). Nếu giả định này bị phá vỡ và
các mô hình thay thế vẫn tương đương (hoặc tương đương) với nhau nhưng không phải là mô hình cuối cùng, chúng ta đang nói về xu hướng bi quan nổi tiếng của xác nhận chéo.
Nếu mô hình thay thế cũng không bằng / tương đương với nhau, chúng ta có vấn đề với sự không ổn định .
Đối với các kết quả tối ưu hóa của vòng lặp bên trong, điều này có nghĩa là nếu tối ưu hóa ổn định, không có xung đột trong việc chọn siêu đường kính . Và nếu sự thay đổi đáng kể được quan sát qua các kết quả xác nhận chéo bên trong, thì việc tối ưu hóa không ổn định . Các tình huống đào tạo không ổn định có vấn đề tồi tệ hơn nhiều so với quyết định lựa chọn tập hợp siêu tham số nào và tôi thực sự khuyên bạn nên lùi lại trong trường hợp đó và bắt đầu quá trình lập mô hình.
Tuy nhiên, có một ngoại lệ: có thể có một số cực tiểu cục bộ trong việc tối ưu hóa mang lại hiệu suất tương đương cho các mục đích thực tế. Yêu cầu cũng là sự lựa chọn trong số chúng để ổn định có thể là một yêu cầu mạnh mẽ không cần thiết - nhưng tôi không biết làm thế nào để thoát khỏi tình trạng khó xử này.
Lưu ý rằng nếu không phải tất cả các mô hình đều mang lại bộ tham số chiến thắng giống nhau, bạn không nên sử dụng ước tính vòng lặp bên ngoài như lỗi tổng quát hóa ở đây:
- Nếu bạn yêu cầu lỗi tổng quát hóa cho các tham số , tất cả các mô hình thay thế nhập vào xác thực sẽ thực sự sử dụng chính xác các tham số này.
(Hãy tưởng tượng ai đó nói với bạn rằng họ đã xác thực chéo trên mô hình với C = 1 và kernel tuyến tính và bạn phát hiện ra một số phần tách được đánh giá bằng kernel rbf!)p
- Nhưng trừ khi không có quyết định nào liên quan vì tất cả các phân tách đều mang lại cùng một tham số, điều này sẽ phá vỡ tính độc lập ở vòng ngoài: dữ liệu thử nghiệm của mỗi phân tách đã đi vào quyết định mà tham số nào thắng khi nó được đào tạo dữ liệu trong tất cả các phân tách khác và do đó được sử dụng để tối ưu hóa các tham số.
Cách tiếp cận 2: coi điều chỉnh siêu tham số là một phần của đào tạo mô hình
Cách tiếp cận này kết nối các quan điểm của "nhà phát triển thuật toán đào tạo" và người sử dụng thuật toán đào tạo.
Nhà phát triển thuật toán đào tạo cung cấp một thuật toán đào tạo "trần trụi" model = train_naked (trainingdata, hyperparameters)
. Vì nhu cầu của người dùng được áp dụng tunedmodel = train_tuned (trainingdata)
cũng cần phải sửa chữa các siêu đường kính.
train_tuned
có thể được thực hiện, ví dụ bằng cách gói một trình tối ưu hóa dựa trên xác thực chéo xung quanh thuật toán đào tạo trần trụi train_naked
.
train_tuned
sau đó có thể được sử dụng như bất kỳ thuật toán đào tạo nào khác không yêu cầu đầu vào siêu tham số, ví dụ đầu ra của nó tunedmodel
có thể được xác nhận chéo. Bây giờ các siêu đường kính được kiểm tra độ ổn định của chúng giống như các tham số "bình thường" cần được kiểm tra độ ổn định như là một phần của việc đánh giá xác nhận chéo.
Đây thực sự là những gì bạn làm và đánh giá trong xác thực chéo lồng nhau nếu bạn thực hiện trung bình tất cả các mô hình chiến thắng bất kể các bộ tham số riêng lẻ của chúng.
Có gì khác biệt?
Chúng tôi có thể kết thúc với các mô hình cuối cùng khác nhau theo 2 cách tiếp cận sau:
- mô hình cuối cùng trong cách tiếp cận 1 sẽ là
train_naked (all data, hyperparameters from optimization)
- trong khi cách tiếp cận 2 sẽ sử dụng
train_tuned (all data)
và - vì nó chạy lại tối ưu hóa siêu tham số trên tập dữ liệu lớn hơn - điều này có thể kết thúc bằng một bộ siêu đường kính khác.
Nhưng một lần nữa logic tương tự được áp dụng: nếu chúng ta thấy rằng mô hình cuối cùng có các tham số khác nhau đáng kể so với các mô hình thay thế xác thực chéo, thì đó là một triệu chứng của giả định 1 bị vi phạm. Vì vậy, IMHO, một lần nữa chúng tôi không có xung đột mà chỉ kiểm tra xem các giả định (ngầm) của chúng tôi có hợp lý hay không. Và nếu họ không, dù sao chúng ta cũng không nên đặt cược quá nhiều vào việc ước tính tốt hiệu suất của mô hình cuối cùng đó.
Tôi có ấn tượng (cũng từ việc nhìn thấy số lượng câu hỏi / nhầm lẫn tương tự ở đây trên CV) mà nhiều người nghĩ về xác thực chéo lồng nhau khi thực hiện phương pháp 1. Nhưng lỗi tổng quát hóa thường được ước tính theo cách tiếp cận 2, vì vậy đó là cách để giải quyết mô hình cuối cùng là tốt.
Ví dụ Iris
Tóm tắt: Việc tối ưu hóa về cơ bản là vô nghĩa. Cỡ mẫu có sẵn không cho phép phân biệt giữa hiệu suất của bất kỳ bộ tham số nào ở đây.
Tuy nhiên, từ quan điểm ứng dụng, kết luận là không có vấn đề gì trong số 4 bộ tham số bạn chọn - đó không phải là tất cả những tin xấu: bạn đã tìm thấy một thông số tương đối ổn định. Ở đây có lợi thế của việc xác thực hợp lệ của mô hình được điều chỉnh: trong khi bạn không thể khẳng định rằng đó là mô hình tối ưu, bạn vẫn có thể khẳng định rằng mô hình được xây dựng trên toàn bộ dữ liệu bằng cách sử dụng phương pháp 2 sẽ có độ chính xác khoảng 97% (khoảng tin cậy 95% cho 145 chính xác trong số 150 trường hợp thử nghiệm: 92 - 99%)
Lưu ý rằng cách tiếp cận 1 cũng không quá xa - xem bên dưới: tối ưu hóa của bạn vô tình bỏ lỡ một "người chiến thắng" tương đối rõ ràng vì các mối quan hệ (đó thực sự là một triệu chứng rất rõ ràng khác của vấn đề kích thước mẫu).
Mặc dù tôi không đủ sâu vào các SVM để "thấy" rằng C = 1 nên là một lựa chọn tốt ở đây, tôi sẽ đi với hạt nhân tuyến tính hạn chế hơn. Ngoài ra, như bạn đã thực hiện tối ưu hóa, không có gì sai khi chọn bộ tham số chiến thắng ngay cả khi bạn biết rằng tất cả các bộ tham số đều dẫn đến hiệu suất thực tế bằng nhau.
Tuy nhiên, trong tương lai, hãy xem xét liệu trải nghiệm của bạn có mang lại những dự đoán sơ bộ về hiệu suất mà bạn có thể mong đợi hay không và mô hình nào sẽ là một lựa chọn tốt. Sau đó, xây dựng mô hình đó (với các siêu đường kính cố định thủ công) và tính toán khoảng tin cậy cho hiệu suất của nó. Sử dụng điều này để quyết định xem cố gắng tối ưu hóa có hợp lý hay không. (Tôi có thể thêm rằng tôi chủ yếu làm việc với dữ liệu trong đó việc có thêm 10 trường hợp độc lập là không dễ dàng - nếu bạn ở trong một lĩnh vực có kích thước mẫu độc lập lớn, mọi thứ sẽ tốt hơn cho bạn)
phiên bản dài:
Đối với các kết quả ví dụ trên tập iris
dữ liệu. iris
có 150 trường hợp, SVM với lưới 2 x 2 tham số (2 hạt nhân, 2 bậc độ lớn cho hình phạt C
) được xem xét.
Vòng lặp bên trong có các phần tách 129 (2x) và 132 (6x). Bộ tham số "tốt nhất" không được quyết định giữa hạt nhân tuyến tính hoặc rbf, cả hai đều có C = 1. Tuy nhiên, độ chính xác kiểm tra bên trong là tất cả (bao gồm luôn mất C = 10) trong độ chính xác quan sát 94 - 98,5%. Sự khác biệt lớn nhất mà chúng tôi có ở một trong các phần tách là 3 so với 8 lỗi đối với rbf với C = 1 so với 10.
Không có cách nào đây là một sự khác biệt đáng kể. Tôi không biết cách trích xuất dự đoán cho các trường hợp riêng lẻ trong CV, nhưng thậm chí giả sử rằng 3 lỗi đã được chia sẻ và mô hình C = 10 đã tạo thêm 5 lỗi:
> table (rbf1, rbf10)
rbf10
rbf1 correct wrong
correct 124 5
wrong 0 3
> mcnemar.exact(rbf1, rbf10)
Exact McNemar test (with central confidence intervals)
data: rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1
Hãy nhớ rằng có 6 so sánh cặp trong lưới 2 x 2, vì vậy chúng tôi cũng cần sửa cho nhiều so sánh.
Cách tiếp cận 1
Trong 3 trong 4 lần phân tách bên ngoài trong đó rbf "won" so với kernel tuyến tính, chúng thực sự có cùng độ chính xác ước tính (tôi đoán min trong trường hợp các mối quan hệ trả về chỉ số phù hợp đầu tiên).
Thay đổi lưới thành
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
năng suất
({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)
Cách tiếp cận 2:
Đây clf
là mô hình cuối cùng của bạn. Với random_state = 2
, rbf với C = 1 thắng:
In [310]: clf.grid_scores_
[...snip warning...]
Out[310]:
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]
(xảy ra khoảng 1 trong 5 lần, 1 trong 6 lần linear
và rbf
có C = 1
được gắn vào thứ hạng 1)