ถ้าทำ 10-fold Cross Validation มันอาจบังเิอิญได้ว่าตอนที่เราเลือก 90% data มาทำโมเดล แล้วไปทดสอบกับ 10% ที่เหลือนั้น
เจ้า 90% data ที่นำมาสร้างโมเดล หากตัว categorical variable ที่เรานำมาสร้างโมเดลนั้น มันไม่ครอบคลุมทั้งหมด
เช่น ถ้าตัวแปรเป็นสถานะภาพในครอบครัว เช่น ผู้อาศัย แต่ตอนทำโมเดล 90% ไม่มีข้อมูลที่เป็นผู้อาศัยเลย ดังนั้นเวลาเรานำไปทดสอบกับข้อมูล 10% ที่อาจมีข้อมูลที่มีสถานภาพเป็นผู้อาศัย มันก็อาจเกิดข้อผิดพลาดได้ (สำหรับ Classification Tree ใน MATLAB จะขึ้น Error แต่ถ้าเป็นโปรแกรมที่เขียนขึ้นเองอาจไม่ขึ้น error เพราะตัวโค๊ดอาจจะปัดให้เป็น Branch Not in Category เลยแต่ผลที่ได้อาจไม่น่าเชื่อถือ ถ้าจริงๆแล้วมันควรตกอีกด้านหนึ่ง แต่เราไม่ได้มี data ไปสร้างโมเดลให้มัน)
วิธีแก้ไขตอนนี้ยังคิดไม่ออกทั้งหมด แต่ว่าขึ้นกับการสุ่มตัว sample ถ้าสุ่มได้ครอบคลุมก็จะลดปัญหาไปได้ (แต่ในกรณีข้อมูลมีตัวแปร category เยอะ และมีค่าหลากหลาย อาจสุ่มได้ยากกว่า) แต่ถ้ามานั่งเลือกเอง data เยอะๆ คงจะเสียเวลาและ งงๆ อาจต้องอ่านงานวิจัยเพิ่มวิธีการสุ่มให้ครอบคลุม
อีกวิธีหนึ่งที่อาจลดปัญหาได้บ้าง คือการใช้ 5-fold cross classification แทน (80%/20%) มีความน่าจะเป็นที่ปัญหาจะลดลงได้ แต่ก็ไม่รับประกัน (ใน MATLAB ปกติจะเป็น 10-fold)
อีกวิธีที่คิดได้คือเลือกข้อมูลที่เป็น category ย่อย ที่มีจำนวน records น้อย ออกมาก่อนแล้ว assign ให้มันอยู่ในกลุ่ม 90% เสมอ ก็จะไม่เกิดกรณีเจอ unrecognized categorical variable ตอนทดสอบ (แต่ถ้าใช้ MATLAB ต้องทำแบบ manual เพราะโค๊ดมันคงไม่ทำให้ หรือไม่ก็ต้องไปแ้ก้ตัวโค๊ด)
วิธีสุดท้าย อาจไม่ใช้ v-fold cross validation เลย ถ้าคิดว่าข้อมูลเยอะพอ คือเลือกข้อมูลที่ครบถ้วน แล้วทดสอบทีเดียว
สุดท้ายนี้ปัญหานี้จะไม่เกิดขึ้นถ้าเป็น continuous variable เพราะโดยปกติจะแบ่ง Branch ซ้าย-ขวา โดยใช้เครื่องหมายเช่น น้อยกว่าหรือเท่ากับ และมากกว่า ซึ่งจะครอบคลุม Range ของข้อมูลทั้งหมดอยู่แล้ว แต่ก็ยังไม่ป้องกันปัญหาที่อาจจะเกิดจากการไม่ include หรือ neglect ตัวแปรบางตัวที่ไม่ได้มีอยู่ใน 90% data อยู่ดี
คิมครับ ลองเช็คดูว่าโค๊ด Python ของคิม ถ้าเจอกรณีนี้มันจะขึ้น Error หรือไม่อย่างไรครับ
Sunday, September 5, 2010
Subscribe to:
Post Comments (Atom)
2 comments:
พอดีผ่านมาเห็น มีข้อเสนอครับ
ผมไม่แน่ใจว่าเข้าใจถูกรึป่าว เท่าที่เข้าใจคือคุณพยายามจะประเมิน classifier ด้วย cross validation แล้วกลัวว่าข้อมูล train ใน 90% (กรณี 10-fold cross validation) มี class ไม่ครบ ทำให้ model ที่เรียนรู้ได้ ไม่รู้จักข้อมูล class ที่หายไป เวลา test กับ 10% ที่เหลือ จะได้ผลแย่มาก
วิธีแก้ปัญหานี้วิธีหนึ่งคือ ทำ stratified sampling ตอนแบ่งข้อมูล 90%/10% ครับ http://en.wikipedia.org/wiki/Stratified_sampling พูดง่ายๆคือแบ่งข้อมูลเป็น 10 ชุดในลักษณะที่แต่ละชุดมีข้อมูลครบทุก class และมีในอัตราส่วนเท่ากับข้อมูลตัวต้นด้วย
ถ้าผมเข้าใจผิดช่วยบอกด้วยครับ
ขอบคุณสำหรับคำแนะนำครับ
การทำ stratified sampling น่าจะเป็นคำตอบของการแก้ปัญหานี้ได้ครับ
แต่หากข้อมูลมีลักษณะเป็น multi-dimensional และจำนวนข้อมูลตอน train ไม่เยอะมากก็อาจเกิดปัญหาได้เหมือนกันครับ เพราะต้องแตกข้อมูลออกไปให้ครบแต่มีข้อมูลจำนวนจำกัด
Post a Comment