ถ้าผมเป็นนักฟุตบอล ผมจะมีมูลค่าเท่าไร? (Machine Learning กับเกม FIFA 19)
ลองเล่น Machine Learning เบื้องต้นแบบขำ ๆ
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —
ผมเองศึกษา machine learning มาได้สักพักแล้ว และนี่จะเป็นบทความแรกที่ผมจะเขียนถึง machine learning ครับ ขอเริ่มที่ basic ที่สุดก่อนเลย โดยผมจะใช้ Linear Regression มา predict ว่า…
ถ้าผมเป็นนักฟุตบอล ตัวผมจะมีมูลค่าเท่าไร?
อธิบายสั้น ๆก่อนว่า Linear Regression คือ
การ predict ข้อมูลแบบ continuous โดยเป็นการหาความสัมพันธ์ของตัวแปร 2 ตัว
- Predictor (X) ← มีหลายตัวก็ได้ เรียกว่า Multiple Linear Regression
- Response (y)
ผมได้เตรียม dataset เอาไว้แล้ว เป็นฐานข้อมูลจากเกม FIFA 19 ครับ แต่ผมจะเลือกนักเตะจากทีมเหล่านี้ FC Barcelona, Real Madrid, Atletico Madrid, Manchester City, Manchester United, Chelsea, Liverpool, Arsenal, Bayern Munich, Juventus, Paris Saint-Germain โดยมีอายุตั้งแต่ 18 ปีขึ้นไป และมีค่าพลัง 80 เป็นอย่างน้อย
เอ้า…clean data ก่อน เริ่มที่แปลง Value จาก string → float
def convert_value(x):
if 'M' in x:
x = x.replace('€', '').replace('M', '')
return float(x)
elif 'K' in x:
x = x.replace('€', '').replace('K', '')
return float(x) / 1000
แล้วก็เปลี่ยนชื่อ column นิดหน่อย ประมาณนี้…จริง ๆ มีทั้งหมด 187 คน
แต่ค่าที่ผมจะนำมาใช้เพื่อ predict แล้วจริง ๆ จะมีแค่นี้
- Age (อายุ), Skill (ความสามารถ) → X (Predictor)
- Value (มูลค่า [ล้านปอนด์]) → y (Response)
สังเกตว่า Predictor มีมากกว่าหนึ่งตัว แสดงว่าเป็น Multiple Linear Regression ครับ เดี๋ยวผมลอง plot ความสัมพันธ์ของค่าทั้ง 3 นี้ออกมาดูก่อน
ลองฝึก Data Analysis เล่น ๆ ดูซิ
จากกราฟ 1 เราจะเห็นว่า Skill (ความสามารถ) มีผลอย่างมากต่อ Value (มูลค่า) ครับ ความสัมพันธ์ของ X และ y ใกล้เคียงเส้นตรงพอสมควร
ต่อมากราฟที่ 2 นั้นบอกเราว่า Age (อายุ) มีผลต่อ Value (มูลค่า) ไม่มากเท่าไร เพราะข้อมูลกระจัดกระจายมาก แต่เส้น Regression Line ก็พอจะบอกได้ว่ายิ่งอายุเยอะขึ้น ก็มีแนวโน้มที่มูลค่าจะลดลงครับ
สังเกตว่านักเตะช่วงอายุ 25–32 ปีจะมี Value สูงที่สุด
โอเค ผมเริ่มสร้าง model และ train ข้อมูลจาก dataset ทั้ง 187 คนลงไปครับ ผมได้ model score (R-squared) ถึง 0.8647998536864613 เลย ถือว่าเยี่ยมทีเดียว
เขียน Python เพื่อยัด test data ลงไปใน model ตอนดู result จะได้เห็นชัด ๆ
test_players = [
{'name': 'Nopnithi', 'age': 27, 'skills': 85},
{'name': 'Messi Clone', 'age': 31, 'skills': 94},
{'name': 'Player1', 'age': 25, 'skills': 80},
{'name': 'Player2', 'age': 31, 'skills': 91},
{'name': 'Player3', 'age': 18, 'skills': 70}
]
predict_data = []
for player in test_players:
predict_data.append([player['age'], player['rating']])results = model.predict(predict_data)
for res in enumerate(results):
i = res[0]
predicted_wage = str(int(res[1])) + 'M'
print(f'{i + 1}. {test_players[i]["name"]}\t'
f'Age {test_players[i]["age"]}\t'
f'Skill {test_players[i]["skill"]}\t'
f'Predicted Value {predicted_wage}')
สมมุติว่าผมมี Skill ที่ 85 แต้มนะครับ (เก่งสัด ๆ) และนี่คือผลการ predict ครับ
1. Nopnithi Age 27 Skills 85 Predict Value 39M
2. Messi Clone Age 31 Skills 94 Predict Value 86M
3. Player1 Age 25 Skills 80 Predict Value 12M
4. Player2 Age 31 Skills 91 Predict Value 67M
5. Player3 Age 18 Skills 70 Predict Value -33M
จาก dataset ของเรา predict ออกมาได้ว่า ผมมี Value (มูลค่า) ในตลาดอยู่ที่ 39 ล้านปอนด์ ครับ
ส่วนไอ้ตัวโคลนนิ่งของ Messi ปรากฎว่าได้ 86 ล้านปอนด์ ซึ่งน้อยกว่าข้อมูลจริงที่ 110.5 ล้านปอนด์ครับ
ทำไมหว่า? ก็เพราะ Value (มูลค่า) ของนักเตะช่วงบนของ dataframe เราฉีกจากช่วงล่างพอสมควร นักเตะ Value (มูลค่า) มากกว่า 50 ล้านปอนด์ขึ้นไปมีน้อยครับ นั่นแปลว่าจริง ๆ แล้ว Value (มูลค่า) ของนักเตะไม่ได้มีที่มาแค่ Age (อายุ) และ Skill (ความสามารถ) แค่นั้นครับ
ลองดู head กับ tail ใน dataframe ที่ใช้ train ครับ
ส่วนอีตา Player3 นั่นหลุดวงโคจรไปเลย เพราะ train data เราเริ่มที่อายุ 18 ขึ้นไป ค่าพลัง 80+ ซึ่งพวกนี้ก็มี Value (มูลค่า) อยู่แค่ 5–10 ล้านปอนด์แล้ว
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —