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

🤖 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

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


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.