BigQuery ML ทำนายความปังของโพสต์ง่าย ๆ ด้วย SQL Query

เมื่อคืนนี้ Google ได้เปิดตัวฟีเจอร์ใหม่ BigQuery ML ที่จะช่วยให้ Data Scientist/Analyst สามารถสร้างโมเดล Machine Learning บนข้อมูลขนาดใหญ่ใน Google BigQuery ได้ง่าย ๆ ผ่าน SQL query ใครที่ใช้ BigQuery วิเคราะห์ข้อมูลอยู่แล้วก็จะสามารถนำ Machine Learning เข้ามาใช้ทำความเข้าใจและหา Insights จากข้อมูลได้มากขึ้น นับเป็นอีกก้าวหนึ่งของ Google ที่พยายามจะช่วยให้ทุกคนเข้าถึงเทคโนโลยี AI ได้

ฟีเจอร์ตื่นเต้นขนาดนี้ วันนี้เลยขอโอกาสลองเล่นดูสักหน่อย ว่าใช้งานยากง่ายแค่ไหน และผลลัพธ์ที่ได้ออกมาเป็นอย่างไร เราจะใช้ข้อมูลโพสต์จาก Skooldio Facebook Page มาทำ Logistic regression ดูว่าปัจจัยอะไรที่มีความสัมพันธ์กับความปังของโพสต์ โดยนิยามของความ “ปัง” คือ ได้รับอย่างน้อย 50 reactions (ครับ เพจเล็กๆ 50 ก็ปังละครับ 555)

Fit a Model

การสร้างโมเดลก็สามารถทำได้ไม่อยาก เพียงแค่เรียก CREATE MODEL และกำหนด OPTIONS ระบุประเภทของโมเดล, Learning Rate, Regularization ฯลฯ​ ดูรายละเอียดเพิ่มเติมได้ที่นี่

ความสะดวกอย่างหนึ่งของการสร้างโมเดลผ่าน SQL Query คือ เราสามารถทำ Data Transformation ไปได้ด้วยในคำสั่งเดียวกัน อย่างในตัวอย่างนี้ เราได้มีการสร้าง Features ขึ้นมาหลาย ๆ อัน

  • จากข้อมูล created_time เราสร้างตัวแปร day กับ time สำหรับวันที่โพสต์ (อาทิตย์, จันทร์, อังคาร, …) และ เวลาที่โพสต์ (AM หรือ PM)
  • สำหรับโพสต์ที่มีลิงก์ เราสร้าง dummy variables เพื่อดูว่าเป็นลิงก์ไปที่ Medium (บทความ), Harvard Business Review, Skooldio (ขายของ!), Facebook (Shared Content), หรือ Youtube (วีดีโอ)
  • จากข้อความในโพสต์ message เราใช้ Regular Expression ในการหา Keyword เพื่อเดา (ขอย้ำว่าเดา!) ว่าเป็นโพสต์เกี่ยวกับ Data (ข้อมูล, Machine Learning, AI) หรือ Design (Design Thinking, UX/UI)

ลองดูโค้ดเต็ม ๆ กัน โดยในการเทรนโมเดล เราจะใช้ข้อมูลโพสต์ก่อนมิถุนายน 2018

พอรันโมเดลเสร็จ ก็จะมีสถิติจากการเทรนโมเดลออกมาให้เราดู

มาถึงขั้นตอนที่ทุกคนรอคอย ตกลงปัจจัยไหนบ้างที่ Predictive กับความปังของโพสต์ เราสามารถเรียกดู Coefficient ของแต่ละตัวแปรได้ง่ายมาก SELECT * FROM skooldio.popularity แค่นี้!

โพสต์ที่เป็น Link ดูเหมือนจะปังน้อยที่สุด (ติดลบเยอะสุด) ในขณะที่โพสต์ที่เป็น Status ดูเหมือนจะปังมากที่สุด เนื่องจาก weight เป็นบวกอยู่อันเดียว แต่จริง ๆ แล้วเป็น Estimate ที่เชื่อถือไม่ค่อยได้เท่าไหร่ เพราะที่ผ่านมาโพสต์ที่เป็น Status Update ในเพจมีเพียงแค่ 2 โพสต์เท่านั้น 😅 ในส่วนของ promotion_status จะเห็นได้ว่าโพสต์ที่มีสถานะเป็น Extendable นั้น มีค่า weight ที่สูงมาก เนื่องจากเป็นสถานะที่บ่งบอกว่า เราเคย boost โพสต์นี้ไปแล้ว เลยได้ reactions มาเยอะ

ตัวแปร created_time มี weight เป็นบวก ซึ่งแปลว่าโพสต์ยิ่งใหม่เท่าไหร่ (created_time มีค่ามาก) ยิ่งมีโอกาสได้รับ reactions มากขึ้นเท่านั้น ซึ่งเป็นตามที่คาดไว้ เพราะเพจมีคนมา follow มากขึ้นเรื่อย ๆ ทำให้โพสต์ใหม่ ๆ ได้ reach ที่สูงขึ้น นอกจากนี้โพสต์วันเสาร์ (day 7) – อาทิตย์ (day 1) และโพสต์ในช่วงเช้า (AM) มักจะปังกว่า

ในส่วนของลิงก์ โพสต์บทความ Medium ดูปังพอสมควร ทุกคนดูจะชอบ Original Content (เลยต้องรีบมานั่งเขียน blog เลย 😂) ในขณะที่โพสต์ลิงก์ไปเว็บไซต์ Skooldio ก็ค่อนข้างปัง หลัก ๆ เพราะเป็นโพสต์แนะนำคอร์สฟรีไปซะเยอะ

สุดท้ายโพสต์ที่เกี่ยวกับ Data และ Design ซึ่งเป็นสองศาสตร์ที่ Skooldio ค่อนข้างให้ความสำคัญ ก็ได้ค่า weight เป็นบวกกันทั้งคู่ น่าจะเป็นเพราะเป็นหัวข้อที่ลูกเพจของเราส่วนใหญ่ให้ความสนใจ

Evaluate the Model

การทำ Evaluation ก็ง่ายนิดเดียว เพียงแค่เรียกคำสั่ง ML.EVALUATE และระบุชื่อโมเดล พร้อมทั้งข้อมูลที่อยากใช้ในการทดสอบ ซึ่งในที่นี่ เราใช้ข้อมูลโพสต์ตั้งแต่มิถุนายน 2018

สถิติที่รายงานออกมาก็มีครบเลย ตั้งแต่ Precision/Recall ไปจนถึง F1 Score และ AUC สำหรับโมเดลลวก ๆ ของเรา ก็พอถูไถอยู่ 🤓

Make Predictions

สุดท้าย ถ้าเราอยากจะทำนายค่าสำหรับข้อมูลใหม่ เราก็สามารถใช้คำสั่ง ML.PREDICT ในการทำนายค่าได้เลย

สำหรับ Logistic regression ผลลัพธ์ก็จะแสดงทั้ง Predicted Label และ Predicted Probability ของแต่ละคลาส

ใครที่สนใจอยากไปลองเล่นด้วยตนเอง สามารถทำตาม tutorial นี้ได้เลย!