(ฉันแน่ใจว่าฉันได้เขียนคำตอบส่วนใหญ่แล้ว แต่ไม่สามารถหาได้ในตอนนี้ถ้าใครก็ตามพบคำตอบนั้น ฉันเห็น 2 แนวทางที่แตกต่างกันเล็กน้อยที่นี่ซึ่งฉันคิดว่ามีเหตุผล
แต่ก่อนอื่นคำศัพท์:
- มาจากเขตข้อมูลที่นำไปใช้แบบจำลอง (ติดตั้ง / ผ่านการฝึกอบรม)สำหรับฉันคือพร้อมใช้งาน นั่นคือโมเดลมีข้อมูลทั้งหมดที่จำเป็นในการสร้างการทำนายสำหรับข้อมูลใหม่ ดังนั้นรูปแบบการมียังhyperparameters อย่างที่คุณจะเห็นมุมมองนี้มีความสัมพันธ์อย่างใกล้ชิดกับวิธีที่ 2 ด้านล่าง
- OTOH อัลกอริทึมการฝึกอบรมในประสบการณ์ของฉันไม่ได้กำหนดไว้อย่างดีในแง่ต่อไปนี้: เพื่อให้ได้รูปแบบ (ติดตั้ง) ไม่เพียง แต่ - เรียกว่า "การติดตั้งหลัก" - ของพารามิเตอร์แบบจำลอง "ปกติ" ที่ต้องทำ แต่ยังต้องแก้ไขพารามิเตอร์ จากมุมมองของแอปพลิเคชันของฉันไม่แตกต่างกันมากระหว่างพารามิเตอร์และไฮเปอร์พาราเมอร์: ทั้งสองเป็นส่วนหนึ่งของแบบจำลองและจำเป็นต้องประเมิน / ตัดสินใจระหว่างการฝึกอบรม
ผมคิดว่าความแตกต่างระหว่างพวกเขามีความเกี่ยวข้องกับความแตกต่างระหว่างคนที่พัฒนาอัลกอริทึมการฝึกอบรมใหม่ที่มักจะอธิบายระดับของขั้นตอนวิธีการฝึกอบรมร่วมกับพารามิเตอร์พวงมาลัยบาง (คนhyperparameters) ซึ่งเป็นเรื่องยาก / เป็นไปไม่ได้ที่จะแก้ไข (หรืออย่างน้อยก็เพื่อแก้ไขวิธีที่พวกเขาควรจะตัดสินใจ / ประเมิน) โดยไม่มีความรู้เกี่ยวกับแอปพลิเคชัน / โดเมน
วิธีที่ 1: ต้องการผลลัพธ์การเพิ่มประสิทธิภาพที่เสถียร
ด้วยวิธีนี้ "การฝึกอบรมรุ่น" เป็นที่เหมาะสมของ "ปกติ" พารามิเตอร์แบบและhyperparametersจะได้รับ การตรวจสอบภายในเช่นการตรวจสอบไขว้ดูแลการเพิ่มประสิทธิภาพพารามิเตอร์ไฮเปอร์พารามิเตอร์
สิ่งสำคัญขั้นตอน / สมมติฐานที่นี่เพื่อแก้กระอักกระอ่วนของการมี hyperparameter ชุดควรจะเลือกเป็นที่จะต้องมีการเพิ่มประสิทธิภาพที่จะมีเสถียรภาพ การตรวจสอบความถูกต้องข้ามเพื่อวัตถุประสงค์ในการตรวจสอบสันนิษฐานว่าตัวแบบตัวแทนเสมือนทั้งหมดนั้นมีความคล้ายคลึงกับแบบจำลองขั้นสุดท้าย (ได้รับจากการฝึกอบรมขั้นตอนวิธีเดียวกันกับชุดข้อมูลทั้งหมด) เพื่อให้สามารถปฏิบัติได้เท่าเทียมกัน หากสมมติฐานนี้ผิดพลาดและ
แบบจำลองตัวแทนยังคงเท่ากัน (หรือเทียบเท่า) ในหมู่พวกเขา แต่ไม่ใช่แบบจำลองขั้นสุดท้ายเรากำลังพูดถึงอคติที่มองโลกในแง่ร้ายที่รู้จักกันดีของการตรวจสอบข้าม
หากยังเป็นรูปแบบตัวแทนจะไม่เท่ากัน / เทียบเท่ากับแต่ละอื่น ๆ ที่เรามีปัญหาเกี่ยวกับความไม่แน่นอน
สำหรับผลการเพิ่มประสิทธิภาพของวงชั้นในที่นี้หมายถึงว่าถ้าการเพิ่มประสิทธิภาพมีเสถียรภาพมีความขัดแย้งในการเลือก hyperparameters และถ้าการเปลี่ยนแปลงมากเป็นที่สังเกตทั่วผลการตรวจสอบข้ามด้านการเพิ่มประสิทธิภาพไม่ได้มีเสถียรภาพ สถานการณ์การฝึกอบรมที่ไม่เสถียรมีปัญหาที่เลวร้ายยิ่งกว่าการตัดสินใจว่าพารามิเตอร์ตัวใดที่ควรเลือกและฉันขอแนะนำให้ย้อนกลับไปในกรณีนั้นและเริ่มกระบวนการสร้างแบบจำลองทั้งหมด
แม้ว่าจะมีข้อยกเว้นอยู่ที่นี่: อาจมีข้อ จำกัด ในท้องถิ่นหลายประการในการเพิ่มประสิทธิภาพที่ให้ประสิทธิภาพที่เท่าเทียมสำหรับการใช้งานจริง การเลือกตัวเลือกในหมู่พวกเขาให้มั่นคงอาจเป็นข้อกำหนดที่ไม่จำเป็นอย่างยิ่ง แต่ฉันไม่รู้ว่าจะออกจากภาวะที่กลืนไม่เข้าคายไม่ออกนี้ได้อย่างไร
โปรดทราบว่าหากไม่ใช่ทุกรุ่นจะได้รับชุดพารามิเตอร์ที่ชนะเหมือนกันคุณไม่ควรใช้การประมาณลูปนอกเป็นข้อผิดพลาดในการวางนัยทั่วไปที่นี่:
- พี
- แต่ถ้าไม่มีการตัดสินใจที่เกี่ยวข้องเนื่องจากตัวแยกทั้งหมดให้ค่าพารามิเตอร์เดียวกันสิ่งนี้จะทำลายความเป็นอิสระในวงรอบนอก: ข้อมูลการทดสอบของการแยกแต่ละครั้งได้เข้าสู่การตัดสินใจว่าพารามิเตอร์ชุดใดที่ชนะเนื่องจากเป็นข้อมูลการฝึกอบรม เพื่อปรับพารามิเตอร์ให้เหมาะสม
วิธีที่ 2: จัดการกับการปรับพารามิเตอร์ไฮเปอร์พารามิเตอร์เป็นส่วนหนึ่งของการฝึกอบรมแบบจำลอง
วิธีนี้เชื่อมโยงมุมมองของ "ผู้พัฒนาอัลกอริทึมการฝึกอบรม" และผู้ใช้ที่ใช้อัลกอริทึมการฝึกอบรม
นักพัฒนาอัลกอริทึมการฝึกอบรมให้ "เปล่า" model = train_naked (trainingdata, hyperparameters)
ขั้นตอนวิธีการฝึกอบรม ตามที่ผู้ใช้ต้องการ tunedmodel = train_tuned (trainingdata)
ซึ่งดูแลการแก้ไขพารามิเตอร์
train_tuned
train_naked
สามารถดำเนินการได้เช่นโดยการตัดเพิ่มประสิทธิภาพการตรวจสอบตามข้ามรอบขั้นตอนวิธีการฝึกอบรมเปลือยกาย
train_tuned
สามารถใช้เช่นเดียวกับอัลกอริธึมการฝึกอบรมอื่น ๆ ที่ไม่ต้องการอินพุตไฮเปอร์พารามิเตอร์เช่นเอาต์พุตtunedmodel
สามารถถูกตรวจสอบข้ามได้ ตอนนี้พารามิเตอร์ไฮเปอร์จะถูกตรวจสอบเพื่อความมั่นคงเช่นเดียวกับพารามิเตอร์ "ปกติ" ควรตรวจสอบความเสถียรซึ่งเป็นส่วนหนึ่งของการประเมินผลการตรวจสอบข้าม
นี่คือสิ่งที่คุณทำและประเมินผลในการตรวจสอบความถูกต้องของข้อมูลแบบซ้อนถ้าคุณประเมินประสิทธิภาพของรุ่นที่ชนะทั้งหมดโดยไม่คำนึงถึงชุดพารามิเตอร์แต่ละชุด
ความแตกต่างคืออะไร?
เราอาจลงเอยด้วยโมเดลสุดท้ายที่แตกต่างกันโดยใช้แนวทางทั้งสองนี้:
- รุ่นสุดท้ายในวิธีที่ 1 จะเป็น
train_naked (all data, hyperparameters from optimization)
- ในขณะที่วิธีที่ 2 จะใช้
train_tuned (all data)
และ - ตามที่เรียกใช้การเพิ่มประสิทธิภาพพารามิเตอร์ไฮเปอร์พารามิเตอร์อีกครั้งในชุดข้อมูลที่มีขนาดใหญ่ขึ้น - ซึ่งอาจสิ้นสุดด้วยชุดพารามิเตอร์ไฮเปอร์พารามิเตอร์ที่แตกต่างกัน
แต่ใช้ตรรกะเดียวกันอีกครั้ง: หากเราพบว่าตัวแบบสุดท้ายมีพารามิเตอร์ที่แตกต่างกันอย่างมากจากตัวแบบตัวแทนการตรวจสอบความถูกต้องข้ามซึ่งเป็นอาการของการสันนิษฐาน 1 ที่ถูกละเมิด ดังนั้น IMHO เราไม่มีข้อขัดแย้งอีกต่อไป แต่เป็นการตรวจสอบว่าสมมติฐาน (โดยนัย) ของเรานั้นเป็นธรรมหรือไม่ และถ้าไม่ใช่เราก็ไม่ควรวางเดิมพันมากเกินไปในการประเมินประสิทธิภาพของรุ่นสุดท้าย
ฉันมีความประทับใจ (จากการเห็นจำนวนคำถาม / ความสับสนที่คล้ายกันที่นี่ใน CV) ที่หลายคนคิดว่าการตรวจสอบความถูกต้องแบบไขว้แบบซ้อนทำตามวิธีที่ 1 แต่ข้อผิดพลาดทั่วไปมักจะถูกประเมินตามวิธีที่ 2 ดังนั้นนั่นเป็นวิธี รุ่นสุดท้ายเช่นกัน
ตัวอย่างไอริส
สรุป:การเพิ่มประสิทธิภาพนั้นไม่มีจุดหมาย ขนาดตัวอย่างที่มีอยู่ไม่อนุญาตให้แยกความแตกต่างระหว่างประสิทธิภาพของชุดพารามิเตอร์ใด ๆ ที่นี่
อย่างไรก็ตามจากมุมมองของแอปพลิเคชันข้อสรุปคือมันไม่สำคัญว่าคุณเลือกพารามิเตอร์ใดใน 4 พารามิเตอร์ซึ่งไม่ใช่ข่าวร้ายทั้งหมด: คุณพบพารามิเตอร์ที่มีความเสถียรค่อนข้างสูง นี่คือข้อดีของการตรวจสอบความถูกต้องแบบซ้อนของโมเดลที่ได้รับการปรับ: ในขณะที่คุณไม่สามารถอ้างได้ว่ามันเป็นรุ่นที่ดีที่สุดคุณยังสามารถอ้างได้ว่าโมเดลที่สร้างขึ้นบนข้อมูลทั้งหมดโดยใช้วิธีที่ 2 ความถูกต้องประมาณ 97% (ช่วงความมั่นใจ 95% สำหรับ 145 กรณีทดสอบที่ถูกต้องจาก 150 กรณี: 92 - 99%)
โปรดทราบว่าวิธีการที่ 1 ยังไม่ใกล้เท่าที่ควร - ดูด้านล่าง: การเพิ่มประสิทธิภาพของคุณพลาด "ผู้ชนะ" ที่ชัดเจนโดยเปรียบเทียบเนื่องจากความสัมพันธ์ (นั่นเป็นอีกปัญหาหนึ่งของปัญหาขนาดตัวอย่าง)
ในขณะที่ฉันไม่ลึกพอที่ SVM จะ "เห็น" ว่า C = 1 ควรเป็นตัวเลือกที่ดีที่นี่ฉันจะไปกับเคอร์เนลเชิงเส้นที่ จำกัด มากขึ้น นอกจากนี้ในขณะที่คุณทำการปรับให้เหมาะสมไม่มีอะไรผิดปกติกับการเลือกชุดพารามิเตอร์ที่ชนะแม้ว่าคุณจะทราบว่าชุดพารามิเตอร์ทั้งหมดนำไปสู่ประสิทธิภาพที่เท่าเทียมกันในทางปฏิบัติ
อย่างไรก็ตามในอนาคตพิจารณาว่าประสบการณ์ของคุณให้คาดเดาอย่างคร่าวๆเกี่ยวกับประสิทธิภาพที่คุณสามารถคาดหวังได้หรือไม่และแบบจำลองใดเป็นตัวเลือกที่ดี จากนั้นสร้างโมเดลนั้น (พร้อมพารามิเตอร์ไฮเปอร์พารามิเตอร์คงที่ด้วยตนเอง) และคำนวณช่วงความมั่นใจสำหรับประสิทธิภาพการทำงาน ใช้สิ่งนี้เพื่อตัดสินใจว่าการเพิ่มประสิทธิภาพนั้นสมเหตุสมผลหรือไม่ (ฉันอาจเพิ่มว่าฉันส่วนใหญ่ทำงานกับข้อมูลที่ได้รับ 10 กรณีที่เป็นอิสระมากขึ้นไม่ใช่เรื่องง่าย - ถ้าคุณอยู่ในเขตที่มีขนาดตัวอย่างอิสระขนาดใหญ่สิ่งต่าง ๆ จะดูดีขึ้นสำหรับคุณ)
รุ่นยาว:
สำหรับตัวอย่างผลลัพธ์บนiris
ชุดข้อมูล iris
มี 150 กรณี, SVM ที่มีกริดของพารามิเตอร์ 2 x 2 (2 เมล็ด, 2 ออเดอร์ของขนาดสำหรับการลงโทษC
) ได้รับการพิจารณา
ห่วงด้านในมีตัวแยก 129 และ 2x และ 132 (6x) เคส ชุดพารามิเตอร์ "ดีที่สุด" ไม่มีการแบ่งแยกระหว่างเคอร์เนลเชิงเส้นหรือ rbf ทั้งคู่กับ C = 1 อย่างไรก็ตามความแม่นยำในการทดสอบภายในคือทั้งหมด (รวมถึงการสูญเสีย C = 10 เสมอ) ภายในความแม่นยำ 94-98.5% ความแตกต่างที่ใหญ่ที่สุดที่เรามีในหนึ่งในการแยกคือ 3 กับ 8 ข้อผิดพลาดสำหรับ rbf กับ C = 1 กับ 10
มันไม่มีความแตกต่างที่สำคัญ ฉันไม่ทราบวิธีแยกการคาดการณ์สำหรับแต่ละกรณีใน CV แต่ถึงแม้ว่าสมมติว่ามีการแบ่งปันข้อผิดพลาด 3 ข้อและโมเดล C = 10 สร้างข้อผิดพลาดเพิ่มเติม 5 ข้อ:
> 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
โปรดจำไว้ว่ามีการเปรียบเทียบแบบคู่กัน 6 รายการในตาราง 2 x 2 ดังนั้นเราจะต้องแก้ไขให้ถูกต้องสำหรับการเปรียบเทียบหลายรายการเช่นกัน
วิธีที่ 1
ใน 3 จาก 4 ด้านนอกที่ rbf "ชนะ" เหนือเคอร์เนลเชิงเส้นพวกเขามีความแม่นยำโดยประมาณเท่ากัน (ฉันเดานาทีในกรณีที่ความสัมพันธ์ส่งคืนดัชนีที่เหมาะสมแรก)
การเปลี่ยนกริดเป็น
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
อัตราผลตอบแทน
({'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)
วิธีที่ 2:
นี่clf
คือรุ่นสุดท้ายของคุณ ด้วยrandom_state = 2
, rbf with C = 1 ชนะ:
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}]
(ที่เกิดขึ้นประมาณ 1 ใน 5 ครั้ง 1 ใน 6 ครั้งlinear
และrbf
มีC = 1
มีการเชื่อมโยงกับอันดับ 1)