Feature Engineering Techniques for Machine Learning

Paul
KBTG Life
Published in
4 min readMay 25, 2023

สวัสดีค่ะทุกคน วันนี้เราจะพามาทำความรู้จักกับเทคนิค Feature Engineering ซึ่งเป็นวิธีเบื้องต้นที่เหล่า Data Scientist ใช้ในการ Convert Raw Data เป็น Features เพื่อสร้าง Machine Learning Model กันต่อไป โดยในบทความนี้จะอธิบายถึง 5 เทคนิคสำคัญที่ใช้กันค่ะ

1. Imputation

ในระหว่างที่เราทำการ Prepare Data นั้น ปัญหาสำคัญอย่างนึงที่มักจะพบก็คือ Missing Data จากประสบการณ์ในการใช้ Survey Data เพื่อวิเคราะห์หา Insight ปัญหาหลักๆ ก็คือ Missing Values ซึ่งอาจจะเกิดจากความผิดพลาดตอนกรอกข้อมูล ความผิดพลาดของระบบ หรือตั้งใจให้มี Missing Values ทั้งนี้ Missing Values อาจส่งผลต่อ Performance ของ Model เราจึงควรต้อง Impute ก่อนที่จะเริ่มสร้าง Model โดยวิธีการ Impute จะแบ่งออกเป็น 2 แบบหลักๆ ดังนี้

Numerical Imputation

เป็นการ Impute Feature ที่มีค่าเป็นตัวเลข อาจจะใช้วิธีการ Impute ด้วย 0, ค่า Mean, Median หรือ Mode ขึ้นอยู่กับ Feature นั้นๆ

Imputed by 0
## imputed by 0 ##

#import library
import pandas as pd
import numpy as np

#generate dataset
data_dict = {'id':[1,2,3,4,5],
'gender':['F', 'M', 'M', 'F', 'M'],
'height (cm.)':[155, 160, 170, 165, 150],
'weight (kg.)':[45, 50, 53, 60, 49],
'#credit card holding':[np.nan, 5, 2, np.nan, 1]}
df = pd.DataFrame(data_dict)

#fill nan by 0
df['#credit card holding'] = df['#credit card holding'].fillna(0)

Categorical Imputation

เป็นการ Impute Feature ที่เป็น Categorical Feature อาจจะใช้วิธีการ Impute ด้วย Mode หรือสร้างเป็นอีกหนึ่ง Category สำหรับคนที่เป็น Null ก็ได้

Imputed by Mode
## imputed by Mode ##

#import library
import pandas as pd
import numpy as np

#generate dataset
data_dict = {'id':[1,2,3,4,5],
'gender':[np.nan, 'M', 'M', 'F', np.nan],
'height (cm.)':[155, 160, 170, 165, 150],
'weight (kg.)':[45, 50, 53, 60, 49],
'#credit card holding':[0, 5, 2, 0, 1]}
df = pd.DataFrame(data_dict)

#imputed by Mode
df['gender'].fillna(df['gender'].value_counts().idxmax(), inplace = True)

2. Log Transform

Log Transform เป็นวิธีที่เหล่า Data Scientist นิยมใช้กันอย่างแพร่หลายเพื่อ Transform Distribution ที่มีความเบ้ซ้ายหรือขวา ให้กลายเป็น Normal Distribution หรือทำให้เบ้น้อยกว่าเดิม ซึ่งจะส่งผลให้ความกว้างของตัวเลขในแต่ละ Feature มีความแคบลง จากประสบการณ์ในการวิเคราะห์ข้อมูลเกี่ยวกับ Income ส่วนใหญ่แล้ว ตัวเลขจะมี Range ค่อนข้างกว้าง ตั้งแต่หลักพันไปจนถึงหลักร้อยล้าน ดังนั้นการใช้ Log Transform ก็เป็นเทคนิคสำคัญที่ต้องใช้ก่อนการวิเคราะห์

Log Transform
## Log Transform ##

#import library
import pandas as pd
import numpy as np

#generate dataset
data_dict = {'id':[1, 2, 3, 4, 5],
'price':[100000, 5000, 60000, 200, 30],
'stock':[50, 20, 100, 55, 49]}
df = pd.DataFrame(data_dict)

#Log Transform
df['log_price'] = np.log(df['price'])

3. One-hot Encoding

One-hot Encoding เป็นการ Expand Feature จาก Unique Value ของ Feature นั้นๆ เพื่อช่วยให้ Model มองเห็น Insight ของแต่ละ Unique Value ใน Feature นั้นๆมากยิ่งขึ้น อย่างไรก็ตามข้อเสียของวิธีนี้คือจะทำให้มี Feature เพิ่มขึ้นเป็นจำนวนมาก จากประสบการณ์ในการใช้ Questionnaire Data เพื่อ Build Model โดยส่วนใหญ่ Feature จะเป็น Choice ที่มีหลายๆ Choice พอเราทำ One-hot Encoding แล้ว ทำให้มี Feature เพิ่มขึ้นเป็นหลักร้อย เราอาจจะต้องทำการตัดบาง Feature ที่มี Correlation กับ Feature อื่นสูงๆ หรือ Feature ที่ตอบไปในทางเดียวกัน เช่น ทุกคนมีค่าเป็น 0 ทั้งหมด เป็นต้น

One-hot Encoding
## One-hot encoding ##

#import library
import pandas as pd
import numpy as np

#generate dataset
data_dict = {'product':['bag','doll','jean','glove','lipstick'],
'price':[100000, 5000, 60000, 200, 30],
'stock':[50, 20, 100, 55, 49]}
df = pd.DataFrame(data_dict)

#One-hot encoding
df = pd.get_dummies(df, columns = ['product'])

4. Handling Outliers

Outlier Handling คือการจัดการ Outliers ที่อยู่ใน Dataset ของเรา เช่น Feature เกี่ยวกับความสูงของนักเรียนชายชั้นป.6 ของโรงเรียนแห่งหนึ่ง ส่วนใหญ่มีส่วนสูงอยู่ที่ 155–158 ซม. แต่มีนักเรียนคนหนึ่งมีส่วนสูงถึง 170 ซม. ซึ่งต่างจากส่วนสูงของนักเรียนส่วนใหญ่อยู่มาก เราจึงจำเป็นต้อง Handle Outliers ก่อนที่จะเริ่มสร้าง Model เพราะ Outliers พวกนี้อาจจะส่งผลต่อ Performance ของ Model แต่จะส่งผลมากหรือน้อยขึ้นอยู่กับ Model ที่เราใช้ เช่น Linear Regression จะมีความ Sensitive กับ Outliers เราจึงจำเป็นต้อง Handle ก่อนเริ่มทำ Model

ซึ่งส่วนใหญ่เราจะใช้ Inter Quartile Range (IQR) Approach ในการ Detect Outliers ค่ะ

Inter Quartile Range (IQR)

IQR = Quartile3 - Quartile1

Upper Bound = Q3 +1.5*IQR

Lower Bound = Q1–1.5*IQR

ค่าที่อยู่เหนือ Upper Bound หรือต่ำกว่า Lower Bound จะถือว่าเป็น Outliers โดยเราสามารถจัดการได้หลายแบบ เช่น Remove Outliers เหล่านั้นออกจาก Dataset ไปเลย หรือจะใช้วิธีการ Cap Min/Max ก็ได้ ทั้งนี้ขึ้นอยู่กับความเหมาะสมและความต้องการของผู้ใช้งาน

## detect and remove outliers ##

#import library
import pandas as pd
import numpy as np

#generate dataset
data_dict = {'id':[1,2,3,4,5],
'gender':['F', 'M', 'M', 'F', 'M'],
'height (cm.)':[155, 158, 156, 157, 170],
'weight (kg.)':[45, 50, 53, 60, 49]}
df = pd.DataFrame(data_dict)

#detect and remove outliers
Q3, Q1 = np.percentile(df['height (cm.)'],[75,25])
IQR = Q3 - Q1
upper_bound = Q3 + (1.5*IQR)
lower_bound = Q1 - (1.5*IQR)

df = df.loc[(df['height (cm.)']>=lower_bound)&(df['height (cm.)']<=upper_bound)]

5. Binning

Binning เป็นการแบ่ง Bucket ของ Numerical Features ใน Dataset โดยเราอาจจะใช้ Domain Knowledge ในการแบ่ง หรือแค่แบ่งให้แต่ละ Bucket มีจำนวน Sample เท่าๆ กันก็เพียงพอแล้ว และเราคาดหวังว่าการแบ่ง Bucket ของ Numerical Features แบบนี้จะพอทำให้เห็นเทรนด์อะไรบางอย่างใน Dataset ของเรา ซึ่งวิธีการแบ่งนั้นก็ทำได้หลายวิธี ไม่ว่าจะเขียน Function เองหรือใช้ Function ที่มีอยู่แล้วก็ได้ ในบทความนี้เราจะขอยกตัวอย่างวิธี Binning โดยใช้ pd.cut() ดังต่อไปนี้

Binning
## Binning ##

#import library
import pandas as pd
import numpy as np
import random

#random and generate dataset
randomlist = random.sample(range(1000, 50000), 100)
df = pd.DataFrame(randomlist, columns=['monthly_income'])

#binning
df['monthly_income_bin'] = pd.cut(df['monthly_income'], bins=5) #bins=5 can be adjusted

เป็นอย่างไรกันบ้างคะทุกคน วันนี้เราได้ทำความรู้จักกับ 5 เทคนิคยอดฮิตสำหรับการทำ Feature Engineering ที่เหล่า Data Scientist นิยมใช้กันอย่างมาก หวังว่าบทความนี้จะช่วยให้ทุกคนเข้าใจเกี่ยวกับเรื่องนี้มากขึ้นและไปศึกษาต่อยอดกันต่อไปได้ แล้วพบกันใหม่ในบทความต่อไปค่าา ^^

References

สำหรับใครที่ชื่นชอบบทความนี้ อย่าลืมกดติดตาม Medium: KBTG Life เรามีสาระความรู้และเรื่องราวดีๆ จากชาว KBTG พร้อมเสิร์ฟให้ที่นี่ที่แรก

--

--