Cross Validation with K-fold

ปรกติชุดข้อมูลจะถูกแบ่งเป็นสองส่วน คือส่วนที่ใช้สำหรับเทรนโมเดล และส่วนที่เทสโมเดล เช่นแบ่งข้อมูลเป็นส่วนเทรนโมเดลสัก 60% และสำหรับเทสโมเดลอีก 40%

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

การแก้ปัญหา Overfitting ที่มักเห็นได้บ่อยๆคือการทำ K-fold Cross Validation โดยเราจะนำส่วนข้อมูลที่เป็นเทสคงไว้ และจะสนใจเฉพาะส่วนข้อมูลที่ใช้เทรนมาแบ่งเป็นสองส่วน คือส่วนที่ใช้เทรน(Training Folds) และอีกส่วนคือส่วนที่ใช้ในการทำ Validate (Test folds) โดยทำแบบนี้เรื่อยๆจำนวน K รอบโดยมีการผลัดเปลี่ยนกันระหว่างส่วนที่ใช้เทรนนิ่ง(K-1 ชุด)และส่วนที่ใช้ในการ Validation(1 ชุด) ในแต่ละรอบให้วัดค่าความแม่นยำและประสิทธิภาพออกมา(หรือใช้ค่า error ก็ได้) เมื่อทำครบ K รอบให้หาค่าเฉลี่ยความแม่นยำและประสิทธิภาพ(หรือใช้ค่า error ก็ได้)ของทุกรอบเป็นคะแนนแทนการวัดแบบเดิม

Image from https://sebastianraschka.com/faq/docs/evaluate-a-model.html

จะสังเกตได้ว่ากรณีนี้ ทุกๆส่วนของชุดข้อมูลจะถูกทำการเทส ทำให้การปรับจูนพารามิเตอร์ของโมเดลไม่โอนเอนไปที่ชุดข้อมูลเทสใดเทสหนึ่ง ปัญหา Overfitting ก็จะหมดไป

โค้ดด้านล่างจะเป็นการทำ K-fold Cross Validation ด้วย python โดยใช้ library scikit-learn และใช้ดาต้าเซ็ทที่ชื่อว่า Iris เป็นพันธุ์ดอกไม้ โดยมีการวัดกลีบเลี้ยง กลีบเลี้ยงสั้นยาวจะสามารถใช้ระบุสายพันธุ์ได้

เราจะแบ่งเป็นข้อมูลส่วนเทรน 60% และส่วนที่ใช้ในการเทส 40% โดยใช้ ฟังก์ชั่น train_test_split ในการแบ่งข้อมูล จากนั้นทำการเทรนโดยใช้ support vector machine ได้ค่าความแม่นยำและประสิทธิภาพราวๆ 0.96(ได้จากการวัดแบบ F-Score) ซึ่งคะแนนตรงนี้อาจจะไม่ใช่ค่าที่ไว้ใจได้มากนั้นเพราะอาจเกิด overfitting ได้เนื่องจากเราสามารถปรับแต่งพารามิเตอร์ C ได้ซึ่งต้องปรับแบบแมนนวล ปรับให้ผลลัพธ์คะแนนออกมาดีที่สุด

เพื่อหลีกเลี่ยง Overfitting เราจะทำการ แบ่งข้อมูล เพื่อเทรน และหาค่าคะแนน ห้ารอบติดต่อกัน (5-fold cross validation) โดยผลัดกันเป็นส่วนเทรนและส่วนวาลิเดทตามรูปภาพและโค้ดด้านล่าง

YWgro

เมื่อปรับแต่งพารามิเตอร์เสร็จแล้ว จากนั้นรัน k-fold cv เพื่อดูค่าคะแนนเฉลี่ย ถ้ายังไม่ดีพอก็ไปปรับแต่งพารามิเตอร์ใหม่จนกว่าได้ค่าคะแนนเฉลี่ยที่สูงที่สุดที่เราพอใจ ในที่นี้ได้มากสุดราวๆ 95% ซึ่งโมเดลนี้ก็น่าจะ Gerneralize พอที่จะไปทำการเทสกับข้อมูลที่แบ่งไว้ตอนแรก ซึ่งเป็นการทำ final evaluation อีกทีหนึ่ง

Ref:
[1]https://stats.stackexchange.com/questions/1826/cross-validation-in-plain-english
[2] https://sebastianraschka.com/faq/docs/evaluate-a-model.html
[3]http://scikit-learn.org/stable/modules/cross_validation.html

 

Leave a Reply

Your email address will not be published. Required fields are marked *