Data Preparation

Wichada Chaiprasertsud
5 min readFeb 4, 2025

--

Notes from Data Science class + my own research

Data Table

Data ส่วนใหญ่ที่เราจะได้มักจะอยู่ในรูปของ Data Table ซึ่งก็จะประกอบไปด้วย

  • Row — แทนแต่ละ example หรือ instance
  • Column — ซึ่งแทนแต่ละ Feature

ตัวแปรก็จะแบ่งออกเป็น

  • Input — ข้อมูลตัวแปรต้นของเรา
  • Output — ข้อมูลที่เป็นตัวแปรตาม หรือผลลัพธ์ Outcome ที่เราต้องการจะหา

Kinds of Data

https://365datascience.com/trending/data-types-complete-guide/

ข้อมูลของเราเองก็จะแบ่งได้เป็นหลายปะเภทตามรูปกราฟข้างต้น และในบางครั้งก็สามารถเรียกได้หลายแบบ เช่น

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?)
ChatGPT generated

ซึ่งบางครั้งก็ชวนให้สับสนได้ เช่น

  • 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

Cr. Peerapon Vateekul, Ph.D. Slide
Cr. Peerapon Vateekul, Ph.D. Slide/https://www.dataquest.io/blog/machine-learning-preparing-data/

เราจะมา 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 variables

Model-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 เพิ่มเยอะไป

Cr. Peerapon Vateekul, Ph.D. Slide

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

Cr. Peerapon Vateekul, Ph.D. Slide

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

Cr. Peerapon Vateekul, Ph.D. Slide

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

Cr. Peerapon Vateekul, Ph.D. Slide

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:

Sign up to discover human stories that deepen your understanding of the world.

--

--

Wichada Chaiprasertsud
Wichada Chaiprasertsud

Written by Wichada Chaiprasertsud

0 Followers

" Things I found interesting and the basics I want to share as a competitive programmer "

No responses yet

Write a response