ทายผล Premier League ด้วย Machine Learning (2)
ในตอนที่ 1 เราทำการแปลงข้อมูล (Data Transformation) และสร้าง Features ต่างๆ (Feature Engineering) เพื่อนำไปเทรน ตอน 2 เราจะมาทำการสร้างโมเดล (Modeling) เพื่อทำการทายผลกัน
ไฟล์ที่ใช้ในตอนที่ 2 modeling-prediction.ipynb สามารถดาวน์โหลดที่นี่
Load Data
ทำการโหลดไฟล์ final_dataset.csv ที่ได้จากการแปลงข้อมูลในตอนที่ 1
เราจะไม่ใช้ข้อมูล 3 สัปดาห์แรกของแต่ละฤดูกาล เพราะ features หนึ่งที่เราใช้คือฟอร์ม 3 นัดหลัง ซึ่งเราถือว่า 3 สัปดาห์แรกจะยังไม่มีข้อมูลเหล่านี้ เราจึงตัดออก
เก็บรายชื่อทีมเจ้าบ้านและทีมเยือนในสัปดาห์ที่ 4 ของฤดูกาล 2017/18 ที่เราจะทำการทายผล
เลือก Features (HTGD, ATGD, HTP, ATP, HM1, HM2, HM3, AM1, AM2, AM3, DiffFormPts, DiffLP) และ label (FTR) ที่จะใช้ป้อนโมเดล
Visualising Data
เราลองมาวาดกราฟดูการกระจายตัวและความสัมพันธ์ของแต่ละ Features กัน
จะเห็นว่า Features ดูสมดุล มีความสัมพันธ์แปรผันแตกต่างกันไป
Prepare features for Train and Test set
ทำการแยก Features และ Label ออกจากกัน
ทำการแปลง features ที่ไม่ใช่ตัวเลข ที่เป็น category อย่าง เช่น HM1 ซึ่งมีค่าอยู่ 3 ประเภท (W, D, L) โดยเทคนิค one-hot-embed อย่างเช่นให้ค่า W =[HM1_D, HM1_L, HM1_W] = [0, 0, 1] ซึ่งเราสามารถใช้ฟังก์ชัน get_dummies() ของ pandas ได้เลย
แบ่งข้อมูลที่จะใช้ Predict, Train และ Test โดยแยกข้อมูล 10 นัดท้ายสุดที่เราจะทำนายออกมาก่อน ส่วนที่เหลือเราจะแบ่งเป็นข้อมูลสำหรับ Train และ Test ซึ่งโดยทั่วไปจะทำการสุ่ม แบ่งเป็น Test 10–20% Train 80–90%
แต่ในตัวอย่างนี้ ผมทดลองใช้วิธีกำหนดข้อมูล ฤดูกาล 2000/01–2015/16 สำหรับ Train และ 2016/17 เป็น Test set เนื่องจากลักษณะข้อมูลแต่ละฤดูกาลน่าจะมีรูปแบบบางอย่างอยู่ และน่าจะมีลักษณะเป็น Time Series คือข้อมูลก่อนหลังน่าจะมีผล ซึ่งในทางปฏิบัติเราอาจจะลองทั้งสองแบบเทียบกัน แต่ในตัวอย่างผมจะลองแบบนี้ไปก่อน (คิดเห็นยังไง แนะนำด้วยนะครับ)
ขั้นต่อไปเราจะทำการ Standardizing ข้อมูลให้อยู่ในสเกลเดียวกันเพื่อประสิทธิภาพในการเทรนโมเดล โดยใช้ฟังก์ชัน StandardScaler() ใน scikit-learn
Modeling
สร้างฟังก์ชันเพื่อความสะดวกในการ Train, Test และ Evaluate แต่ละ Model โดยเราจะใช้ F1 score และ Accuracy ในการวัดผลความแม่นยำของ Model
เนื่องจากโจทย์เป็นแบบ Multiclass classification คือมีคำตอบ 3 แบบ (H, A, D) เราจะลองใช้โมเดล classification อย่างเช่น LogisticRegression, SVC และ XGBoost
เปรียบเทียบดูจาก F1 Score และค่าความแม่นยำ เราจะเลือกโมเดล XGBoost ไปใช้
Hyperparameter Tuning
เราสามารถปรับจูนค่าตัวแปรต่างๆ ในโมเดล เพื่อให้มีความแม่นยำมากที่สุด โดยใช้ grid search ใน sciki-learn
อ่านเพิ่มเติม XGBoost Parameters
เราสามารถทำการ save โมเดลที่เราต้องการเพื่อนำไปใช้งานทีหลังได้
ทำนายผล (Pridiction)
เป็นไงครับผลที่ได้ ตรงใจแฟน ๆ กันไหมครับ สำหรับตัวผมเองต้องถือว่าถูกใจมาก (ไม่อยากบอกว่าเชียร์ทีมไหน เดี๋ยวจะหาว่าโมเดล bias 555)
จะเห็นว่าโมเดลที่ทำเป็นเพียงตุ๊กตาเริ่มต้น สามารถปรับปรุงได้อีกเยอะนะครับ ไม่ว่าจะเพิ่ม Features ใหม่ ๆ หรือใช้ข้อมูลที่เกี่ยวข้องอื่นๆ เช่น นักเตะ อัตรต่อรอง หรือแม้แต่ข้อมูลใน social media ข่าวต่างๆ ใครมีความเห็นอย่างไร แลกเปลี่ยนกันนะครับ
ป.ล. ตอนทำคู่ของสัปดาห์ 4 ฤดูกาล 2017/18 ยังไม่เล่น มาลุ้นกันว่าจะถูกสักกี่ข้อ
ทายผล Premier League ด้วย Machine Learning (1)
code ที่ทำทั้งหมด
credit: Siraj Raval