Data Sci Boot Camp Batch#11: Essential Machine Learning

หัวข้อที่จดๆใน Live Class จดได้ปประมาณนี้

What is Machine Learning (ML)

  • Arthur Samuel (1959) - ability to learn without being explicitly programmed.

Key: Maximize Reward / Minimize Pain

ตอนนี้ ML มี 2 แบบ

  • Classic ML คือ ML ที่เก่งกับ Structure Data
  • Modern ML คือ ML ที่ปรับเพิ่มเติมกับ Unstructured Data พวกเสียง Video

เรียนรู้จาก Data ถ้าคนเรา คือ Experience (ประสบการณ์)

FLOW
|->  COMPUTER ---> TASK ---> PERFORMANCE --(feedback) -|
|                                                      |
|--------------EXPERIENCE <----------------------------|  

Model มันแยกย่อยได้อีก parametric - เช่น พวก regression / non-parametric (rule base) เช่น Decision Tree ก็ if-else โดยตัว Model มันเขียนในรูปแบบ Function ได้ตามนี้ Model = Machine Learning Algorithm(Data)

Why ML is different from statistics

Statistics / Machine Learning เอา Sample จาก Population โดยทีา

📊 Statistics มา ตอบข้อมูลที่มีอดีต
🤖 Machine Learning เอา Sample จาก Population มา ตอบข้อมูลในอนาคต >> เพราะ history repeat itself + new data ให้ตามทัน

Simple ML Pipeline

Full Data --> TRAIN DATA 80% --> TRAIN MODEL --> SCORE MODEL --> EVALUATE MODEL 
          |                                          ^
          --> TEST DATA  20% ------------------------|
  • Full Data โดย
    - Randoms Spilt มาทำ Train / Test Data แบ่ง 80 / 20 หรือ 70/30
    - จากนั้น Prep Data Train ทำ Exploratory Data Analysis เข้าใจภาพรวมข้อมูล ทำ Normalize จาก Z Score และไปปรับทาง Test ต่อ
  • Train model - สร้าง Model
  • Score model - เอา Model ไปลองทำนายจากข้อมูล Test โดยจะได้ root mean square / precision recall /accuracy

ถ้า Accuracy ตอน TRAIN > SCORING ไม่ดี มัน overfit ไป

  • Evaluate model - สรุปผลว่า Model มันผ่านเกณฑ์ หรือยัง ทั้งในมุม Technical + Business นะ เอาง่ายๆ ลงทุนแล้วได้กำไรเท่าไหร่ คนที่ตัดสิน CEO CFO MKT คนให้ Requirement แล้วมาตรงลงกัน เช่น ไปหา Accuracy เพิ่มขึ้นจะได้คุ้มทุน
    - OUTPUT > Model บอก อะไร
    - OUTCOME > ผลกับ Business

Process ไม่ได้ทำแล้วจบไปนะ มันจะเป็น Iterative Process เอาข้อมูลเข้าไป Retain เรื่อยๆ จนกว่า Evaluate พร้อมใช้งานจริง ใช้เวลา + ข้อมูลพอสมควรเลย

Key generalize new / unseen data ได้ ไม่ใช่ทำนายถูกแค่ training

Machine Learning Type

Keyword

  • dataset - ข้อมูลตาม domain เช่น BostonHousing
  • data points ข้อมูลแต่ละแถวใน data set อาจจะมีชื่ออื่น เช่น record / observation
  • overfitting - model เป็นสิงห์สนามซ้อม Accuracy ตอน Train ดันมากกว่าตอน Test หรือ Validation แบบเยอะมาๆ อันนี้แก้โดย Resampling
ซ้าย-underfit / กลาง-robust ดีกับ Data ใหม่ (unseen data) / ขวา-overfitting

🤖 Supervise Learning (Prediction/Analytic)

Feature1 | Feature2 | Feature3 | Label
---------|----------|----------|------
1.2      | A        | CC       | 3.8
2.5      | B        | CC       | 6.1

# feature ตัวแปรต้น
# label คำตอบ เราจะให้ Model ความเข้าใจส่วนนึงก่อน และทำนายที่เหลือ

ทำนายผล Column feature ค่าตั้งต้น แล้วมี Column นึงให้มันทำนาย label โดยมี Model (Algorithm)

  • Regression (Numeric) เช่น Linear Regression
  • Classification (Category / factor) เช่น Logistic Regression

🤖Unsupervised Learning (Summaries Data / Pattern / Association)

Feature1 | Feature2 | Feature3 |
---------|----------|----------|
1.2      | A        | CC       | 
2.5      | B        | CC       | 

มีแต่ Feature มี 3 แบบ

  • Clustering จัดกลุ่ม เช่น K-means
  • Association หรือ market Basket Analysis หาความสัมพันธ์
  • Dimension Reduction - ถ้า Data Set มี 1000 Column เราจะลด Column หรือ Feature ให้เหลือ 15 Column ทำให้น้อยลง ทำงานไวขึ้น โดยตัวที่ลดลงจะเรียกว่า Components

🤖 Reinforcement Learning เรียนรู้เพิ่มเติม

ภาพจากเว็บ http://psycologywithus.blogspot.com/2013/12/ivan-petrovich-pavlovs-theory-of.html
ภาพจากเว็บ http://psycologywithus.blogspot.com/2013/12/ivan-petrovich-pavlovs-theory-of.html

อันนี้ Concept ใกล้กับ AI ที่เราอยู่ตอนนี้ ตัวอย่างง่ายๆการสอนน้องหมา ถ้าเราเรียกมันด้วยการปรบมือ แล้วให้ขนม (Reward) มันจะจำได้ เราทำอีกรอบแล้วมันทำผิด ไม่ให้ขนม

มันจะเรียนรู้ว่า Action อะไร ได้ผลตอบแทน Reward อะไร

เหมือนเคยจดไว้ตอนก่อนเรียน ป โท ตอนนั้นเทียบกับ Data Mining มั้ง สุดท้ายมาสาย Software Eng ยังแอบเสียดาย

train test validate อิหยัง ?

นอกจาก Idea แบ่ง Data สำหรับ Train / Test ตามสัดส่วนแล้ว ยังมีอีกแนวคิด แบ่งเป็น 3 ส่วนเลย train / test /* validate ส่วน test / validate ทำหน้าที่คล้ายๆ ช่วยตรวจ

ตัวอย่างที่แอดสอน จะใช้กับ Time Series Data เช่น อยากรู้ของปีถัดไป อย่าง เช่น

Train Data เดือน 1-8Test Data เดือน 9-10Validate Data เดือน 11-12

ควรมี Data ขนาดไหนถึงเอามา Train ML ได้ ?

  • ปกติใช้ประมาณ 2-5 ปี แต่ต้องดูความถี่ในการจัดเก็บด้วย (granularity)
  • ถ้า 2 ปี เก็บรายไตรมาส มี 8 แถว มันน้อยเกินไป

Why Resampling ?

อ๋อเข้าใจแล้วว่าทำไมถึงต้องผ่าน Stat มาก่อน

บางทีเราได้ Model แล้วผลลัพธ์ที่แต่ละรอบ score มันเหวี่ยง เลยมีเทคนิคลองเอา Data มาทำหลายๆ และมา Train ดังนี้

📌 leave one out CV

  • เก็บ 1 datapoint เอามา test แล้่วที่เหลือเอาไป train model
  • ถ้ามี data 1000 datapoint และสลับ data point ที่เป็น test ไปเรื่อยๆจนครบ
  • Error Score เอามาเฉลี่ยกัน

วิธีนี้ใช้ Resource เยอะ (Computational Expensive) ถ้ามี 1 ล้าน Data Point ต้องทำ 1 ล้านรอบสลับจนครบ

📌 bootstrap (Idea มาจากนักสถิติ แก้ปัญหาเพราะสมัยนั้น 100 ปีก่อน Data มันน้อย)

  • แยก Test Data ออกมาจาก Training เหมือนเดิม เช่น สัดส่วน 30 / 70 ห้ามซ้ำ
  • แต่ให้ Training Data Size = Full Data Size ต้องห้ามซ้ำกับ Test Data แสดงว่าใน Training Data จะมี Record ซ้ำแบบสุ่มในแต่ละรอบของการ Train Model

ใน R ตัว caret ใช้เทคนิค bootstrap

📌 k-fold cross validation

  • เหมือน Data เป็นกลุ่มตามค่า K ปกติใช้ 5 / 10 และทำแบบ leave one out CV แทนที่จะทำที่ละ Data Point มาสลับที่ละกลุ่ม ถ้า Sample 1000 / K = 5 จะมีกลุ่มละ 200 และสลับกัน
  • Train ตาม K+1 รอบ รอบสุดท้ายมาปรับจูน
  • Error Score เอามาเฉลี่ยกัน แต่เราสามารถเอาค่า parameter ที่ได้ผลลัลพธ์ที่ดีที่สุดมาใช้งานได้

ถ้าเอามา Adapt กับ Simple ML Pipeline ช่วง Train Model จะเป็นการเลือกเทคนิค Resampling + Algorithm เช่น k-fold cross+Algorithm

Full Data --> TRAIN DATA 80% --> [k-fold cross+Algorithm] --> SCORE MODEL --> EVALUATE MODEL 
          |                                                        ^
          --> TEST DATA  20% --------------------------------------|

💡 ถ้าเรามี Data เยอะมากๆ อย่างการทำ Deep Learning การ Resampling อาจจะไม่จำเป็น เพราะมันใช้ Computational Expensive มาก เข้า Flow เดิมเลย แยก TRAIN DATA / TEST DATA และโยนเข้า Algorithm เพื่อ TRAIN MODEL

Sample Algorithm

🥗 K-Nearest Neighbors

พอมี Data Point เข้าไปใหม่ อยากรู้ว่าข้อมูลใหม่ มันใกล้ข้อมูลกลุ่มไหนมากกว่า ปกติมีสูตรวัน อย่างตัว Euclidean_distance

  1. Choose K
  2. Compute distance
  3. Majority vote for classification หรือ ถ้าใช้สำหรับทำนาย Class Average for regression

🥗 Linear Regression

  • minimize sse - sum of squre error ระยะที่แต่ละจุด และเอาค่ามาทำนายตัวถัดไป
  • การวัดจะวัดจาก MAE/ MSE/ RMSE มีค่าตํ่าที่สุด

ML with Caret in R

🔀 Install ใช้ lib caret ของ R น่าจะเท่ากับพวก scikit learn ?

install.packages("caret")
library(caret)

🔀 Split Data

# 0. Demo DataSet
data("BostonHousing")
df <-BostonHousing

# 1. Split
set.seed(42)
n <- nrow(df)
id <- sample(n, size=0.9*n)
train_data = df[id,]
test_data = df[-id,]

🔀 Call Model / Trainning

  • Pattern
    - form = formular y เป็นผลัพธ์ ที่มาจากตัวแปรต้น
    - method caret-model มี 200 กว่าตัวเลย
model <- train(form = y ~ . ,
               data = train_data ,
               method = “ALGORITHM” )
  • Sample
# 2. Traing (with k-fold)
head(train_data)
# crime - indus distance - rm room - b black people
# medv ราคาบ้านเฉลี่ย
set.seed(42)  # fixed knn result

# ที่เรียนมาใช้ได้หมด
# LOOCV - leave one out CV
# boot - bootstrap 
# cv - k-fold cross validation
train_ctrl <- trainControl(method = "cv", 
                           number = 5)

model_knn <- train (medv ~ crim + indus + rm + b, 
                    data = train_data,
                    method = "knn",
                    metric = "RMSE", 
                    trControl = train_ctrl)  

ลองมาดูผลลัพธ์ก่อน

k-Nearest Neighbors 

455 samples
  4 predictor

No pre-processing
Resampling: Cross-Validated (5 fold) <<< ตรง trainControl

Summary of sample sizes: 364, 364, 364, 365, 363 
Resampling results across tuning parameters:

  k  RMSE      Rsquared   MAE     
  5  6.580657  0.4801668  4.618687
  7  6.681527  0.4649328  4.751312
  9  6.724301  0.4559564  4.749602

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 5.

# พวก Metric
# - Rsquared ยิ่งสูงยิงดี
# - RMSE / MAE ยิ่งน้อยยิ่งดี

# RMSE = sqrt(mean(error^2))
# MAE = mean(abs(error))

🔀 SCORE MODEL + EVALUATE MODEL

เอา Test Data ที่เตรีมไว้มาตรวจ ตอนนี้เรารู้แล้วว่าจาก Model ดีสุด RMSE = 6.580657 ที่ K=5

# 3. Score
pred_medv <- predict(model_knn,
                     newdata = test_data)

# 4. Evaluate
error <- pred_medv - test_data$medv
test_rmse <- sqrt(mean(error ** 2))

train_rmse <- model_knn$results$RMSE[1]
> test_rmse 
[1] 6.95405
> train_rmse 
[1] 6.580657

ตรงนี้ Model ไม่ได้ Overfited (train_rmse > test_rmse ) เกินไป

เอาจริงๆ ผมไม่เข้าใจเลยนะ เคยไปฟังที่เค้าสอนจาก Code เข้าใจว่าดูตัว Model ที่ออกตอน Train แล้วเอามาใช้ได้เลย เพิ่งรู้ต้องมาเทียบผลหลัง Predict อีกที คิดว่าน่าจะมีอีกหลายคนเข้าใจผิดแบบผม

model ไหนดีกับ data เรา

  • ไม่มีอะไรที่บอกได้แน่นอนนะ แต่แอดทอยแนะนำว่า ยิ่งลองเยอะ มี experiment จะดีขึ้น
    - เข้าใจว่าน่าจะรวมถึง Experience ของคนทำด้วย เจอ Data แบบต่างๆ แล้วตัด Choice รู้ว่าต้องการตอบคำถามแบบไหน เช่น ทำนาย (Regression) หรือ จัดกลุ่ม Segment (Clustering) เป็นต้น
    - หรือ ถ้าใช้ model ที่ซ้บซ้อน Error น้อยลง เช่น ranger (Random Forest)
  • ตอนนี้มันมี Service AutoML ที่มาลอง Model ต่างๆให้ แต่ต้องลงทุนเสียเงินนะ ค่า Computed

Random Forest - ถ้ามองง่ายๆ multiple decision trees หลายตัวเอามารวมผลลัพธ์กัน

No Free Lunch (NFL) ของฟรีไม่ใครโลก ขึ้นกับสภาพการณ์เวลานั้น ระหว่าง Data กับ Model โดยที่บาง Model เราอธิบายไม่ได้แต่ Accurancy สูงสุด กับอีก Model ที่น้องลงมาหน่อย ต้องมา weight กัน พยายามเน้นที่เราอธิบายได้ก่อน