ทายผล Premier League ด้วย Machine Learning (2)

Nithiroj Tripatarasit
2 min readSep 8, 2017

--

ในตอนที่ 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

--

--