เมื่อเกมมีมากมาย แต่เราไม่มีเวลาเล่นเกม T . T ( Game Recommendation )

Rafaelx
5 min readJun 21, 2022

เริ่มแรกเราจะมา ทำความรู้จักกับ recommendation system กันก่อน ถ้าตามที่เราเห็นทั่วๆ ไป ก็เป็นพวก เว็ปซื้อของออนไลน์ต่างๆ เช่น Ama…, Sho…, La…. หรือไม่ก็ พวกแพลตฟอร์มดูหนังออนไลน์ Net…. เมื่ออธิบายง่าย ก็คือ ระบบที่ช่วยแนะนำสินค้าให้เรานั่นเอง

วิธีการของ Recommendation system นั้นมีมากมาย แต่ที่เราจะเลือกมาใช้ในวันนี้ นั่นก็คือ Neural Network Embeddings ซึ่งมีชื่อเรียกมามาย ถ้าหากเจอชื่ออื่นที่มีวิธีเหมือนกัน มันก็คืออันเดียวกันเด้อ

แล้ว Neural Network Embeddings คืออะไร ???

Neural Network Embedding of all books on Wikipedia. (From Jupyter Notebook on GitHub).

An embedding is a mapping of a discrete — categorical — variable to a vector of continuous numbers. In the context of neural networks, embeddings are low-dimensional, learned continuous vector representations of discrete variables. Neural network embeddings are useful because they can reduce the dimensionality of categorical variables and meaningfully represent categories in the transformed space.

สรุปสั้นๆ ก็คือ การเอาชุดข้อมูลของเรามาพล็อตกราฟในรูปแบบโครงข่ายประสาทเทียม โดยสิ่งต่างๆ จะแทนเป็นค่าเว็กเตอร์ตำแหน่งนั้นๆ ทำให้เห็นว่า วัตถุต่างๆ ที่อยู่ตำแหน่งใกล้เคียงกัน มีความคล้ายคลึงกันอยู่

Neural Network Embeddings มีวัตถุประสงค์สำคัญ คือ

  1. หาคนที่มีความใกล้เคียงกันมากทีสุด เพื่อช่วยให้สามารถแนะนำให้สินค้าให้ลูกค้า ถูกใจมากที่สุด
  2. เพื่อทำให้เห็นความสัมพันธ์ระหว่างสิ่งต่างๆ

โอเครงั้น เรามาเริ่มกันเลยดีกว่า

Preparation

นี่คือ Library ที่ใช้ทั้งหมด

นี่ คือรูปแบบข้อมูลของเรา

Data Cleansing

หลังจากนั้น เราจะทำการ clean data เพื่อจัดการกับ outlier ต่างๆ ซึ่งเป็นสิ่งที่จำเป็นต่อโมเดลเรามากๆ มีคนเคยกล่าวไว้ว่า “ ทำโมเดลโดยไม่คลีนดาต้า ก็เหมือนกับยาม้าที่ไม่ผิดกำหมาย ” อ้าว งงๆ ไม่เกี่ยวไรเลย 55

จริงจังละ มันก็เหมือนกับ garbage in, garbage out เรานำข้อมูลขยะใส่ลงไปในโมเดล โมเดลก็เทรนจากขยะ ผลลัพธ์ที่ได้ คืออะไรเอ่ย ???

โดยเริ่มต้นเราจะสร้างตารางเก็บข้อมูล แยกเป็นแต่ละเกม เพื่อใช้ในการ เช็คค่าผิดปกติของแต่ละเกม ทำสเกลข้อมูล ฯลฯ

โดยเราจะมีขั้นตอน ดังนี้

  • Q3 + IQR ( Q3 — Q1) x 1.5 → Upper out
  1. ทำการเปลี่ยน ค่า Max ของข้อมูลเราที่มันเกินค่า Upper out เป็น Upper out แทน
  2. ทำการ Min-max Scaling คือ scaled value= ( value — mean ) / ( max -min )

( เลือกใช้ค่า max หลังจากเปลี่ยนแล้ว )

  1. ทำการ +ค่าที่น้อยที่สุดหลังสเกลของแต่ละเกม เข้าไปเพื่อทำให้ ค่า อยู่ระหว่าง 0–1
  2. ทำการลบข้อมูลคนที่เล่นเกม แล้วมีเวลาเป็น 0 ออก
  3. ทำการกรองโดย เกมต้องมีผู้เล่น อย่างน้อย 15 คน และ กรองต่อโดย ผู้เล่นแต่ละคนต้องเล่นเกม อย่างน้อย 10 เกม
  4. คูณ 10 เข้าไปเพื่อทำให้ สเกลเวลาอยู่ที่ 0–10

Data Visualization

อย่างแรกเรามาดู การกระจุกตัวของข้อมูลกันก่อน ฝั่งซ้าย จะเป็นรวมกลุ่มของผู้เล่นแล้วนำค่าเฉลี่ยมาพล็อตกราฟส่วนฝั่งขวาจะใช้เป็นการรวมกลุ่มของเกมแทน

ต่อมา มาลองดูเกมที่มีจำนวนคนเล่นเยอะที่สุด และ เกมที่มีเวลาเล่นมากที่สุด

Modeling

ทำการแบ่งข้อมุล train valid test set โดยมรขนาดดังนี้

  1. Test set มีค่า คือ 1 เกม ของแต่ละ user เดี๋ยวจะมาบอกอีกทีว่าทำไมแบ่งแบบนี้นะจ๊ะ

2. Train set มีค่า 90 เปอร์เซ็นต์ของ แต่ละ user

3. Valid set มีค่า 10 เปอร์เซ็นต์ของ แต่ละ user

นำ dataframe ที่รวม train กับ valid dataset ไว้

หลังจากนั้น ทำ Data Loader เพื่อน ใส่เข้าไปใน Neural network ของ Fast ai

Neural network embeddings

สร้างโมเดลสำหรับการเทรนด์ข้อมูล

ใช้ฟังก์ชั่นก์ เพื่อหาอัตราการเรียนรู้ที่ดีที่สุด

ทำการ train data

เช็คข้อมูลของโมเดล

Prediction

วิธีวัดผล เราใช้ เรียกว่า Top k accuracy

เราจะยกตัวอย่างดังรูป

จากที่เห็นก็คือ k ใน top k ก็คือจำนวนตัวที่ predict ออกมา ตัวอย่างกำหนด k = 3 แล้วนำเฉลย ใน test set มาเช็คดู ถ้ามี ก็จะได้ point = 1 หลังจากทำการ ทดสอบทั้งก็จะจัดการ ต่อโดย

Score = sum of points / n

โอเคร งั้น เรามาเริ่มกันต่อ โดยเราจะเริ่มจากการเก็บคำตอบกันก่อน ( Prediction )

  1. สร้าง dataframe รวมเกมที่ user ไม่เคยเล่น
  2. นำข้อมูลไป predict จากตัวโมเดล
  3. เก็บข้อมูล top 10 ( เราเลือกใช้ k = 10 ) ที่เวลาเล่นจาก predict เยอะที่สุด
  4. ทำให้ครบทุก user ใน test set

ถัดไป เราจะสร้าง baseline มาเพิ่มโดยมีดังนี้

  1. เกมที่มีคนเล่นมากสุด 10 อันดับแรก
  2. เกมที่มีเวลาเล่นเฉลี่ยมากที่สุด
  3. เกมที่มีเวลาเล่นมากที่สุด

ทำการ หาค่า Top 10 accuracy ของทุกอัน

หลังจากนั้นก็ทำ ตารางออกมา จะเห็นได้ว่า โมเดลเรา ทำนายออกมาถูกต้องน้อยกว่า baseline เกมที่มีคนเล่นมากที่สุด และ เกมที่มีเวลาเล่นมากที่สุด มันแสดงให้เห็นว่า เกมที่ฮิตเนี่ย มันฮิตจริงๆ สินะ

งั้นเรามาลองถ้าตัด test set ที่เป็นเกม top 10 ออก แล้ว เลือก baseline เป็น top 10 ของเกมที่มีคนเล่นมากสุดของชุดข้อมูลใหม่ดู ทำแบบนี้ ไปเรื่อยๆ แล้วลองดูว่า ผลจะเป็นยังไง โมเดลเรา จะสามารถเอาชนะได้หรือไม่

ซึ่งผลที่ออกมา ก็ยังคงแพ้อยู่ดีสินะ T . T งั้นแบบนี้ แสดงว่าโมเดลเรายังขาดอะไรที่สำคัญไป เวลาเล่นมันใช้ predict ไม่ได้งั้นหรอ ???

Summary

เราจะสรุปก่อนละกันนะ ว่าเราเริ่มตั้งแต่การ clean data โดยเราจัดการข้อมูลแยก เป็นเกมๆ ไป เพราะลองคิดดูว่า ถ้าเราบอกว่า เล่น online เกมหนึ่ง กับเพื่อนไป 10 ชั่วโมง กับเกมเนื้อเรื่อง ที่เราเล่นไป แค่ 5 ชั่วโมง แต่มันจบแล้วนะ แล้วมาบอกว่า เราเล่นเกม online มากกว่างั้นหรอ มันก็ไม่ได้สินะ เพราะฉะนั้น จึงต้องแยก ข้อมูลตามเกม แล้วสเกล เพื่อให้เทียบกันได้

เรื่องโมเดล Neural network embeddings นั้น ก็เป็นโมเดลที่นิยมใช้กัน อยู่แล้ว เราได้ลองปรับ tune ไปหลายครั้งแล้ว แต่ก็ได้ ค่า accuracy ตอนเทรนด์ ไม่ต่างกันเท่าไร

ฉะนั้น เรามาตั้งสมมติฐาน ว่าเหตุใดโมเดลของเรา นั้นแย่เพราะอะไร

1. อย่างแรกคงหนีไม่พ้น การขาด timestamp เวลาซื้อเกมของ user เพราะถ้าลองคิดดูว่า เราดันเอา เกมที่ซื้อล่าสุดไปเป็น train set นี่ก็คงรู้สึกแปลกๆ ใช่ไหมละ

2. Bias ของเวลา อันนี้ เราคิดได้ว่า บางที อาจจะ ทำนายจากเวลาที่ผู้เล่น เล่นเฉลี่ยโดยรวมได้หรือป่าวนะ ( แต่เป็นเวลาที่สเกลแล้วนะ ) เช่น บางคนอาจจะ ชอบเล่นเกมแบบเน้นจบที่ ประมาณ 80 เปอร์เซ็นไม่สนใจ side quest ต่างๆ ประมาณนี้ หรือเน้นเคลียร์ไว เป็นต้น โดยอาจจะเอา predict เป็นเกมที่เวลาเล่น ใกล้เคียงกับเวลาเฉลี่ยโดยรวมของผู้เล่นเอาแทน

3. หลังจาก ดูจำนวนเกมทั้งหมดของ predict มีอยู่เพียง 34 เกมเท่านั้น อาจจะมีการกระจุกตัวของข้อมูล

ถ้ามีคนที่อ่านมาถึงตรงนี้ก็ขอบคุณมากนะครับที่อ่านมาจนจบ ลาก่อนนะครับ

github = kyou7797/Game-Recommendation (github.com)

web app = Streamlit

--

--