TechJam 2019 by KBTG, Deep Data First Round Summary EP 3: Modeling

Puyncharas R
KBTG Life
Published in
2 min readNov 30, 2019

ในการแข่งขัน TechJam 2019 by KBTG อีกหนึ่งในตัวชี้วัดว่าใครจะชนะ คือ การเลือกใช้โมเดล ซึ่งในส่วนใหญ่ ถ้าเราเจอกับ Tabular Data นั้น LightGBM มักเป็นตัวเลือกหลัก ๆ ที่ผู้เข้าแข่งขันชอบใช้เนื่องด้วย ความใช้งานง่ายและความเร็วในการ Train ดังนั้นในส่วนนี้เราจะมาพูดถึงการ Optimize LightGBM กัน

ในการ Train โมเดลนั้น เราต้องคำนึงถึง Objective Function และ Evaluation Function เสมอ ซึ่งข้อแตกต่างระหว่าง Objective Function กับ Evaluation Function คือ ในการ Train โมเดล โมเดลจะทำการ Optimize ตัว Objective Function ไปเรื่อย ๆ ซึ่งปกติ Objective Function จะมีค่อนข้างจำกัด แต่ตัว Evaluation Function เราสามารถสร้าง Function ขึ้นมาเพื่อทำการหยุดการ Train ของ โมเดลหากพบว่า Score บน Validation Set กำลังแย่ลงเรื่อยๆ

ในการทำ Tree-Based Model นั้นจะแบ่งออกได้เป็น 4 แบบย่อยๆ ได้แก่

  1. Regression
  2. Classification
  3. Multi-classification
  4. Ranking

ซึ่ง Objective Function นั้นจะใช้ในการสร้างต้นไม้ เช่น binary_logloss ในการทำ Classification Model หรือ MAE ในการทำ regression model ส่วน score_metrics นั้นจะใช้วัดผลของโมเดล ตัวอย่างเช่น AUC, Accuracy, F1 score หรืออาจจะเป็น Function เดียวกับ Objective Function ก็ได้เช่นกัน

ซึ่งในการสร้างโมเดลเราต้องคำนึง Score Metrics ที่เราจะใช้ประเมินผล แต่ส่วนใหญ่ของการแข่งขันจะมี การกำหนดการใช้ Score Metrics เพื่อประเมินผลของ โมเดลที่ชัดเจน ดังนั้นเพื่อให้ได้ผลที่เหมาะขณะสร้างโมเดล เราควรต้องใช้ Hyperparameter ต่างๆที่ทำให้ผลของ Score Metrics ใน Validation Set สูงสุด

ตัวอย่างเช่น ในการเทรนโมเดล LightGBM เราจะทำการ train โดยให้โมเดล Train ไปเรื่อยๆ (n_iteration) โดยคอยวัด Score Metrics ใน Validation Set เมื่อ Validation Score ไม่เพิ่มขึ้นจะหยุด Train เพื่อป้องกันการ Overfitting ด้วย Early Stopping

การจากแข่งขัน TechJam 2019 by KBTG: Deep Data จากโจทย์ Predict Income ของลูกค้าโดยมีการมีการใช้ Score แบบพิเศษเพื่อให้คะแนน model

score_metric TechJam 2019

techjam_score คือ Score Metrics ที่ใช้วัดจากการแข่งขัน

techjam_feval_log สร้าง Function ในการคำนวน Score Metrics สำหรับ LightGBM

การทำ GridSearch พร้อมทั้ง lightgbm.cv() เพื่อหาค่า Parameters num_leaves, bagging_fraction และ feature_fraction ที่เหมาะสมคราวๆ โดนที่เราจะไม่ต้องจูน Number of Iterations (num_boost_round) เนื่องจากเราต้องการให้โมเดลเทรนจนกว่า validation_score ไม่เพิ่มขึ้น ซึ่งคิดจาก techjam_score

!! ข้อควรระวังถ้าเราไม่ใส่ Eval Metric หรือ Feval โมเดลจะคำนวนตาม Objective Function ซึ่งต่างจาก techjam_score

Hyper-Parameter ได้แตกแต่งกัน ผลที่ได้อาจใกล้เคียงกันได้ แต่อย่างไรก็ผลของโมเดลจะถูกคิดจาก Score ตามที่กำหนดจึงควรใช้ techjam_score

ข้อดีของ lightgbm.cv() ที่แตกต่างกับ cv ใน Library อื่นคือเรื่องของการวัด Score ในแต่ละ Fold เช่นถ้ากำหนดให้ nfold = 5 เราจะทำการสร้างโมเดลมาทั้งสิ้น 5 โมเดล จากนั้นเราจะทำการวัด Score Metrics ณ Iterations ที่เท่ากันและทำการหยุด training เมื่อค่าเฉลี่ยของ Score Metrics ใน Fold ทั้งหมดไม่ลดลงแล้วซึ่งต่างจากการทำโมเดลในแต่ละ Fold ซึ่งทำให้เกิด Overfit ในแต่ละ Fold ได้ เช่น ถ้าเราทำ lightgbm.cv() โมเดลเราจะหยุด ที่ Iterations ที่เท่ากันสมมติ ที่ 20 ใน 5 โมเดลแต่ถ้าเราทำที่ละ Fold แยกกันอาจทำให้ Iterations ของแต่ละโมเดลหยุดที่ 10 19 28 30 15 เป็นต้นซึ่งไม่เท่ากัน

หลังจากที่ได้ Params ต่างที่เหมาะสม ทำการ Train Model ด้วย Data ทั้งหมด

สุดท้ายนี้ จากที่ทีมงานได้จัดงาน TechJam 2019 by KBTG ต่อเนื่องมาเป็นปีที่ 3 ติดต่อกัน เราได้เห็นถึงพัฒนาการด้านความสามารถของ Data Scientist ในประเทศไทยเป็นอย่างมาก ซึ่งในการแข่งขันรอบนี้ คะแนนของผู้ที่ผ่านเข้ารอบเฉือนชนะกันแค่ทศนิยมตำแหน่งที่สามเท่านั้น ดังนั้นผู้ที่ไม่ผ่านเข้ารอบอย่าเสียใจไป ขอให้มุ่งมั่นพัฒนาฝีมือเพื่อนำประเทศไทยก้าวไปสู่ความเป็นผู้นำในด้าน Data Science

สำหรับโค้ดทั้งหมดที่ใช้ในการเขียนบทความนี้อยู่ใน git ตามลิงก์ด้านล่าง:

https://github.com/KBTG-TechJam/techjam2019-datatrack-code-example

ขอบคุณที่ติดตามบทความ TechJam Series ครั้งนี้นะครับ พบกันใหม่โอกาสหน้า

Keep learning and don’t overfit !

--

--