📝 คอร์สนี้ไม่ใช่คอร์สสอน coding/ programming นะครับ แอดแค่ยก code มาให้ดูเป็นตัวอย่างว่าเราเขียนโค้ดสร้าง ML models ยังไง ถ้าใครอยากเรียน code เต็มๆ มาลงเรียน bootcamp กับแอด 555+
Churn Modeling
มาลองดู churn prediction กันบ้าง ตัวอย่างนี้จะเป็น binary classification โดยเราจะทำนายว่าลูกค้าจะอยู่กับเราต่อเดือนหน้าหรือเปล่า (yes/no)

ความหมายของ churn rate ในทางการตลาดคือ % ลูกค้าที่เลิกใช้บริการเรา เช่น AIS มี churn rate 5% แปลว่าลูกค้าย้ายค่ายไป TRUE/ dtac (อันนี้ตัวเลขสมมตินะครับ 555+)
Churn Dataset
ตัวอย่าง dataset แอดไปค้นมาจากเว็บไซต์ data.world นักเรียนจะชอบถามว่าหาข้อมูลจากไหนดี แอดแนะนำเว็บนี้เลยครับ พรีเมียม มี free dataset ให้เราดาวน์โหลดมาเล่นเยอะมาก

ตัวอย่าง churn dataset ที่เราจะใช้เทรนโมเดล classification ในบทนี้แอดใช้ Logistic Regression เป็น baseline model นะครับ

Review Basic ML Workflow
ขั้นตอนการเทรนโมเดลเหมือนกับบทมะกี้เลย พอเราเทรนโมเดลแรกได้แล้ว โมเดลต่อไปก็ง่ายเลย สุดยอด!

Full Code ที่เราใช้เทรนโมเดล logistic regression glm
มีเปลี่ยนจากตอนเทรน linear regression นิดเดียว
# load library
library(tidyverse)
library(caret)
# read csv data
url <- "https://raw.githubusercontent.com/toyeiei/datarockieblog/main/course/ml4e/churn.csv"
df <- read_csv(url)
# convert column churn to factor
df$churn <- as.factor(df$churn)
# split data
set.seed(42)
id <- sample(1:nrow(df), 0.8*nrow(df))
train_df <- df[id, ]
test_df <- df[-id, ]
# train model
model <- train(churn ~ ., data = train_df, method = "glm")
# predict new data
pred_price <- predict(model, newdata = test_df)
# evaluate model
confusionMatrix(pred_price, test_df$churn, positive = "TRUE")
What Changes?
สิ่งที่แตกต่างจากตอนเทรน Linear Regression มีอยู่สามจุด
1 – R จะเทรนโมเดล classification ก็ต่อเมื่อคอลัมน์ churn
เป็น factor (categorical data)
# convert column churn to factor
df$churn <- as.factor(df$churn)
2 – เราเปลี่ยน method ในฟังก์ชัน train()
เป็น glm
ย่อมาจาก generalized linear model ตัว default ของ glm คือ Logistic Regression
# train model
model <- train(churn ~ ., data = train_df, method = "glm")
3 – เราเปลี่ยนวิธีการ evaluate model มาใช้ confusion matrix ซึ่งเป็นท่ามาตรฐานในการวัดผล classification model อ่านวิธีการอธิบายผลได้ในหัวข้อถัดไป
# evaluate model
confusionMatrix(pred_price, test_df$churn, positive = "TRUE")
Confusion Matrix
Confusion matrix จะเอาผลทำนายมา cross กับค่าจริง (prediction x actual) ผลรวมของเส้นทแยงมุม diagonal line หารด้วยผลรวมของทั้งตารางคือค่า overall accuracy ของโมเดล

Overall Accuracy = (835 + 31) / (835 + 113 + 21 + 31) = 86.6%
📝 นอกจากค่า accuracy ยังมี metrics อื่นๆ เช่น recall, precision, F1-score และ AUC ให้เราใช้วัดผลอีกด้วย
Churn is More Difficult Than You Think

ปัญหา churn ดูเผินๆเหมือนจะง่าย แต่จริงๆมันมีความยากแอบซ่อนอยู่ เพราะความน่าจะเป็นที่ลูกค้าจะ churn มีน้อยมาก เช่น 95:5 หรือ 90:10 เราเรียกปัญหานี้ว่า Imbalanced Classification
ในตัวอย่างนี้ ถ้าแอดไม่ใช้โมเดลอะไรเลย แต่ใช้แค่ descriptive statistics ธรรมดา (No Model) >> ทำนายว่าทุกคนจะอยู่ต่อ no churn เราจะทายถูก overall accuracy 85.86%
Label | N | Percentage |
---|---|---|
Churn | 707 | 14.14% |
No Churn | 4293 | 85.86% |
📝 Logistic Regression มี test accuracy อยู่ที่ 86.6% แปลว่ามันดีกว่า No Model 85.86% อยู่ไม่ถึง 1% เอง
มีโมเดลแล้วดีขึ้นไหม? ดีขึ้น แต่ดีขึ้นเยอะไหม? ยังมีการบ้านให้ทีมเราทำอีกเยอะเลยครับ
บางปัญหาก็ยากกว่าที่ตาเราเห็น โดยเฉพาะ Imbalanced Classification ที่ทุกคนจะต้องเจอแน่ๆตอนทำงานจริง