สรุปคอร์ส : Apply Machine Learning to your Data with GCP จาก Coursera
สวัสดีทุกๆ คนครับ วันนี้เราจะมาต่อกันกับคอร์สที่ชื่อว่า Apply Machine Learning to your Data with GCP ซึ่งนับว่าเป็นคอร์สที่ 4 จากทั้งหมด 4 คอร์ส จาก From Data to Insights with Google Cloud Platform Specialization และเหมือนเช่นเคย เพื่อนๆ ยังสามารถย้อนกลับไปอ่านบทความที่แอดได้เขียนไว้ตั้งแต่คอร์สแรกตามลิงค์ด้านล่าง
- Course 1 : Exploring and Preparing your Data with BigQuery
- Course 2 : Creating New BigQuery Datasets and Visualizing Insights
- Course 3 : Achieving Advanced Insights with BigQuery
โดยคอร์สนี้เป็นคอร์สสุดท้ายของ Specialization Track เนื้อหาโดยรวมจะเป็นการ Intro เรื่อง Machine Learning และการใช้งานบน Google Cloud Platform รวมถึงการเขียน SQL เพื่อสร้าง ML Models ง่ายๆ กันอีกด้วย ลุยกันเลย !
Modules 16: Introduction to Machine Learning
Machine Learning
Machine Learning คือ สาขาวิชาแขนงหนึ่งที่เป็น Sub set ของ AI หรือ Artificial Intelligence ส่วนคำว่า AI นั้น มีขึ้นครั้งแรกในปี ค.ศ. 1956 จากนั้น Machine Learning และ Deep Learning ก็เกิดขึ้นมาตามลำดับ ด้วยเทคโนโลยีที่พัฒนาขึ้นตามยุคสมัย ตามภาพด้านล่าง

Machine Learning, Natural Language Processing (NLP), Computer Vision ล้วนแล้วแต่เป็นส่วนหนึ่งของ AI ส่วน AI ที่หลายคนคิดว่าจะเข้ามายึดครองโลกแบบในหนังเรื่อง Terminator จริงๆ แล้วมันเป็นอีกแขนงหนึ่งชื่อว่า Human-Like Intelligence (HLI)
Deep Learning ก็เป็นอีกคำที่คนเริ่มคุ้นหูมากขึ้นเรื่อยๆ ซึ่งเป็น Subset อีกทีนึงของ Machine Learning ทำงานด้วยการประมวลผลเลียนแบบมนุษย์ให้ได้มากที่สุดและใช้ทำงานกับงานที่ซับซ้อน เช่น Image Recognition (ตรวจจับใบหน้าคน), Speech recognition (ตรวจจับเสียง), Translation (แปลภาษา)
ML อธิบายได้โดยใช้แค่ประโยคเดียว -> ML and its core labels things for you. แปลเป็นไทย คือ ML เป็นสิ่งที่บอกเราได้ว่าแต่ละสิ่งคืออะไร เช่น สร้าง Model จากข้อมูลประวัติการขายและทำนายผลยอดขายได้ในเดือนถัดไป, สร้าง Model จากรูปรถยนต์จำนวนมาก หากมีข้อมูลมากพอ Model จะจำแนกประเภทของรถยนต์ได้เลยทีเดียว
การคิดคำนวนเพื่อสร้าง Model ไม่ได้ยึดตามหลัก Rule-Based หรือ IF THEN แต่จะเป็นการเรียนรู้ผ่าน Pattern ของข้อมูลทั้งหมดที่เคยเจอ เพื่อลดปัญหาการเขียนสูตร Rule-Based ที่จะเพิ่มขึ้นไปเรื่อยๆ ตามจำนวนข้อมูลและเงื่อนไขที่มี
Recap : Machine Learning สร้าง Model โดยการสอนคอมพิวเตอร์ให้เรียนรู้ผ่าน Train Dataset และวัดผล Model โดยใช้ Test Dataset เป็นสิ่งที่คอมพิวเตตอร์ยังไม่เคยเห็น เพื่อจะบอกได้ว่า Model นั้นแม่นยำพอหรือไม่
เนื้อหาส่วนนี้แอดว่ามันคล้ายกับอีกคอร์สที่แอดได้ทำสรุปไว้แล้ว ลองเข้าไปอ่านเพิ่มเติมเกี่ยวกับ Machine Learning ได้ ที่นี่
ลองดูตัวอย่าง จากรูปภาพนี้ จะเห็นการ classify รูปภาพว่าเป็นหมาหรือแมว เราไม่ได้สอน Model ว่าให้ต้องตามหาหูสองข้าง หรือขาสองข้าง หรือหนวดแมว แต่คอมพิวเตอร์จะทำการสร้างวิธีการของตัวเอง เพื่อจะทายให้ถูกว่ามันเป็นแมวหรือหมา สิ่งนี้เราเรียกว่า Deep Learning

รูปเจ้าหมาที่เราเห็น มันไม่ใช่รูปปกติของหมาน้อยทั่วไป แต่เป็นรูปภาพที่ค่อนข้างยากมากๆ ดังนั้น Model ML ปัจจุบันจึงต้องมีความ Scale up ด้วยการเรียนรู้จากข้อมูลตัวอย่างจำนวนมาก เพื่อปรับ Algorithms ของ Model เองด้วย
ประโยชน์ของ ML ในด้าน Digital Marketing
Predict Lifetime Value (LTV) of a Customers

จากยอดขายทางด้าน E-commerce เราสามารถส่งข้อมูลที่เป็นประโยชน์ใน Field ต่างๆ ให้กับ Model ได้ เช่น วันที่ users เข้ามายัง website ของเรา, จำนวน Pageview ทั้งหมดที่มาจากคนๆ นั้น (Pageview คือ ทุกครั้งที่หน้า website นั้นถูก Load) , จำนวนครั้งที่เค้าเข้ามา, เวลาเฉลี่ยที่เค้าเข้ามาเล่นใน website, ยอดเงินทั้งหมดที่เคยซื้อ รวมถึง ข้อมูล Transaction ด้วย

หลังจากนั้นเมื่อเราส่งข้อมูลชุดนี้ให้ Model เพื่อทำการเรียนรู้และสร้าง Model ที่มีประสิทธิภาพขึ้น จะทำให้เราแบ่งแยกได้ว่าลูกค้ากลุ่มไหนมี Value สูง และ Value ต่ำ เพื่อนำไปจัดโปรโมชั่นให้เข้ากับลูกค้าแต่ละคน
Machine Learning Terms
Instance (or observation)
Instance (or observation) คือ Record ในแต่ละแถวของข้อมูล จากในรูปจะเห็นว่ามี 8 Instances

Label
Label คือ คำตอบที่ถูกต้อง พูดอีกแบบก็คือ เฉลยที่เราใช้ทำการวัดผล Model ที่เราสร้างขึ้นผ่านการ Train ด้วยข้อมูลที่มีอยู่ เพื่อใช้ทำนายผล Model ของข้อมูลในอนาคต จากรูปตัวอย่างจะเห็นว่า Label คือ LTV (Life time value) Revenue หรือ รายได้ทั้งหมดที่ได้จาก users แต่ละคน เป็นตัวเลขที่เราต้องการจะทำนายในอนาคต

Label ยังเป็นข้อมูลแบบ Binary ได้ด้วย เช่น จำแนกข้อมูลว่า users คนไหน เป็น High Value Customer หรือไม่ได้เป็น ตามตัวอย่างด้านล่าง

Features
Features คือ คอลัมน์อื่นๆ ทั้งหมด นอกจาก Label เป็นชุดข้อมูลที่ใช้ในการทำ Feature Engineering ซึ่งเป็นขั้นตอนการสำรวจ, ทำความสะอาด และจัดเตรียมข้อมูล ก่อนที่จะนำมาเป็น input ที่ใช้สำหรับการ Train ML Model และถือว่าเป็นส่วนที่ยากที่สุดในการสร้าง Model เลยทีเดียว

ข้อมูลที่ไม่มี Label
เมื่อเราเจอข้อมูลที่ไม่มี Label ถูกนำเข้ามาใหม่ แบบภาพตัวอย่างด้านล่าง เราก็สามารถนำ Model ที่ Train ข้อมูลที่เรามี Label อยู่แล้ว มาใช้ Predict Label ของข้อมูลใหม่ได้

เพื่อจำแนกหรือ Classify ได้ว่า users แต่ละคนจะถูกจัดอยู่ใน High Value Customer หรือไม่ นั่นเอง

เลือก Model ตามวัตถุประสงค์
แอดจะยกตัวอย่างแค่ Regression Model ง่ายๆ
Objective | Model to used |
---|---|
ตัวเลข (รายได้, ราคาบ้าน) | Linear Regression |
จำแนกประเภทข้อมูล (ประเภทลูกค้า) | Logistic Regression |
จริงๆ แล้วยังมี Model อีกเยอะเลย เช่น Decision Trees, Neuron Networks and etc. แต่สุดท้ายผลลัพธ์ปลายทางของทุก Model คือ การทำนายผลข้อมูลที่ยังไม่เคยเห็น
Modules 17: Creating ML Models in BigQuery
Feature Selection
คอลัมน์ที่เราจะเลือกมาเป็น Features ที่ดีควรมีลักษณะดังต่อไปนี้
1. เกี่ยวข้องกับจุดประสงค์หลัก
ลองดูตัวอย่างภาพด้านล่าง เราจะใช้อะไรมาเป็น Feature ในการจำแนกม้า 1) สายพันธุ์ 2) อายุ 3) สีของดวงตา

แอบยากเหมือนกันเนอะ เพราะว่ามันขึ้นอยู่กับว่าเรามีจุดประสงค์อะไร เช่น หากจุดประสงค์ของเรา คือ การหาว่า Features ไหนบ้างที่จะบ่งบอกว่าม้าแต่ละตัวเป็นม้าแข่งที่ดี เราก็จะเลือก Features เป็น 1) สายพันธุ์ 2) อายุ แล้วสีดวงตาของม้า มีผลกับการแข่งขันไหม ? ถ้าปกติแล้วม้าแข่งส่วนใหญ่จะมีสีดวงตาที่ต่างออกไป ดังนั้น 3) สีของดวงตา ก็จะกลายเป็นหนึ่งใน Feature ด้วยเช่นกัน
Point ก็คือ เราไม่สามารถเลือก Features จากคอลัมน์ทั้งหมดและบอกว่าอันไหนเป็น Feature ที่ดีหรือไม่ดี ขึ้นอยู่กับสิ่งที่เราจะสร้าง Model หรือ จุดประสงค์ของ Model
2. เป็นตัวเลขที่มีความหมายในตัวมันเอง
ML Model คือ การบวก การคูณ และการถ่วงน้ำหนัก (weighing) ให้กับ Machines เมื่อเรา Train Model มันก็จะใช้การคำนวนทางคณิตศาสตร์ ใช้ฟังก์ชั่นต่างๆ เช่น ตรีโกณมิติ และ Algebra จะทำงานอยู่เบื้องหลัง ดังนั้น input ต้องเป็นตัวเลข แต่ก็นั่นแหละมันควรจะมีความหมาย เช่น 2 มีค่าเป็นสองเท่าของ 1
สมมุติวันนี้เราจะมาทำนาย จำนวน users ทั้งหมดที่จะใช้คูปองลดราคา PROMOCODE1234 เราก็ต้องดู Features ต่างๆ ที่เกี่ยวกับคูปองนี้
- คูปองนี้ลดราคากี่ % : 10%, 20% -> เป็นตัวเลข -> มีความหมายต่างกันชัดเจน คำนวนได้ทันที
- ขนาดของคูปอง : เป็นสี่เหลี่ยมขนาด 24*24 ซม., 48*48 ซม. -> เป็นตัวเลข -> แน่นอนมันมีความหมายว่าใหญ่กว่าย่อมเห็นง่าย แต่จริงๆ แล้วมันมีความหมายจริงๆ หรือเปล่า ?
ถ้ามองในมุมของ Banner Ads ขนาดมีผลในแน่นอน แต่ถ้าเป็นคูปองกระดาษ อันนี้ต้องมาดูกัน หากเราแบ่งขนาดของคูปองเป็น Small, Medium, Large ถึงแม้ว่าจะไม่ใช่ตัวเลข แต่เราก็สามารถเอาตัว Categorical variables เข้าไปเป็น input ใน Model ได้เหมือนกัน
3. Font ที่ใช้ : Arial, Roboto, Times New Roman -> ไม่เป็นตัวเลข -> แต่เรา convert ให้เป็นตัวเลขได้ เช่น Arial = 1, Roboto = 2, Times New Roman = 3 แต่มันก็จะกลายเป็นแค่ตัวเลขที่ใช้แทน มันไม่ได้มีความหมายว่า 2 มีค่าเป็นสองเท่าของ 1 หรือ 2 ดีกว่า 1
4. สีคูปอง : น้ำเงิน, แดง, ดำ -> ไม่เป็นตัวเลข -> ไม่มีความหมายเชิงตัวเลขเลย
เราจะทำยังไงกับข้อมูลที่เป็น Categorical
สมมุติว่าเรามีชุดคำ ในระบบขออง NLP สิ่งที่เราจะทำกับมันคือเปลี่ยนให้เป็นตัวเลข ต้องรัน Word2vec มันจะเอาชุดคำทั้งหมดและเปลี่ยนให้กลายเป็นตัวเลขที่เรียกว่า numerical vectors ทำให้มันมีความหมาย

และเราก็จับคำมาคำนวนกันได้ เช่น Man – Woman หรือ King – Queen การเปลี่ยนจากคำเป็น vector ก็อาจจะยุ่งยากซักหน่อย อ่านเพิ่มเติมได้ ที่นี่
3. มีตัวอย่างที่เพียงพอ
ในแต่ละ Features ควรมีอย่างน้อย 5 แถวที่มีค่า Features แต่ละอันอยู่ เพื่อจะได้นำไป Train Model ได้ดีขึ้น กลับไปที่ตัวอย่าง PROMOCODE123 ถ้าเรามี users ที่ใช้คูปองที่ลดราคา 10% อยู่เยอะมากๆ และมี users แค่ไม่กี่คนที่มีคูปองลด 80% มันก็จะไม่มีตัวอย่างข้อมูลเพียงพอสำหรับคูปองลด 80% เราต้องพยายามทำให้ข้อมูลมันไม่มี Bias เพื่อจะได้ Train Model ได้แม่นยำมากขึ้น
Split your Dataset
แอดจะข้ามเรื่องการ Clean data ไปเลยแล้วกันเพื่อไม่ให้บทความยาวจนเกินไป หลังจากเรา Clean data เรียบร้อยแล้ว มาถึงการแบ่งส่วนข้อมูลเพื่อใช้ในการ Training และ Validation เราจะแบ่งส่วน Training เป็น 70% – 80% ของข้อมูลทั้งหมด และ 20% – 30% เป็น Validation

การ Validation สำคัญอย่างไร ?
Validation จะบอกเราว่าเมื่อไหร่ที่ Model ควรจะหยุด Train ในระหว่างการ Training ข้อมูล Model พยายามที่จะวัดผล Model ผ่านความสัมพันธ์กันของ Features คอลัมน์ต่างๆ ที่เราเลือกมาโดยดูจากผลลัพธ์ที่ทำนายเทียบกับเฉลยที่มีอยู่แล้ว หรือ Label นั่นเอง บางครั้ง Model ก็ทำนายได้แม๊นแม่น เรียกได้ว่าแม่นกว่าหมอลักษณ์และหมอช้างอีก หาก Model มีการ Training มากเกินไป
ตัวอย่างเช่น หลังจาก Model ผ่านการ Training อย่างหนักหน่วง จนเรียนรู้ว่าถ้าลูกค้าเข้ามาใน website ในวันศุกร์ และมีอย่างน้อย 3 Pageviews และมีสินค้า 2 ชิ้นใน Cart Model ทำนายได้ว่า ลูกค้าจะกลับมาอีกรอบในวันจันทร์ และจ่ายเงินสินค้าสักชิ้นที่เคยอยู่ใน Cart และปล่อยสินค้าอีกชิ้นไว้
มองเผินๆ เหมือนกับว่าเป็น Insights ที่โคตรเท่ ยังกับเห็นอนาคต มันค่อนข้างยากมากที่จะเอามา apply ใช้ได้กับลูกค้าทั้งหมด แต่ที่ Model ออกมาเป็นแบบนี้เนื่องจากเกิดการ Overfit นั่นเอง เพราะ Model เห้นข้อมูล Train ซะจนมันจำได้ทุกอย่างแล้ว

แล้วการ Retraining ให้ Model จะโอเคมั้ย ถ้า Model เห็นข้อมูล Test และ Validation ไปแล้ว จริงๆ เราปรับจูน (Tune) Model ได้อีก เรียกว่า Hyperparameters และ Train Model นั้นใหม่อีกรอบด้วย Validation Dataset นั่นหมายความว่า หากผลของ Model ออกมายังไม่ดีพอ ให้เราปรับจูนและ Test ผ่านข้อมูลก้อนที่เป็น Validation Data

เราจะเทส Performance ของ Model ที่ผ่านการ Tune และ Validate จนโอเคแล้ว ผ่าน Testing Dataset ถ้าหากเรา Split ก้อนที่เป็น Testing Data มาแล้ว มันจะต้องเป็นข้อมูลที่ยังไม่เคยถูกเห็นใน Training หรือ Validation เพื่อให้ได้ผลลัพธ์ที่ไม่ Bias
Machine Learning using SQL in BigQuery
มาถึง Section ที่น่าสนใจกันแล้วทุกคน หลายคนอาจจะยังไม่รู้ว่าเราสามารถสร้าง ML Model ได้ด้วยการใช้ SQL นี่แหละ หลังจากเรารู้จัก BigQuery กันไปแล้วตั้ง 3 บทความ Data Analyst และ Data Scientist สามารถทำอะไรกันได้ใน BigQuery บ้างน้า
- ใช้ SQL สร้าง Machine Learning Model
- Train Model ผ่าน BigQuery
- ไม่ต้องกังวลเกี่ยวกับ Hypertuning หรือ Feature transformations
มาดู Diagram ง่ายๆ เริ่มจากการใช้ Dataset ของ Google Analytics 360 เพื่อใช้ทำ ML บน BigQuery จากนั้นก็นำผลที่ได้ออกไปที่ BI Platform เช่น Data Studio หรือ เชื่อมต่อกับระบบ Ads ต่างๆ

Support Features
- StandardSQL และ User Defined Function ภายใต้ ML queries
- Linear Regressing (Forcasting)
- Binary Logistic Regression (Classification)
- Model evaluation (Standard metrics, ROC Curve)
- Model weight inspection
- Feature distribution analysis
อย่างที่บอก เอาผลที่ได้จาก Model ไปเข้า Data Studio ได้ด้วย

The End-to-End BQML Process
- ETL into BigQuery
- Preprocess Features
- Create and Train Model
- Evaluate Model (มีทั้ง RMSE และ Confusion Matrix)
- Test Model

Build Linear Regression Model
แอดจะพาทุกคนมาสร้าง Regression Model ใน BigQuery ด้วย Public dataset เช่นเคย โดยเราจะใช้ Dataset ชื่อว่า new_york_taxi_trips และ Table ชื่อ tlc_yellow_trips_2018

Objective : Predicting Taxi Cab Fare
เราจะสร้าง Model เพื่อทำนายค่าโดยสารของ Taxi คอลัมน์ชื่อ fare_amount

Features Selection and Preprocessing
แอดจะเลือกคอลัมน์ที่ใช้จากคำอธิบายที่อยู่ใน Description
- tolls_amount : ค่าทางด่วน
- fare_amount : ค่าโดยสาร
- pickup_datetime : วันและเวลาที่รับ
- trip_distance : ระยะทาง
- passenger_count : จำนวนผู้โดยสาร

ทีนี้แอดจะเตรียมข้อมูลด้วย SQL คร่าวๆ แบบนี้
SELECT
tolls_amount + fare_amount AS total_fare, #หาค่าโดยสารรวมทั้งหมด
EXTRACT(DAYOFWEEK FROM pickup_datetime) AS dayofweek, #เอาวันออกมาเป็นตัวเลข 1-7
EXTRACT(HOUR FROM pickup_datetime) AS hourofday, #เอาชั่วโมงออกมาเป็นตัวเลข 0-24
trip_distance AS distance, #ระยะทาง
passenger_count AS passengers #จำนวนผู้โดยสาร
FROM bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2018
WHERE trip_distance > 0 AND fare_amount > 0 #ระยะทางและค่าโดยสารมากกว่า 0
และนี่คือผลจากการ Features Selection and Preprocessing

Split data, Build and Training Model
CREATE OR REPLACE MODEL Test_create_dataset.taxifare_model
OPTIONS
(MODEL_TYPE='LINEAR_REG', #เลือกใช้ Linear Regression
labels=['total_fare'], #เลือกคอลัมน์ที่เป็น Label
MAX_ITERATIONS=5,
DATA_SPLIT_METHOD='AUTO_SPLIT') #เลือกวิธีการ Split Data (10,000 record ถูกแบ่งเป็น Evaluation)
AS
SELECT
(tolls_amount + fare_amount) AS total_fare,
EXTRACT(DAYOFWEEK FROM pickup_datetime) AS dayofweek,
EXTRACT(HOUR FROM pickup_datetime) AS hourofday,
trip_distance AS distance,
passenger_count AS passengers
FROM bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2018
WHERE trip_distance > 0 AND fare_amount > 0
จากนั้นรอเวลาจนกว่าจะ Train Model เสร็จ

Evaluate Model
SELECT
SQRT(mean_squared_error) AS RMSE
FROM ML.EVALUATE(MODEL Test_create_dataset.taxifare_model
)

Root Mean Square Error = 11.7 หมายถึง Model เราทำนายราคาค่าโดยสาร คลาดเคลื่อนโดยเฉลี่ย 11.7 เหรียญ
Build Classification Model
Predicting User Return Purchases with BigQuery
แอดจะเอา Lab ของ Classification Model มาสรุปให้ดูกันแบบไวๆ
Objective คือ ทำนายว่าคนไหนจะกลับมาซื้อของบน website
ก่อนอื่นเราต้องเข้าใจก่อนว่าเราจะ Evaluate Classification Model อย่างไร
True Positive Rate : โมเดลทำนายว่าเค้าจะกลับมา และเค้ากลับมาจริงๆ
False Positive Rate : โมเดลทำนายว่าเค้าจะกลับมา แต่ในความเป็นจริงเค้าไม่กลับมา
โมเดลควรจะมีค่า TP Rate สูง และ FP Rate ต่ำ วิธีที่มักใช้ในการแสดงผลความสัมพันธ์นี้ เรียกว่า ROC Curve
ROC Curve
ROC Curve คือ กราฟที่แสดง Performance ของ Classification Model ในทุกๆ Classification Thresholds จากกราฟข้างล่างเราจะเห็น Parameter 2 ตัวที่อยู่ในแกน Y (TP Rate), และแกน X (FP Rate) ลองดูตัวอย่างของ ROC Curve ที่ดีและแย่กัน

เส้นที่ดีที่สุดในกราฟด้านบน คือ เส้นสีเหลือง เพราะค่า TP Rate สูงมาก และ FP Rate ต่ำมาก
เส้นสีม่วงอยู่ในเกณฑ์ปานกลาง เพราะค่า TP Rate ไม่ได้สูงมาก และค่า FP Rate ก็ไม่ได้ต่ำมาก
เส้นสีน้ำเงินค่อนข้างแย่ เพราะยิ่งมีค่า TP Rate สูง FP Rate ก็ดันสูงตามเข้าไปอีก
AUC
AUC (Area Underneath the curve) คือ เกณฑ์ที่ช่วยประเมินว่าโมเดลออกมาดีหรือไม่ดี โดยจะมีค่าตั้งแต่ 0.0 ถึง 1.0
- 0.9 – 1.0 = Excellent (A)
- 0.8 – 0.9 = Good (B)
- 0.7 – 0.8 = Fair (C)
- 0.6 – 0.7 = Poor (D)
- 0.5 – 0.6 = Fail (F)
โดยปกติแล้วถ้าต่ำกว่า 0.7 ก็จะไม่ค่อยโอเคแล้ว
Dataset ที่ใช้มาจาก https://console.cloud.google.com/bigquery?p=data-to-insights&page=ecommerce

ลอง Query เพื่อหา Top 5 สินค้าขายดี
SELECT
p.v2ProductName,
p.v2ProductCategory,
SUM(p.productQuantity) AS units_sold,
ROUND(SUM(p.localProductRevenue/1000000),2) AS revenue
FROM data-to-insights.ecommerce.web_analytics
,
UNNEST(hits) AS h,
UNNEST(h.product) AS p
GROUP BY 1, 2
ORDER BY revenue DESC
LIMIT 5;

ลอง Query หาจำนวนคนที่ซื้อหลังจากกลับเข้ามาใน website ภายหลัง
WITH all_visitor_stats AS (
SELECT
fullvisitorid, # 741,721 unique visitors
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM data-to-insights.ecommerce.web_analytics
GROUP BY fullvisitorid
)
SELECT
COUNT(DISTINCT fullvisitorid) AS total_visitors,
will_buy_on_return_visit
FROM all_visitor_stats
GROUP BY will_buy_on_return_visit

Features Selection and Preprocessing
เราจะเลือกแค่ 2 คอลัมน์มาเป็น Features และ 1 Lable นั่นคือ
- Users มีการ Bounces หรือไม่ (Bounce คือ เข้ามาแล้วไม่ทำอะไรเลย แล้วกดออกจาก website ไป) ถ้าใช่ มีค่าเป็น 1 ถ้าไม่ใช่ มีค่าเป็น 0
- Time on site คือ เวลาที่เค้าอยู่บน website
Label คือ Will buy on return visit เพื่อบอกว่า users กลับมาซื้อภายหลังหรือไม่ ถ้าซื้อเป็น 1 ถ้าไม่ใช่มีค่าเป็น 0
SELECT
EXCEPT(fullVisitorId)
FROM
#features
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
data-to-insights.ecommerce.web_analytics
WHERE
totals.newVisits = 1)
JOIN
(SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM
data-to-insights.ecommerce.web_analytics
GROUP BY fullvisitorid)
USING (fullVisitorId)
ORDER BY time_on_site DESC
LIMIT 10;

Build and Training Classification Model
CREATE OR REPLACE MODEL ecommerce.classification_model
OPTIONS
(
model_type='logistic_reg',
labels = ['will_buy_on_return_visit']
)
AS
SELECT
EXCEPT(fullVisitorId)
FROM
#features
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
data-to-insights.ecommerce.web_analytics
WHERE
totals.newVisits = 1
AND date BETWEEN '20160801' AND '20170430') #train on first 9 months
JOIN
(SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM
data-to-insights.ecommerce.web_analytics
GROUP BY fullvisitorid)
USING (fullVisitorId)
;
จากนั้นรอเวลาจนกว่าจะ Train Model เสร็จ

Evaluate Model
SELECT
roc_auc,
CASE
WHEN roc_auc > .9 THEN 'good'
WHEN roc_auc > .8 THEN 'fair'
WHEN roc_auc > .7 THEN 'decent'
WHEN roc_auc > .6 THEN 'not great'
ELSE 'poor' END AS model_quality
FROM
ML.EVALUATE(MODEL ecommerce.classification_model, (
SELECT
EXCEPT(fullVisitorId)
FROM
#features
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
data-to-insights.ecommerce.web_analytics
WHERE
totals.newVisits = 1
AND date BETWEEN '20170501' AND '20170630') # eval on 2 months
JOIN
(SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM
data-to-insights.ecommerce.web_analytics
GROUP BY fullvisitorid)
USING (fullVisitorId)
));

หรือ คลิกมาดูผล Model ได้อย่างละเอียดแบบนี้ มีทั้ง Confusion matrix, Precision-Recall, ROC Curve

โมเดลอยู่ในเกณฑ์ปานกลาง อาจจะเป็นเพราะ Features น้อยเกินไป ที่นี้แอดลองเพิ่ม Features เข้าไปอีก โดยสร้างเป็น Classification Model ที่ 2
Build and Training Classification Model 2
standardSQL
CREATE OR REPLACE MODEL ecommerce.classification_model_2
OPTIONS
(model_type='logistic_reg', labels = ['will_buy_on_return_visit']) AS
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM data-to-insights.ecommerce.web_analytics
GROUP BY fullvisitorid
)
#add in new features
SELECT * EXCEPT(unique_session_id) FROM (
SELECT
CONCAT(fullvisitorid, CAST(visitId AS STRING)) AS unique_session_id,
#labels
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# behavior on the site
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# where the visitor came from
trafficSource.source,
trafficSource.medium,
channelGrouping,
# mobile or desktop
device.deviceCategory,
# geographic
IFNULL(geoNetwork.country, "") AS country
FROM data-to-insights.ecommerce.web_analytics
,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE 1=1
# only predict for new visits
AND totals.newVisits = 1
AND date BETWEEN '20160801' AND '20170430' # train 9 months
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
);
Model Evaluation 2
สังเกตว่า พอแอดเพิ่ม Features เข้าไป ทำให้โมเดลมาอยู่ในเกณฑ์ที่ดีมากๆ โดยมี ROC AUC = 0.92 WOW !

พอเราได้ Model ที่ดีแล้ว ถึงเวลาใช้ Predict ข้อมูล Test Dataset
Predict which new visitors will come back and purchase
เราแบ่ง Data ออกเป็น 3 ก้อน จากข้อมูลทั้งหมด 12 เดือน
- Training = 9 เดือน
- Validation = 2 เดือน
- Test = 1 เดือน
มา Test กันเลย
standardSQL
SELECT
*
FROM
ml.PREDICT(MODEL ecommerce.classification_model_2
,
(
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM data-to-insights.ecommerce.web_analytics
GROUP BY fullvisitorid
)
SELECT
CONCAT(fullvisitorid, '-',CAST(visitId AS STRING)) AS unique_session_id,
# labels
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# behavior on the site
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# where the visitor came from
trafficSource.source,
trafficSource.medium,
channelGrouping,
# mobile or desktop
device.deviceCategory,
# geographic
IFNULL(geoNetwork.country, "") AS country
FROM data-to-insights.ecommerce.web_analytics
,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE
# only predict for new visits
totals.newVisits = 1
AND date BETWEEN '20170701' AND '20170801' # test 1 month
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
)
)
ORDER BY
predicted_will_buy_on_return_visit DESC;
โดยหลังจาก Test จะสร้างคอลัมน์มาใหม่ 3 คอลัมน์ คือ
- predicted_will_buy_on_return_visit: ถ้าหาก Model ทำนายว่าจะกลับมาซื้อ มีค่าเท่ากับ 1
- predicted_will_buy_on_return_visit_probs.label: ค่า Binary ของ Model yes = 1, no = 0
- predicted_will_buy_on_return_visit.prob: ความมั่นใจของ Model ในการทำนายว่าจะซื้อหรือไม่ (1 = 100%)
จากนั้นเราก็สามารถเอาข้อมูลที่ Model ทำนายไปใช้ Retargeting ของคนที่มีแนวโน้มว่าจะกลับมาซื้อได้เลยยย

Course Summary
จบกันไปแล้วสำหรับ การรีวิวคอร์ส Applying Machine Learning to your Data with GCP จาก Coursera ทีนี้เราลองมาดู Hands-on Labs ทั้งหมดในคอร์ส ที่ทำผ่าน Qwiklabs เหมือนเดิมเลย
- Lab1 : Practice with ML APIs
- Lab2 : Creating Repeatable Dataset Splits with BigQuery
- Lab3 : Predicting Visitor Return Purchases with BigQuery
- Lab4 : Building a Forecasting model in BigQuery ML
ลองสรุปกันอีกทีว่ารอบนี้เราเรียนอะไรไปกันบ้าง
- Module 16 : Introduction to Machine Learning
- Module 17 : Creating ML Models in BigQuery
สำหรับคอร์สนี้แอดมองว่าดีมากเลย ได้ลองสร้าง Model กันด้วย SQL แบบง่ายๆ เลย แอดน่าจะเอาไปปรับใช้กับงานได้ แถมยังเป็นการนำ Data จาก Google Analytics มาใช้ซะด้วย คิดว่าคนที่เป็น Data Analyst ที่อยากจะผันตัวไปเป็น Data Scientist ก็น่าจะสนใจอยู่ไม่น้อยและคงได้ประโยชน์จากคอร์สนี้ไปเต็มๆ
เรียนจบก็ได้ Certificate ประจำคอร์สเช่นเคย !

แต่เดี๋ยวก่อนนนน
แอดเรียนจบ Specialization Track : From Data to Insights with Google Cloud Platform Specialization แล้วด้วยยย ใช้เวลาประมาณ 4-5 เดือนเลยทีเดียว พอเรียนจบคอร์สนี้แอดก็ได้เลย Certification อันใหญ่มาอีกใบ กรี๊ดๆๆๆ !


หวังว่าบทความนี้จะมีประโยชน์ต่อทุกคนที่เข้ามาอ่านไม่มากก็น้อยนะคร้าบ รอติดตามบทความต่อไปเร็วๆ นี้
พูดคุยกันได้ที่เพจ Malonglearn – มาลองเรียน หรือติชมผ่านคอมเม้นด้านล่างเลยจ้า
Follow Me !
Knowledge is everywhere, Take your first step !
1,750 total views, 4 views today