ด้วยคลาสที่ไม่สมดุลฉันต้องใช้ภายใต้การสุ่มตัวอย่างในชุดข้อมูลการตรวจสอบ / การทดสอบของฉันหรือไม่


13

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

อย่างที่คุณทราบชุดข้อมูลนั้นไม่สมดุลมาก: มีตัวอย่างเชิงลบประมาณ 1300 ตัวอย่าง (ไม่ใช่คลิก) สำหรับตัวอย่างที่เป็นบวก 1 รายการ (คลิก)

นี่คือสิ่งที่ฉันทำ:

  1. โหลดข้อมูล
  2. แบ่งชุดข้อมูลออกเป็น 3 ชุดข้อมูล: A = การฝึกอบรม (60%) B = การตรวจสอบความถูกต้อง (20%) C = การทดสอบ (20%)
  3. สำหรับแต่ละชุดข้อมูล (A, B, C) ให้ทำ under-sampling บนแต่ละคลาสลบเพื่อให้มีอัตราส่วน 5 (ตัวอย่างลบ 5 สำหรับตัวอย่างบวก 1 ตัวอย่าง) ให้ 3 ชุดข้อมูลใหม่ที่มีความสมดุลมากกว่า: A 'B' C '

จากนั้นฉันฝึกโมเดลของฉันด้วยชุดข้อมูล A 'และการถดถอยโลจิสติก

คำถามของฉันคือ:

  1. ฉันต้องใช้ชุดข้อมูลใดในการตรวจสอบความถูกต้อง B หรือ B '

  2. ฉันต้องใช้ชุดข้อมูลใดในการทดสอบ C หรือ C '

  3. การวัดใดที่เกี่ยวข้องมากที่สุดในการประเมินโมเดลของฉัน F1Score ดูเหมือนจะเป็นตัวชี้วัดที่ใช้กันอย่างแพร่หลาย แต่ที่นี่เนื่องจากคลาสไม่สมดุลกัน (ถ้าฉันใช้ชุดข้อมูล B และ C) ความแม่นยำต่ำ (ต่ำกว่า 0.20) และ F1Score นั้นได้รับอิทธิพลอย่างมากจากการเรียกคืน / ความแม่นยำต่ำ นั่นจะแม่นยำยิ่งขึ้นถ้าใช้ aucPR หรือ aucROC

  4. หากฉันต้องการพล็อตกราฟการเรียนรู้ฉันควรใช้การวัดใด (รู้ว่าข้อผิดพลาด% ไม่เกี่ยวข้องถ้าฉันใช้ชุดข้อมูล B 'สำหรับการตรวจสอบ)

ขอบคุณล่วงหน้าสำหรับเวลาของคุณ!

ความนับถือ.

คำตอบ:


9

เป็นคำถามที่ดี ... ต่อไปนี้เป็นคำตอบเฉพาะสำหรับคำถามที่มีหมายเลขของคุณ:

1)คุณควรตรวจสอบข้ามกับ B ไม่ใช่ B` ไม่เช่นนั้นคุณจะไม่รู้ว่าการปรับสมดุลห้องเรียนของคุณทำงานได้ดีเพียงใด ไม่เป็นไรที่จะตรวจสอบความถูกต้องทั้ง B และ B และจะเป็นประโยชน์ตามคำตอบของ 4 ด้านล่าง

2) คุณควรทดสอบทั้ง C และ C` ตาม 4 ด้านล่าง

3)ฉันจะติดกับ F1 และมันจะมีประโยชน์ในการใช้ ROC-AUC และนี่เป็นการตรวจสุขภาพที่ดี ทั้งสองมีแนวโน้มที่จะเป็นประโยชน์กับคลาสที่ไม่สมดุล

4)นี่มันช่างยุ่งยากจริงๆ ปัญหานี้คือวิธีที่ดีที่สุดกำหนดให้คุณตีความสิ่งที่เส้นโค้งการเรียนรู้ควรมีลักษณะหรือใช้ทั้งชุดข้อมูลที่สุ่มตัวอย่างใหม่และชุดข้อมูลเดิม

การตีความแบบดั้งเดิมของเส้นโค้งการเรียนรู้คือ:

  • Overfit - เส้นไม่ได้มารวมกัน;
  • Underfit - สายมารวมกัน แต่มีคะแนน F1 ต่ำเกินไป
  • Just Right - สายมาพร้อมกับคะแนน F1 ที่เหมาะสม

ทีนี้ถ้าคุณกำลังฝึกฝนเรื่อง A` และทดสอบกับ C บรรทัดนั้นจะไม่มารวมกันอย่างสมบูรณ์ หากคุณกำลังฝึกอบรมเรื่อง A` และทดสอบ C` ผลลัพธ์จะไม่มีความหมายในบริบทของปัญหาดั้งเดิม แล้วคุณจะทำอย่างไร?

คำตอบคือฝึกบน A` และทดสอบ B` แต่ทดสอบกับ B รับคะแนน F1 สำหรับ B` ที่คุณต้องการจากนั้นตรวจสอบคะแนน F1 สำหรับ B จากนั้นทำการทดสอบและสร้างเส้นโค้งการเรียนรู้ สำหรับ C. เส้นโค้งจะไม่มารวมกัน แต่คุณจะรู้สึกถึงอคติที่ยอมรับได้ ... ความแตกต่างระหว่าง F1 (B) และ F1 (B`)

ตอนนี้การตีความใหม่ของเส้นโค้งการเรียนรู้ของคุณคือ:

  • Overfit - เส้นไม่ได้มารวมกันและอยู่ห่างกันมากกว่า F1 (B`) -F1 (B);
  • Underfit - เส้นไม่รวมกัน แต่ความแตกต่างน้อยกว่า F1 (B`) -F1 (B) และคะแนน F1 (C) ต่ำกว่า F1 (B);
  • ถูกต้อง - เส้นไม่ได้มาด้วยกัน แต่ความแตกต่างน้อยกว่า F1 (B`) -F1 (B) ที่มีคะแนน F1 (C) คล้ายกับ F1 (B)

ทั่วไป : ฉันแนะนำอย่างแรงว่าสำหรับชั้นเรียนที่ไม่สมดุลคุณลองปรับน้ำหนักชั้นเรียนของคุณในอัลกอริทึมการเรียนรู้แทนการสุ่มตัวอย่างมากเกินไป / ต่ำกว่าเนื่องจากจะหลีกเลี่ยงศีลธรรมอันเข้มงวดที่เราได้อธิบายไว้ข้างต้น มันง่ายมากในห้องสมุดเช่นการเรียนรู้ scikit และง่ายต่อการเขียนด้วยมือในทุกสิ่งที่ใช้ฟังก์ชัน sigmoid หรือการลงคะแนนเสียงส่วนใหญ่

หวังว่านี่จะช่วยได้!


ขอบคุณมาก @ AN605 นั่นเป็นสิ่งที่ดีสำหรับคุณ! ฉันมีคำถามสองสามข้อ: สำหรับ 4) - เมื่อคุณพูดว่า "ฝึกซ้อมบน A 'และทดสอบกับ B'" คุณหมายถึงตรวจสอบหรือไม่? - "สร้างเส้นโค้งการเรียนรู้สำหรับ C" & "คะแนน F1 (C) อยู่ภายใต้ / คล้ายกับ F1 (B)" ฉันว่าสำหรับเส้นโค้งการเรียนรู้เราต้องพล็อตตัวชี้วัดข้อผิดพลาดสำหรับชุดการฝึกอบรม (A หรือ A 'ที่นี่) และตัวชี้วัดข้อผิดพลาดสำหรับชุดการตรวจสอบความถูกต้อง (B หรือ B') เท่านั้น คุณไม่ได้ "ตรวจสอบ" ที่ C ที่นี่หรือ
jmvllt

เกี่ยวกับการใช้ "น้ำหนักของชั้นเรียน" แก้ไขให้ถูกต้องหากฉันผิด (ฉันเพิ่งดูไปอย่างรวดเร็ว) แต่วิธีการนี้เกี่ยวข้องกับ "แก้ไข" ฟังก์ชันต้นทุนโดยเพิ่มค่าสัมประสิทธิ์ / น้ำหนัก "k" ต่อหน้า คลาสที่ไม่สมดุลใช่มั้ย : 􏲏ค่าใช้จ่าย (h (x), y) = -y * k * บันทึก (h (x)) - (1-y) * บันทึก ((h (x)) เช่นนั้นอัลกอริทึมควรพิจารณาการจำแนกประเภท ของคลาสบวกมีความสำคัญมากกว่า แต่สิ่งที่ฉันต้อง "ใช้" Apache Spark & ​​MLlib เพื่อสร้างแบบจำลองทั้งหมดของฉันและฉันไม่แน่ใจว่าฉันสามารถปรับเปลี่ยนฟังก์ชั่นค่าใช้จ่ายของฉันได้อย่างง่ายดายด้วยประกายไฟ เวลา!
jmvllt

5

สำหรับ1)และ2)คุณต้องการ

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

ดังนั้นสำหรับชุดข้อมูลเหล่านั้นคุณไม่จำเป็นต้องสร้างคลาสให้สมดุล

คุณอาจลองใช้ตุ้มน้ำหนักสำหรับชั้นเรียนแทนการอยู่ภายใต้ / การสุ่มตัวอย่างเนื่องจากการดำเนินการนี้จะช่วยให้คุณตัดสินใจได้

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

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


สวัสดี @jamesmf ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม สำหรับ F1Score ปัญหาที่ฉันมีคือฉันอาจต้องการที่จะมุ่งเน้นไปที่การกำจัด False Positive มากกว่า False Negative จะถูกต้องหรือไม่ที่จะเพิ่ม "น้ำหนัก" ที่แตกต่างกันสำหรับ FP และ FN ในการคำนวณความแม่นยำและการเรียกคืน
jmvllt

นั่นทำให้รู้สึกถึงฉัน คำอธิบายของคุณเกี่ยวกับการลดน้ำหนักในชั้นเรียนของคุณนั้นถูกต้องและฉันไม่เห็นมันนำมาใช้ใน MLib แต่มันอาจจะคุ้มค่ากับคำขอคุณสมบัติ
jamesmf

โอเคขอบคุณเจมส์! ขณะนี้ฉันกำลังพยายามทำด้วยตนเองโดยขยายคลาส LogisticGradient และเขียนทับวิธีการคำนวณ ฉันจะแจ้งให้คุณทราบหากสิ่งนี้ให้ผลลัพธ์ที่ดีแก่ฉัน ขอให้มีความสุขในวันนี้
jmvllt

2

คุณควรทดสอบตัวจําแนกของคุณบนชุดข้อมูลที่แสดงถึงสาเหตุที่จะถูกใช้ ที่ดีที่สุดคือการกระจายมักจะไม่แปร

ในระหว่างการเรียนรู้ให้ปรับเปลี่ยนชุดข้อมูลเป็นใหม่เพื่อช่วยคุณ

สำหรับรายละเอียดโปรดดูฉันควรไปที่ชุดข้อมูล 'สมดุล' หรือชุดข้อมูล 'ตัวแทน' หรือไม่

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