Data Preparation
Notes from Data Science class + my own research
Data Table
Data ส่วนใหญ่ที่เราจะได้มักจะอยู่ในรูปของ Data Table ซึ่งก็จะประกอบไปด้วย
- Row — แทนแต่ละ example หรือ instance
- Column — ซึ่งแทนแต่ละ Feature
ตัวแปรก็จะแบ่งออกเป็น
- Input — ข้อมูลตัวแปรต้นของเรา
- Output — ข้อมูลที่เป็นตัวแปรตาม หรือผลลัพธ์ Outcome ที่เราต้องการจะหา
Kinds of Data

ข้อมูลของเราเองก็จะแบ่งได้เป็นหลายปะเภทตามรูปกราฟข้างต้น และในบางครั้งก็สามารถเรียกได้หลายแบบ เช่น
Quantitiative อาจเรียกเป็น Numerical
Quantitiative เองก็อาจจะแบ่งเป็น Continuous/Discrete หรือ Interval/Ratio ก็ได้ โดย
- Continuous vs. Discrete is about how numbers behave (measured vs. counted)
- Interval vs. Ratio is about what the numbers mean (do they have a true zero?)

ซึ่งบางครั้งก็ชวนให้สับสนได้ เช่น
- Gender (Female/Male) ก็จะเป็นประเภทของ Nominal
- การเลือกซื้อหรือไม่ซื้อ โดยระบุค่าแทนด้วย 1 หรือ 0 ก็จัดเป็นประเภทของ Nominal
GIGO
“Garbage in, garbage out. No algorithm can fix bad data.”
การเตรียม Data เป็นขั้นตอนที่สำคัญและมีผลมาก ๆ กับ model ของเรา “A model is only as good as the data it learns from.”
Workflow/Overview


เราจะมา walkthrough แต่ละขั้นตอนที่สำคัญกัน
1.) Examining the Data Set
การตรวจสอบและทำความเข้าใจ Data ของเรา โดยพื้นฐานแล้วนั้น อาจจะเริ่มจากการ ดูข้อมูลของเราคร่าว ๆ เช่น การใช้ functionใน pandas เพื่อ inspect data มาดู
guideline คร่าว ๆ ก็เช่นการดู
- df.shape()
- df.info()
- df.describe()
- df.isnull().sum()
- df.hist()
- df.value_counts()
ซึ่งตัวแปรแต่ละประเภทก็จะมีสิ่งที่เราควรดูแตกต่างกันออกไป
Numerical variables
- เช็ค range — out of ranges
- Graph distribution: Histogram
Categorical variables
- การดูค่าแปลก ๆ ค่าที่พิมพ์ผิด ผิดปกติ miscodes ต่าง ๆ
- Graph distribution: Frequency table, bar chat
Target variable
- ดูการกระจายตัวของคำตอบในข้อมูลที่เรามี
- ดูอัตราส่วนของค่าต่าง ๆ
- Graph distribution: bar chat, pie chart
2.) Narrowing down columns
เมื่อเราเข้าใจข้อมูลของเราแล้ว การดูข้อมูลที่เรามีแล้วคัดให้เหลือแต่ข้อมูลที่เกี่ยวข้อง มีประโยชน์ และสำคัญกับโจทย์ของเราเองก็สำคัญ
- Remove unqualified feature
การเอา feature ที่อาจทำให้เกิดผลที่ผิดเพี้ยนออกไม่ว่าจะเป็น
- too many unique values → เมื่อ map input/output แทบจะเป็น 1:1 ซึ่งค่าเหล่านี้ lack of generalization อาจทำให้เกิด overfit ได้
- too many missing values > 50%
- Flat values → มี output ใด output หนึ่งมากเกินไป จนแทบมีคำตอบเดียว อาจทำให้ undergit ได้ (อาจมองเป็นการตั้ง precondition แทน) - Feature engineering
สำหรับเรามันคือการแปลงข้อมูลให้มีความหมาย มีประสิทธิภาพมากขึ้น
เช่น เราอาจจะแปลง zip code เป็นระยะห่างจากสาขาที่ใกล้ที่สุด เอา Date/Time มาแปลงเป็นรูปแบบต่าง ๆ เช่นวันในสัปดาห์ เดือน ครั้งล่าสุดที่มา ช่วงของชั่วโมงในวัน หรือการเอา location มามองเป็น district เป็นต้น - Remove temporal Infidelity features
ข้อมูลบางตัวที่เรามีอาจจะใช้ในการทำนายไม่ได้ อาจจะเป็นข้อมูลที่ในลำดับ timeline ตอนที่เราทำนาย ยังไม่ควรได้มา ทำให้เมื่อใช้ไปอาจจะขี้โกงบอกผลลัพธ์ที่ควรได้ให้กับเราล่วงหน้า เช่น ถ้าเราต้องการทำ cresit scoring ของปี 2017 เราก็ไม่สามารถใช้ค่า FICO 2017 ที่จะถูกคิดในตอนสิ้นปี 2017 มาใช้ได้
ต้องดูลำดับเหตุการณ์หรือความสัมพันธ์ของข้อมูลตามเวลาดี ๆ - Remove leaking-target features
ข้อมูลที่แอบบอกใบ้ผลการทำนาย ทำให้ข้อมูลที่ไม่ควรมี leak ออกมา เช่น เราต้องการจะทำนายว่าลูกค้าจะซื้อของหรือไม่ แต่เราใส่ยอดการซื้อ หรือจำนวนการซื้อของของลูกค้าไป
เราจึงควรทำความเข้าใจข้อมูลของเรา และคัดกรองดี ๆ เพื่อให้ได้ model ที่จะทำตามโจทย์ของเราได้อย่างมีประสิทธิภาพ
3.) Preparing features for ML
เมื่อเราทำความเข้าใจและคัดกรองข้อมูลที่จะนำมาใช้เรียบร้อยแล้ว ขั้นตอนถัดมาก็คือการเตรียมความพร้อมและตรวจเช็คข้อมูลที่เราคัดมาใช้
3.1) Missing values
Data ที่เราได้มาอาจจะไม่ได้ perfect เสมอไป อาจจะมีความผิดพลาดในการเก็บจ จึงมี missing value ได้
Inputs มี missing
ทำการแทนที่ข้อมูลนั้น ๆ หรือตัดข้อมูลชุดนั้นออก การแทนที่อาจทำได้โดย
Statistical approach
ใช้ stat values อย่าง mean median mode หรืออาจจะเพิ่มเติมโดยการ Stats by group เช่น ใช้ Mean by group รวมถึงการ Separate missing group ออกมา โดยการใส่เป็น group แยกใน Categorical variablesModel-based approach
“use other variables to predict the missing values” ซึ่งก็ใช้ได้ทั้ง linear model, tree-based model
Target มี missing
ในกรณีนี้เราจะต้องตัดข้อมูลชุดนั้น ๆ ออก
3.2) Categorical to numeric variables
เนื่องจากการทำงานด้านใน model ต่าง ๆ เป็นการใช้หลักการทางคณิตศาสตร์ เราจึงจะต้องแปลงตัวแปร categorical → numeric
Categorical variable แบ่งออกเป็น
Ordinal variable
เราสามารถ Enumerate ทำการ apply function อะไรสักอย่างเข้าไปได้เลย เนื่องจากเป็นตัวแปรที่สามารถเรียงลำดับได้อยู่แล้ว เช่น เกรด
Nominal variable
เราสามารถใช้การ Encoding หรือว่าเทคนิคต่าง ๆ เช่น
One-hot Encoding — รูปแบบยอดฮิต
Converts N categorical values into N-1 separate binary columns
การแปลงจาก x = “A” or “B” or “C” มาเป็น column A B ที่เก็บ 0, 1 แทนการเป็นเลขแต่ละตัว ทำให้จะได้ A=1, B=0 แทน A A=0, B=1 แทน B และ A=0, B=0 แทน C
ข้อเสีย ถ้ามีรูปแบบเยอะจะได้ columns เพิ่มเยอะไป

Target Encoding
replaces categorical values with the average of the target variable for each category. เหมาะกับ feature ที่มี unique value เยอะ
ข้อเสีย overfitted ง่าย, Data leakage
Target Averaging (Probability Encoding)
คล้าย Target Encoding แต่ใช้กับ classification problems(Binary). Replaces each category with the probability of the target class.
จำนวนครั้งที่ class นั้น ๆ เป็น 1/จำนวนครั้งที่เป็น class นั้น เช่น
df[‘City_encoded’] = df.groupby(‘City’)[‘Churn’].transform(‘mean’)
ข้อเสีย overfitted ง่าย, Data leakage

Weight of Evidence (WoE) Encoding
Used in binary classification problems. Calculates the ratio of positive to negative outcomes in a logarithmic scale.
ข้อเสีย Needs large data

Smoothed Weight of Evidence (SWoE)
Modification of WoE to handle small sample sizes and avoid extreme values. Uses Laplace smoothing to ensure stability.
ข้อเสีย Needs tuning

3.3) Truncate outliers
remove or transform outliers
การระบุ outliers ก็อาจทำได้โดย
1.) ใช้ normal distribution
2.) ใช้ Box plot แล้วใช้ IQR ในการคิด
3.) trim ตามเปอร์เซ็นหัว, ท้ายที่กำหนด
3.4) Feature transformation
ดูความเบ้จากค่า skewness ถ้าเบ้มากอาจจะต้อง transform เพื่อปรับค่า เช่น การ take log, Bining(Group ค่าเป็นช่วงแล้วใช้เลขช่วงแทน)
3.4) Feature engineering
สำหรับเรามันคือการแปลงข้อมูลให้มีความหมาย นำค่ามาคำนวณ หรือคัดเอาพฤติกรรมต่าง ๆ เช่น Behavior from transactional data (RFM/RFA) ดู Recency(last order) Frequency(number of orders in the given period) Monetary value(How much money spent)
4.) Train/Test/Validate
แบ่ง data ออกเป็นส่วนสำหรับ Train/Validate/Test หรือ Train/Test โดยที่ดราจะต้องคง distribution ตั้งต้นเอาไว้ (stratification) ส่วนมากก็ใช้ train_test_split ในการแบ่งโดยปกติ (ใส่ random_state เพื่อให้ replicate ผลได้ กับ stratify ด้วย*)
Train → ใช้สำหรับ train
Validate(optional) → ใช้สำหรับ model tuning
Test → ใช้สำหรับ test/evaluate(simulate on unseen)
บางครั้งในขั้นตอนการแบ่งชุดข้อมูลก็อาจทำให้เกิด Data leaking ได้เช่นกัน เช่นสมมุติเรามี input เป็นภาพจาก VDO เราก็อาจจะต้องแบ่งให้ VDO เดียวกัน อยู่ในชุดเดียวกัน หรือในข้อมูลประเภท time series เราก็อาจจะต้องแบ่งตามช่วงเวลาที่ต่อกัน
หลังการ train ก็อาจจะเกิด overfitting/underfitting ซึ่งเราก็ต้องแก้ไขตามวิธีการต่าง ๆ ต่อไป
บางครั้งในขั้นตอน Validation ก็อาจจะเกิดการ overfitting บน validation test ได้เหมือนกัน ซึ่งวิธีการ Validate ที่จะช่วยได้ก็คือ
K-Fold Cross Validation
Why: Helps estimate the model’s expected performance, Prevents unlucky splits.
เวลาที่เราแบ่งเป็น Train/Validate/Test สังเกตว่า เรามีการ validate บน data ก้อนเดียว ซึ่งผลจากการ validate บน data ก้อนเดียวนั้น ก็ไม่ได้แปลว่าผลจะดีกับ data ทั้งหมด
Is the model consistently good?
How to pick the best hyperparameters and model selection?
แทนที่จะทำแบบนั้น เราเลยแบ่งเป็น Train/Test แต่ก้อน Train ของเราจะแบ่งเป็น ก้อนเล็ก ๆ k ก้อน โดยเราจะวน iterationในการ train และ validate ทั้งหมด k รอบ โดยเราจะวนก้อนสำหรับ validate 1 ก้อนไปเรื่อย ๆ และให้อีก k-1 ก้อนเป็นส่วนสำหรับ train ผลการ validate ก็จะเป็น mean(accuracy_scores) ของทุก fold นั่นเอง การทำแบบนี้จะทำให้ทุก Train data มีส่วนในการ validate ทำให้เราได้ผล validate ที่ตรงกับความจริงมากขึ้น และสามารถเลือก/เปรียบเทียบ model ได้ดีกว่านั่นเอง
Resources:
- Peerapon Vateekul, Ph.D. Slide จากวิชา DSDE, Computer Engineering, Chulalongkorn University
- GeeksforGeeks
- https://www.analyticsvidhya.com