What is Cross-validation (CV) and Why Do We Need It?
ทุกคนอาจจะเคยได้ยินและเคยศึกษาวิธีการใช้ K-fold Cross-validation กันมาบ้างแล้วใช่ไหมคะ แต่ทราบหรือไม่ว่าจริงๆ แล้ว K-fold เป็นเพียงแค่ Subset ของ Cross-validation Method เท่านั้น ยังมีอีกหลายวิธีที่น่าสนใจ เดี๋ยวเรามาศึกษาไปพร้อมๆ กันเลยค่ะ
แต่ก่อนอื่นขออธิบายคร่าวๆ ว่า Cross-validation คืออะไรและมีประโยชน์อย่างไร
What is Cross-validation?
หลังจากที่เรา Build Machine Learning Model เสร็จ สเต็ปถัดมาคือการวัด Performance ของ Model เพื่อดูว่า Model ของเรานั้นมีความแม่นยำแค่ไหน แต่ถ้าหากเราวัดผลของ Model จากแค่ Test Set ชุดเดียว มันจะมีความน่าเชื่อถือมากพอหรือไม่?? Cross-validation เป็นเทคนิคในการ Evaluate Machine Learning Model ที่เข้ามาช่วยแก้ปัญหาตรงนี้ โดยจะมีหลากหลายวิธี แต่ทุกวิธีจะมี Algorithm คล้ายกัน ดังนี้
- แบ่ง Dataset ออกเป็น 2 ส่วน (Training and Testing)
- Train Model บน Training Set
- Validate Model บน Test Set
- ทำสเต็ป 1–3 ซ้ำ x ครั้ง (จำนวน x ขึ้นอยู่กับ CV Method ที่เราใช้)
โดยในบทความนี้จะกล่าวถึง Cross-validation ทั้งหมด 5 วิธีหลักๆ ดังต่อไปนี้
1. Hold-out cross-validation
เป็นวิธีที่ง่ายที่สุด และถูกใช้ทั่วไปในการ Build Machine Learning Model โดยมี Algorithm ดังต่อไปนี้
- แบ่ง Dataset ออกเป็น 2 ส่วน (Training and Testing) โดยปกติจะแบ่งเป็น 80:20 คือ Training Set 80% และ Test Set 20% แต่เราสามารถปรับตัวเลขให้เหมาะสมกับ Dataset ของเราได้เลย
- Train Model บน Training Set
- Validate Model บน Test Set
- บันทึกผลการ Validate Model
อ่านจบ Section นี้แล้วรู้สึกคุ้นๆ ไหมคะ จริงๆ แล้ว Hold-out ก็คือวิธีการที่เราใช้ในการ Split Dataset ของเราโดยทั่วไปนั่นเอง อย่างไรก็ตามวิธีนี้ยังคงมีข้อเสียอยู่ด้วยเช่นกัน หลักๆ คือเรา Test Model แค่ครั้งเดียว ซึ่งอาจจะเกิดปัญหา Bottleneck ทำให้ Model ที่ได้ไม่น่าเชื่อถือมากพอ
2. K-fold Cross-validation
เป็นเทคนิคที่ช่วย Minimize ข้อเสียของ Hold-out Method โดย K-fold จะมีวิธีการ Split Data ที่ช่วยแก้ปัญหา “Test Only Once Bottleneck” โดยมี Algorithm ดังต่อไปนี้
- เลือกจำนวนของ Folds (k) โดยปกติ k จะเท่ากับ 5 หรือ 10 แต่เราสามารถปรับ k ได้ตามที่เราต้องการ เพื่อให้เหมาะสมกับ Dataset ของเรา แต่จะต้องน้อยกว่าจำนวน Row ของ Dataset
- แบ่ง Dataset ออกเป็น k ส่วน (Folds)
- ให้ k-1 Folds เป็น Training Set และ Fold ที่เหลือเป็น Test Set
- Train Model บน Training Set (ในแต่ละ Iteration เราจะต้องทำการ Train Model ใหม่ทุกครั้ง โดย Model แต่ละตัวจะไม่ขึ้นกับ Model ก่อนหน้า)
- Validate Model บน Test Set
- บันทึกผลการ Validate Model
- ทำสเต็ป 3–6 ซ้ำ k รอบ โดยแต่ละรอบใช้ Fold ที่เหลือเป็น Test Set เราจะได้ผลการ Validate Model ของแต่ละ Fold เท่ากับ k จำนวน
- สุดท้ายนำผลการ Validate Model จากสเต็ป 6 มาเฉลี่ยกัน ได้เป็น Final Result
เห็นได้ชัดว่า K-fold มีความน่าเชื่อถือมากกว่า Hold-out Method เพราะมีการ Train และ Test Model บนหลายๆ ส่วนของ Dataset โดยที่เราสามารถทำให้ Overall Score ของ Model มีความน่าเชื่อถือมากกว่านี้ได้ด้วยการเพิ่มจำนวน Fold อย่างไรก็ตามการเพิ่มจำนวน Fold มากเกินไปจะทำให้เราต้องใช้เวลานานใน Training Process
3. Leave-one-out cross-validation (LOOCV)
เป็น Extreme Case ของ K-fold สมมุติว่า k มีค่าเท่ากับ n ซึ่ง n คือจำนวน Sample ของ Dataset ในกรณีนี้ K-fold ก็จะเท่ากับ Leave-one-out เลย โดยมี Algorithm ดังต่อไปนี้
- เลือก 1 Sample จาก Dataset เพื่อใช้เป็น Test Set
- ส่วนที่เหลือ n — 1 Samples เป็น Training Set
- Train Model บน Training Set (ในแต่ละ Iteration เราจะต้องทำการ Train Model ใหม่ทุกครั้ง โดย Model แต่ละตัวจะไม่ขึ้นกับ Model ก่อนหน้า)
- Validate Model บน Test Set
- บันทึกผลการ Validate Model
- ทำสเต็ป 1–5 ซ้ำ n ครั้ง เราก็จะมี Training and Test Set ที่ต่างกันทั้งหมด n ชุด
- สุดท้ายนำผลการ Validate Model จากสเต็ป 5 มาเฉลี่ยกัน ได้เป็น Final Result
ประโยชน์ที่เห็นได้ชัดของ LOOCV คือเราไม่ได้ Waste Data จาก Training Set ของเราเยอะ เราใช้เพียงแค่ 1 Sample จาก Dataset เป็น Test Set เท่านั้น ส่วนที่เหลือใช้เป็น Training Set ทั้งหมด แต่ถ้าเทียบกับ K-fold แล้ว LOOCV ต้อง Build Model มากถึง n Models แทนที่จะ Build แค่ k Models ทำให้ LOOCV ใช้เวลานานกว่า K-fold อย่างมาก
ด้วยเหตุนี้เหล่า Data Scientist ส่วนใหญ่จึงมีการ Set General Rule Based on Research ต่างๆ โดยแนะนำว่าควรใช้ 5 หรือ 10 Fold แทนการใช้ LOOCV
4. Leave-p-out cross-validation (LpOC)
คล้ายกับ Leave-one-out แต่ใช้ p Samples เป็น Test Set ส่วนที่เหลือเหมือนกับ LOOCV ทั้งหมด โดยมี Algorithm ดังต่อไปนี้
- เลือก p Samples จาก Dataset เพื่อใช้เป็น Test Set
- ส่วนที่เหลือ n — p Samples เป็น Training Set
- Train Model บน Training Set (ในแต่ละ Iteration เราจะต้องทำการ Train Model ใหม่ทุกครั้ง โดย Model แต่ละตัวจะไม่ขึ้นกับ Model ก่อนหน้า)
- Validate Model บน Test Set
- บันทึกผลการ Validate Model
- ทำสเต็ป 1–5 ซ้ำ C(n เลือก p) ครั้ง
- สุดท้ายนำผลการ Validate Model จากสเต็ป 5 มาเฉลี่ยกัน ได้เป็น Final Result
5. Stratified K-fold cross-validation
บางครั้งเราเจอปัญหาของ Target Imbalance เยอะๆ ใน Dataset ของเรา เช่นในปัญหา Classification Cats and Dogs อาจจะมี Cats Target มากกว่า Dog Target โดย Stratified K-fold จะทำการนำเทคนิค K-fold CV มา Adapt สำหรับ Case ของ Target Imbalance นี้
วิธีการทำงานก็ง่ายมากเลยค่ะ Stratified K-fold จะทำการ Split Dataset เป็น k Folds โดยแต่ละ Fold จะมีเปอร์เซ็นต์ของแต่ละ Target Class เท่าๆ กัน ในส่วนของ Regression ตัว Stratified k-Fold จะ Make Sure ว่า Mean Target ของแต่ละ Fold จะมีค่าเท่าๆ กัน โดยมี Algorithm ดังต่อไปนี้
- เลือกจำนวนของ Folds (k)
- แบ่ง Dataset ออกเป็น k ส่วน (Folds) โดยแต่ละ Fold จะมีเปอร์เซ็นต์ของแต่ละ Target Class เท่าๆกัน
- ให้ k-1 Folds เป็น Training Set และ Fold ที่เหลือเป็น Test Set
- Train Model บน Training Set (ในแต่ละ Iteration เราจะต้องทำการ Train Model ใหม่ทุกครั้ง โดย Model แต่ละตัวจะไม่ขึ้นกับ Model ก่อนหน้า)
- Validate Model บน Test Set
- บันทึกผลการ Validate Model
- ทำสเต็ป 3–6 ซ้ำ k รอบ โดยแต่ละรอบใช้ Fold ที่เหลือเป็น Test Set เราจะได้ผลการ Validate Model ของแต่ละ Fold เท่ากับ k จำนวน
- สุดท้ายนำผลการ Validate Model จากสเต็ป 6 มาเฉลี่ยกัน ได้เป็น Final Result
เป็นอย่างไรกันบ้างคะเพื่อนๆ เราหวังไว้เป็นอย่างยิ่งว่าบทความนี้จะช่วยให้เพื่อนๆ เข้าใจเกี่ยวกับ Cross-validation มากขึ้น และสามารถเลือกใช้วิธีที่เหมาะสมกับ Dataset หรือปัญหาของเรามากที่สุด สุดท้ายนี้ขอบคุณทุกท่านที่อ่านมาจนถึงช่วงสุดท้ายของบทความ หากมีข้อผิดพลาดตรงส่วนใดหรือใช้คำไม่เหมาะสมต้องขออภัยเพื่อนๆ ไว้ ณ ที่นี้ด้วยนะคะ
References
สำหรับใครที่สนใจเรื่องราวดีๆ หรืออยากเรียนรู้เกี่ยวกับ Product ใหม่ๆ จากชาว KBTG สามารถติดตามรายละเอียดกันได้ที่เว็บไซต์ www.kbtg.tech