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

Nithiroj Tripatarasit
3 min readSep 8, 2017

--

ถ้าให้แฟนบอลทำนายว่าทีมรักจะชนะหรือแพ้ ร้อยทั้งร้อยคงมีคำทำนายเดียวคือ ชนะ ชนะ และก็ชนะ เรียกว่าไม่ต้องโมเดล หรือถ้ามีก็เป็นโมเดลที่มี Bias สุดๆ เป็นแน่ อย่ากระนั้นเลยเรามาลองใช้ Machine Learning (ML) ทำนายดูดีกว่า

โมเดลที่เราจะลองทำก็ดัดแปลงมาจากกูรูที่ผมติดตามเป็นประจำ Siraj Raval เรียกว่าเป็นกูรู Machine Learning ที่มีคนติดตามไม่น้อย อธิบายง่าย สนุก แนะนำเลยครับคนนี้ ว่าแล้วก็มาเริ่มกันเลย

เราจะทำนายอะไร?

เราจะมาทำนายผลการแข่งขัน Premier League แต่ละคู่ในแต่ละสัปดาห์ จากสถิติผลการแข่งขันที่ผ่าน ๆ มา ว่าจะมีผลอย่างไร ในตัวอย่างนี้เราจะลองทายผลสัปดาห์ที่ 4 ฤดูกาล 2017/18 นี้กัน

ถ้าดูจากโจทย์ ในทาง ML ก็จะจัดเป็นแบบ Supervised Learning โดยใช้โมเดลพวก Classification มาทำนายผลว่า เจ้าบ้านชนะ (H) หรือ เสมอ (D) หรือทีมเยือนชนะ (A)

โปรแกรมที่ใช้ก็จะเป็น Python 3, pandas, Scikit-learn, Jupyter Notebook. (code ที่ทำทั้งหมด)

ข้อมูลที่ใช้

ข้อมูลสถิติได้มาจาก Football-Data.co.uk ฤดูกาล 2000/01 ถึง 2017/18 แต่ละฤดูกาลมี 38 สัปดาห์ (MW) สัปดาห์ละ 10 คู่ รวม 380 คู่ต่อฤดูกาล ยกเว้นฤดูกาล 2017/18 เพิ่งจบสัปดาห์ที่ 3 (30 คู่)

DATA TRANSFORMATION

ข้อมูลที่ดาวน์โหลดมาจะอยู่ในโฟลเดอร์ dataset แบ่งเป็นไฟล์ 2000.csv — 2017.csv แต่ละไฟล์จะมี 380 แถว ยกเว้น 2017.csv ฤดูกาล 2017/18 ที่มีเพียง 30 คู่ เพราะเพิ่งเล่นไป 3 สัปดาห์ รวมกับอีก 10 คู่ในสัปดาห์ที่ 4 ที่ผมใส่เข้าไปเองสำหรับทำนายผล

การแปลงข้อมูลจะอยู่ใน data-transformation.ipynb (Jupyter Notebook)

เริ่มจากอ่านข้อมูลไฟล์ csv ด้วย pd.read_csv()

ตัวอย่างข้อมูลจะมี วัน (Date), ทีมเจ้าบ้าน (HomeTeam), ทีมเยือน (AwayTeam), ประตูที่เจ้าบ้านทำได้ (FTHG), ประตูที่ทีมเยือนทำได้ (FTAG), ผลการแข่งขัน (FTR) — เจ้าบ้านชนะ (H), เสมอ (D) ทีมเยือนชนะ (A) ฯลฯ
(รายละเอียดแต่ละคอลัมน์)

เลือกคอลัมน์ HomeTeam, AwayTeam, FTHG, FTAG, FTR

จะเห็นว่า 10 คู่สุดท้ายจะยังไม่มีผลการแข่งขัน FTR = NaN

จะเห็นว่าตอนนี้เรามีข้อมูลประตูที่แต่ละทีมทำได้ แต่เราจะยังเอาไปทำนายผลไม่ได้ตรง ๆ คิดดูว่าถ้าเราต้องการผลประตูจึงจะทำนายผลได้ มันคงจะไม่ทันหรือไม่ต้องทำนายผลแล้ว

เราจึงต้องทำการแปลง หรือสร้าง feature ใหม่ขึ้นมาจากข้อมูลดิบที่มี (Feature Engineering) ให้เป็น feature ที่จะสามารถรู้ได้ก่อน และนำไปใส่ในโมเดลเพื่อทำนายผลการแข็งขัน ซึ่งตรงนี้ก็ต้องอาศัย Business Knowledge ในเรื่องนั้น ๆ เป็นหลัก

อย่างในกรณีนี้ถ้าเรารู้ว่าทีมไหนดีกว่าทีมไหนเราก็น่าจะบอกได้ว่าผลการแข่งขันของแต่ละคู่น่าจะเป็นอย่างไร แล้วไอ้ดีที่ว่านี่ดูอย่างไร ทำประตูได้เยอะก็น่าจะดี เสียประตูน้อยก็น่าจะดี ฟอร์มล่าสุดเป็นยังไง ชนะ แพ้ เสมอกี่ครั้ง คะแนนที่ทำได้มากกว่าหรือน้อยกว่าคู่แข่ง ซึ่งเราสามารถคำนวนได้จากข้อมูลดิบที่เรามี (FTHG, FTAG, FTR) เราสามารถนำไปคำนวนเป็น features เหล่านี้:

AHTGS — ประตูรวมสะสมในฤดูกาลที่เจ้าบ้านทำได้ก่อนหน้า
AATGS — ประตูรวมสะสมในฤดูกาลที่ทีมเยือนทำได้ก่อนหน้า
AHTGC — ประตูรวมสะสมในฤดูกาลที่เจ้าบ้านเสียให้คู่แข่งก่อนหน้า
AATGC — ประตูรวมสะสมในฤดูกาลที่ทีมเยือนเสียให้คู่แข่งก่อนหน้า

HTP — คะแนนรวมที่เจ้าบ้านได้
ATP — คะแนนรวมที่ทีมเยือนได้
จะคำนวนจากผล FTR ทีมที่ชนะจะได้ 3 คะแนน เสมอได้ 1 คะแนน แพ้ 0 คะแนน

HM1, HM2, HM3 — ผลการแข็งขันของทีมเจ้าบ้านก่อนหน้า 1, 2, 3 นัด
AM1, MM2, AM3 — ผลการแข็งขันของทีมเก่อนหน้า 1, 2, 3 นัด

DiffLP — ส่วนต่างลำดับทีมในตาราง

เราจะใช้ไฟล์ EPLStandings.csv ในโฟล์เดอร์ dataset ซึงเป็นข้อมูลอันดับในตารางของแต่ละทีมในฤดูกาลที่ผ่านมา 2000/01–2016/17 โดยเราจะให้ทีมที่เพิ่งเลื่อนชั้นขึ้นมาจะให้ถือว่าอยู่ในอันดับที่ 18 เมื่อฤดูกาลก่อน (แต่ละฤดูกาลทีมอันดับ 18–20 จะตกชั้น ทีมที่เลื่อนขึ้นมาเลยเปรียบเหมือนอยู่อันดับ 18 เมื่อฤดูกาลก่อน)

DiffLP = HomeTeamLP - AwayTeamLP

ก่อนอื่นเราจะต้องคำนวนค่า

  • HomeTeamLP- อันดับทีมเจ้าบ้านเมื่อฤดูกาลก่อน
  • AwayTeamLP — อันดับทีมเยือนเมื่อฤดูกาลก่อน

หลังจากนี้จะรวมข้อมูลทุกฤดูกาลเข้าเป็นตารางเดียว แต่เราจะทำการเพิ่มคอลัมน์ MW (ลำดับสัปดาห์) ของแต่ละนัดในฤดูกาลก่อน

ทำการรวมตารางข้อมูลทุกฤดูกาลเข้าเป็น DataFrame เดียว

คำนวนค่า DiffLP

HTGD — ส่วนต่างประตูได้เสียของทีมเจ้าบ้าน
ATGD — ส่วนต่างประตูได้เสียของทีมเยือน

DiffFormPts —ส่วนต่างคะแนน (HTP - ATP)

โดยเราจะคิดจากคะแนนที่ทำได้จากฟอร์ม 3 หลังสุดของแต่ละทีม แล้วคำนวนความต่างของแต่ละคู่

สุดท้ายก่อนที่จะนำไปใช้งานเราจะต้องทำการ scale ค่า HTP, ATP, HTGD, ATGD, DiffFormPts ด้วย MW หรือทำการเฉลี่ยค่าต่อเกมนั้นเอง แล้วทำการ save เป็นไฟล์ final_dataset.csv

เรียบร้อย ตอนนี้เราก็ได้ทำการแปลง Feature จากข้อมูลดิบ ให้เป็น Features ใหม่ที่สอดคล้องกับการทำนายผลที่เราต้องการ ต่อไปก็จะเป็นการสร้างโมเดลจาก Features ใหม่ในตอนหน้าครับ

ทายผล Premier League ด้วย Machine Learning (2)
code ที่ทำทั้งหมด

credit: Siraj Raval

--

--