การเลือกรุ่นและการตรวจสอบข้าม: วิธีการที่ถูกต้อง


34

มีหลายเธรดใน CrossValidated ในหัวข้อการเลือกรุ่นและการตรวจสอบความถูกต้อง นี่คือบางส่วน:

อย่างไรก็ตามคำตอบของเธรดเหล่านั้นค่อนข้างทั่วไปและเน้นประเด็นด้วยวิธีการเฉพาะเพื่อการตรวจสอบข้ามและการเลือกแบบจำลอง

ในการทำสิ่งต่าง ๆ ให้เป็นรูปธรรมมากที่สุดให้พูดเช่นว่าเรากำลังทำงานกับ SVM ด้วยเคอร์เนล RBF: และนั่น ฉันมีชุดข้อมูลของคุณสมบัติXและป้ายกำกับyและฉันต้องการK(x,x)=(γ|xx|)2

  1. ค้นหาค่าที่ดีที่สุดเท่าที่จะเป็นไปได้ในโมเดลของฉัน (และγC )
  2. ฝึกอบรม SVM ด้วยชุดข้อมูลของฉัน (สำหรับการปรับใช้ขั้นสุดท้าย)
  3. ประเมินข้อผิดพลาดทั่วไปและความไม่แน่นอน (ความแปรปรวน) รอบข้อผิดพลาดนี้

ในการทำเช่นนั้นฉันจะค้นหากริดเป็นการส่วนตัวเช่นฉันลองชุดค่าผสม และไปได้ทั้งหมด เพื่อความง่ายเราสามารถสมมติช่วงต่อไปนี้:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

โดยเฉพาะอย่างยิ่งการใช้ชุดข้อมูลแบบเต็มของฉันฉันทำต่อไปนี้:

  1. สำหรับทุกคู่ ( , ) ฉันทำซ้ำซ้ำ (เช่น 100 การสุ่มซ้ำ) ของการตรวจสอบความถูกต้องข้าม -fold (เช่น ) ในชุดข้อมูลของฉันคือฉันฝึก SVM ของฉันบนเท่าและประเมิน เกิดข้อผิดพลาดบนฝาพับด้านซ้ายวนซ้ำผ่านเท่าทั้งหมด โดยรวมแล้วฉันรวบรวมข้อผิดพลาดการทดสอบ 100 x 10 = 1,000CγKK=10K1K
  2. สำหรับแต่ละเช่น ( , ) คู่ผมคำนวณค่าเฉลี่ยและความแปรปรวนของบรรดา 1000 การทดสอบข้อผิดพลาด\CγμM,σM

ตอนนี้ฉันต้องการเลือกรุ่นที่ดีที่สุด (พารามิเตอร์เคอร์เนลที่ดีที่สุด) ที่ฉันจะใช้ในการฝึกอบรม SVM สุดท้ายของฉันในชุดข้อมูลแบบเต็ม ความเข้าใจของฉันคือการเลือกแบบจำลองที่มีค่าเฉลี่ยข้อผิดพลาดต่ำที่สุดและความแปรปรวน และจะเป็นตัวเลือกที่ถูกต้องและรุ่นนี้คือเป็นค่าประมาณที่ดีที่สุดของแบบจำลองความลำเอียงและความแปรปรวน ชุดข้อมูลแบบเต็มμMσMμMσM

แต่หลังจากอ่านคำตอบในกระทู้ด้านบนฉันได้รับความประทับใจว่าวิธีนี้สำหรับการเลือก SVM ที่ดีที่สุดสำหรับการปรับใช้และ / หรือสำหรับการประเมินข้อผิดพลาด (ประสิทธิภาพการวางนัยทั่วไป) มีข้อบกพร่องและมีวิธีที่ดีกว่าในการเลือก SVM ที่ดีที่สุดและรายงานข้อผิดพลาด ถ้าเป็นเช่นนั้นพวกเขาคืออะไร? ฉันกำลังมองหาคำตอบที่เป็นรูปธรรมโปรด

ติดกับปัญหานี้ฉันจะเลือกรูปแบบที่ดีที่สุดโดยเฉพาะและประเมินข้อผิดพลาดทั่วไปได้อย่างไร


ในการทำสิ่งที่เป็นรูปธรรมมากที่สุดโปรดบอกเราว่าคุณมีข้อมูลทางสถิติจำนวนเท่าใดในชุดข้อมูลของคุณ ฟังก์ชันเป้าหมายที่คุณประเมินสำหรับการปรับให้เหมาะสมคืออะไร / คุณใช้การวัดข้อผิดพลาดประเภทใด คุณสังเกตเห็นพฤติกรรมที่สอดคล้องกันของการวัดข้อผิดพลาดที่เลือกเหนือกริดพารามิเตอร์ของคุณหรือไม่? ในกรณีที่คุณกำลังพูดถึงการจำแนกประเภทและการวัดความผิดพลาดของคุณอนุญาตสิ่งนี้: ผลการตรวจสอบความถูกต้องแบบไขว้ซ้ำเปรียบเทียบกับความแปรปรวนที่คุณคาดหวัง (แต่ไม่สามารถวัดได้) เนื่องจากขนาดตัวอย่าง จำกัด
cbeleites รองรับโมนิก้า

บทความที่คุณอาจพบว่าน่าสนใจ: optimprediction.com/files/pdf/V2A5.pdf
user31256

2
+1 สำหรับคำถามที่ชัดเจนและละเอียดมากรวมถึงคำถามที่เกี่ยวข้องมากกับชุมชนวิทยาศาสตร์ข้อมูลที่มีขนาดใหญ่
NickBraunagel

คำตอบ:


20

บทความของฉันใน JMLR ตอบคำถามที่แน่นอนนี้และแสดงให้เห็นว่าทำไมขั้นตอนที่แนะนำในคำถาม (หรืออย่างน้อยก็เหมือนอย่างนั้น) ส่งผลให้การประเมินประสิทธิภาพลำเอียงในแง่ดี:

Gavin C. Cawley, Nicola LC Talbot, "ในการเลือกรุ่นที่มากเกินไปและการเลือกแบบอคติในการประเมินประสิทธิภาพ", วารสารวิจัยการเรียนรู้ของเครื่องจักร, 11 (ก.ค. ): 2079-2107, 2010 ( www )

สิ่งสำคัญที่ต้องจำคือ cross-validation เป็นเทคนิคในการประเมินประสิทธิภาพการวางนัยทั่วไปสำหรับวิธีการสร้างแบบจำลองแทนที่จะเป็นแบบจำลอง ดังนั้นหากการเลือกพารามิเตอร์เคอร์เนลเป็นส่วนหนึ่งของกระบวนการสร้างแบบจำลองคุณต้องตรวจสอบความถูกต้องของกระบวนการเลือกแบบจำลองด้วยเช่นกันมิฉะนั้นคุณจะต้องจบลงด้วยการประเมินประสิทธิภาพแบบเอนเอียงในแง่ดี (เช่นเดียวกับกระบวนการที่คุณเสนอ)

สมมติว่าคุณมีฟังก์ชั่น fit_model ซึ่งใช้ในชุดข้อมูลซึ่งประกอบด้วยแอตทริบิวต์ X และการตอบสนองที่ต้องการ Y และส่งคืนโมเดลที่พอดีสำหรับชุดข้อมูลนั้นรวมถึงการปรับพารามิเตอร์ไฮเปอร์ (ในกรณีนี้เคอร์เนลและพารามิเตอร์การทำให้เป็นมาตรฐาน) การปรับพารามิเตอร์ไฮเปอร์นี้สามารถทำได้หลายวิธีเช่นการลดข้อผิดพลาดการตรวจสอบความถูกต้องข้าม X และ T

ขั้นตอนที่ 1 - ปรับโมเดลให้สอดคล้องกับข้อมูลที่มีทั้งหมดโดยใช้ฟังก์ชั่น fit_model สิ่งนี้ทำให้คุณมีรูปแบบที่คุณจะใช้ในการดำเนินงาน

ขั้นตอนที่ 2 - การประเมินประสิทธิภาพ ทำการตรวจสอบข้ามซ้ำหลายครั้งโดยใช้ข้อมูลที่มีทั้งหมด ในแต่ละครั้งข้อมูลจะถูกแบ่งเป็นชุดฝึกอบรมและชุดทดสอบ จัดให้พอดีกับแบบจำลองโดยใช้ชุดการฝึกอบรม (บันทึกค่าพารามิเตอร์ไฮเปอร์สำหรับโมเดลที่ติดตั้ง) และประเมินประสิทธิภาพของชุดทดสอบ ใช้ค่าเฉลี่ยสำหรับชุดการทดสอบทั้งหมดเพื่อประเมินประสิทธิภาพ (และอาจดูการแพร่กระจายของค่าด้วย)

ขั้นตอนที่ 3 - ความแปรปรวนของการตั้งค่าพารามิเตอร์ไฮเปอร์ - ดำเนินการวิเคราะห์ค่าพารามิเตอร์มากเกินไปที่รวบรวมไว้ในขั้นตอนที่ 3 อย่างไรก็ตามฉันควรชี้ให้เห็นว่าไม่มีอะไรพิเศษเกี่ยวกับพารามิเตอร์ไฮเปอร์พวกเขาเป็นเพียงพารามิเตอร์ของแบบจำลอง ) จากข้อมูล พวกเขาจะถือว่าเป็นพารามิเตอร์ไฮเปอร์แทนที่จะเป็นพารามิเตอร์เพื่อความสะดวกในการคำนวณ / คณิตศาสตร์ แต่ไม่จำเป็นต้องเป็นกรณีนี้

ปัญหาของการใช้การตรวจสอบความถูกต้องที่นี่คือข้อมูลการฝึกอบรมและการทดสอบไม่ใช่ตัวอย่างอิสระ (เนื่องจากพวกเขาแบ่งปันข้อมูล) ซึ่งหมายความว่าการประเมินความแปรปรวนของการประเมินประสิทธิภาพและพารามิเตอร์ไฮเปอร์จะมีแนวโน้มที่จะเอนเอียง เล็กกว่ามันจะเป็นตัวอย่างที่แท้จริงของข้อมูลในแต่ละเท่า) แทนที่จะใช้การตรวจสอบไขว้ซ้ำหลายครั้งฉันอาจใช้การบูตสแตรปแทนและเก็บโมเดลที่เป็นผลลัพธ์ถ้าสิ่งนี้เป็นไปได้ในการคำนวณ

ประเด็นสำคัญคือการได้รับการประเมินประสิทธิภาพที่เป็นกลางไม่ว่าอะไรก็ตามที่คุณใช้ในการสร้างแบบจำลองสุดท้าย (fit_model) จะต้องทำซ้ำทั้งหมดอย่างเป็นอิสระในแต่ละขั้นตอนของกระบวนการตรวจสอบข้าม


นี่คือคำตอบที่ดี เมื่อคุณพูดrather than repeated cross-validation you would go for bootstrapping- อะไรคือความแตกต่าง? ทั้งสองเกี่ยวข้องกับหลายซ้ำของการแบ่งข้อมูลลงในtrainและtestแล้วการฝึกอบรมในtrainและประเมินผลในtest, ไม่พวกเขา?
Josh

4
Bootstrapping (การสุ่มตัวอย่างที่มีการแทนที่) ดูเหมือนจะเป็นวิธีที่เป็นธรรมชาติมากขึ้นในการสุ่มตัวอย่างจำนวนมากอีกครั้งเนื่องจากมีการสุ่มมากกว่าการตรวจสอบข้ามซ้ำ สำหรับการบูตการใช้ enembles แบบมีถุงเป็นคุณสมบัติที่ดีโดยมีข้อผิดพลาดนอกถุงเป็นการประเมินประสิทธิภาพ มีไม่มากให้เลือกระหว่างสอง
Dikran Marsupial

ขอบคุณ @Dikran - นี่ทำให้ฉันแปลกใจถ้าสมมติว่ามีคนใช้เช่น bootstrapping คุณจะเลือกแบบจำลองที่ดีอย่างไรเมื่อพิจารณาค่าเฉลี่ยและความแปรปรวนในการทำซ้ำ (เช่นโปรโตคอลการเลือกรุ่นใดที่คุณจะติดตาม) คำถามนี้โพสคำถามนี้แน่นอน รับข้อมูลของคุณในหัวข้อนั้นจะมีค่ามาก!
Josh

@DikranMarsupial คุณสามารถส่งรหัส (เช่น Python หรือ R) สำหรับขั้นตอนที่ 1-3 ของคุณได้หรือไม่? ฉันคิดว่ามันง่ายกว่ามากที่จะเข้าใจขั้นตอนดังกล่าวเมื่อเห็นรหัสที่เป็นรูปธรรม
tobip

1
ข้อความสำคัญ: "ประเด็นสำคัญคือการได้รับการประเมินประสิทธิภาพที่เป็นกลางไม่ว่าอะไรก็ตามที่คุณใช้ในการสร้างแบบจำลองสุดท้าย (fit_model) จะต้องทำซ้ำทั้งหมดอย่างอิสระในแต่ละขั้นตอนของกระบวนการตรวจสอบข้าม" ข้อความที่แน่นอนนี้มีการถ่ายทอดในองค์ประกอบของการเรียนรู้ทางสถิติ (ดูหัวข้อ 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel

0

การใช้ SVM พร้อมไฮเปอร์พารามิเตอร์คงที่ (และ ) เป็นอัลกอริทึมการเรียนรู้ของเครื่องCγC

ขั้นตอนที่เพิ่มประสิทธิภาพ hyperparameters เหล่านี้และรถไฟ SVM กับเหล่านี้ยังเป็นเพียงขั้นตอนวิธีการเรียนรู้ของเครื่อง แทนที่จะปรับพารามิเตอร์ภายในของ SVM (เวกเตอร์สนับสนุน) ให้ดีที่สุดเท่านั้น แต่ยังเพิ่มประสิทธิภาพพารามิเตอร์ไฮเปอร์พารามิเตอร์

ตอนนี้คุณมีสองปัญหา [ที่สามารถแก้ไขได้อย่างอิสระ]:

อ่านการใช้การตรวจสอบความผิดพลาดข้าม (การรายงานประสิทธิภาพสำหรับค่าพารามิเตอร์พารามิเตอร์ที่ดีที่สุด)เพื่อให้แน่ใจว่าคุณไม่ได้ผสมกัน


วิธีแก้ปัญหาเฉพาะ (อาจไม่เหมาะสม) สำหรับปัญหาที่เป็นรูปธรรมของคำถามของคุณ:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

ที่นี่modelจะเป็น "รุ่นที่ดีที่สุด" ของคุณและloss_CV"การประเมินข้อผิดพลาดทั่วไปที่เหมาะสม" (แม้ว่าจะมีลำเอียงสูงขึ้น แต่คุณไม่สามารถมีเค้กและกินมันด้วย)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.