ในกระบวนการสร้างโมเดล Machine Learning การประมวลผลข้อมูลล่วงหน้าถือเป็นขั้นตอนที่สำคัญที่สุดขั้นตอนหนึ่ง การจัดการค่าที่เป็นหมวดหมู่มีบทบาทสำคัญ

ตัวแปรหมวดหมู่คือตัวแปรที่แสดงถึงหมวดหมู่ต่างๆ เช่น เพศ สี หรือประเภทของผลิตภัณฑ์ ในการเรียนรู้ของเครื่อง อัลกอริธึมส่วนใหญ่ต้องการอินพุตที่เป็นตัวเลข ซึ่งหมายความว่าตัวแปรหมวดหมู่จะต้องถูกแปลงเป็นรูปแบบตัวเลขก่อนจึงจะสามารถใช้เป็นอินพุตของอัลกอริธึมได้ กระบวนการนี้เรียกว่าการเข้ารหัส

การใช้ SK-learn ทำให้เราสามารถเข้ารหัสตัวแปรเชิงหมวดหมู่ได้หลายวิธี มาพูดคุยกันทีละเรื่องด้วยตัวอย่างการเขียนโค้ดแบบลงมือปฏิบัติจริง

  1. ตัวเข้ารหัสฉลาก

การเข้ารหัสฉลากเป็นเทคนิคที่ใช้ในการเรียนรู้ของเครื่องเพื่อแปลงข้อมูลเชิงหมวดหมู่ให้เป็นรูปแบบตัวเลข นี่เป็นสิ่งจำเป็นเนื่องจากโมเดลการเรียนรู้ของเครื่องทำงานกับข้อมูลตัวเลข และตัวแปรหมวดหมู่ไม่สามารถป้อนลงในโมเดลเหล่านี้ได้โดยตรง

ตัวอย่างเช่น ลองพิจารณาชุดข้อมูลที่มีข้อมูลเกี่ยวกับผลไม้ ชุดข้อมูลประกอบด้วยคอลัมน์ชื่อ "สี" ซึ่งมี 3 หมวดหมู่ ได้แก่ "สีแดง" "สีเขียว" และ "สีเหลือง" เพื่อที่จะใช้ข้อมูลนี้ในโมเดลการเรียนรู้ของเครื่อง เราจำเป็นต้องแปลงข้อมูลหมวดหมู่ในคอลัมน์ "สี" ให้เป็นรูปแบบตัวเลข

ดังนั้น เราจะจับคู่ค่าตัวเลขกับสีเหล่านั้นโดยใช้คลาส LabelEncoder()

#Import Libraries 
import pandas as pd
from sklearn.preprocessing import LabelEncoder

#Create Dataset
data_raw = pd.DataFrame({'Fruit': ['Apple', 'Banana', 'Orange','Apple', 'Kiwi', 'Grape'],
                       'Color': ['Red', 'Yellow', 'Orange','Red', 'Green', 'Purple']})

#Encode Color Column 
data = data_raw.copy()
le = LabelEncoder()
data['Color_Encoded'] = le.fit_transform(data['Color'])
print(data)

ปัญหาคือการเข้ารหัสป้ายกำกับถือว่ามีความสัมพันธ์ตามลำดับระหว่างหมวดหมู่ ซึ่งหมายความว่าจำนวนเต็มที่กำหนดนั้นมีลำดับที่มีความหมาย อย่างไรก็ตาม นี่อาจไม่เป็นเช่นนั้นเสมอไป ซึ่งในกรณีนี้การเข้ารหัสแบบร้อนแรงอาจมีความเหมาะสมมากกว่า

2. ตัวเข้ารหัสแบบร้อนเดียว

การเข้ารหัสแบบฮอตอย่างหนึ่งเป็นอีกเทคนิคหนึ่งที่ใช้ในการเรียนรู้ของเครื่องเพื่อแปลงข้อมูลหมวดหมู่ให้เป็นรูปแบบตัวเลข มักใช้เมื่อจำนวนหมวดหมู่ในตัวแปรมีมาก หรือเมื่อไม่มีลำดับหมวดหมู่โดยธรรมชาติ

ที่นี่จะสร้างคอลัมน์ที่แตกต่างกันสำหรับแต่ละหมวดหมู่ และใช้ 0,1 เพื่อแสดงว่าหมวดหมู่นั้นเป็น True หรือ False สำหรับแถวที่ระบุ ดังนั้น สำหรับทุกจุดข้อมูล คอลัมน์ใดคอลัมน์หนึ่งจะมี '1' และคอลัมน์อื่นๆ จะมีค่า '0'

#Import Libraries
from sklearn.preprocessing import OneHotEncoder

#Fitting OHE
data = data_raw.copy()
ohe = OneHotEncoder(handle_unknown='ignore')
encoding_col = ['Fruit','Color']
data_encoded = ohe.fit_transform(data[encoding_col]).toarray()
data_encoded_df = pd.DataFrame(data_encoded, columns=ohe.get_feature_names(encoding_col))
data_encoded = pd.concat([data, data_encoded_df], axis=1)

print(data_encoded)

ใน Label Encoder ขนาดของชุดข้อมูลจะไม่เปลี่ยนแปลง แต่ในกรณีของ OneHot Encoder ขนาดของชุดข้อมูลจะเพิ่มขึ้น ขึ้นอยู่กับจำนวนคอลัมน์หมวดหมู่และจำนวนหมวดหมู่ที่มี

3. ตัวเข้ารหัสลำดับ

ตัวเข้ารหัสลำดับเป็นเทคนิคการเข้ารหัสฟีเจอร์ประเภทหนึ่งที่ใช้ในการเรียนรู้ของเครื่องเพื่อแปลงตัวแปรหมวดหมู่ให้เป็นตัวแปรตัวเลข ในวิธีนี้ ค่าที่ไม่ซ้ำกันแต่ละค่าในตัวแปรหมวดหมู่จะถูกกำหนดค่าจำนวนเต็มที่ไม่ซ้ำกันตามลำดับหรืออันดับ

ตัวอย่างเช่น หากเรามีตัวแปรหมวดหมู่ “ระดับการศึกษา” ที่มีค่า “มัธยมปลาย” “ปริญญาตรี” “ปริญญาโท” และ “ปริญญาเอก” เราสามารถกำหนดค่าเป็น 1, 2, 3 และ 4 ตามลำดับ การเข้ารหัสลำดับจะถือว่ามีลำดับหรือการจัดอันดับที่มีความหมายระหว่างหมวดหมู่ และใช้ข้อมูลนี้เพื่อกำหนดค่าตัวเลข

#Import Libraries 
from sklearn.preprocessing import OrdinalEncoder

#Create Dataset 
data = pd.DataFrame({'education_level':['High School','Bachelor\'s Degree',
                                        'Master\'s Degree','PhD','High School','Master\'s Degree']})

#Define Ranks/Order 
category_ranks = {'High School': 1, 
                  'Bachelor\'s Degree': 2, 
                  'Master\'s Degree': 3, 
                  'PhD': 4}

#Ordinal Encoding 
ordinal_encoder = OrdinalEncoder(categories=[list(category_ranks.keys())], dtype=int)
data['education_level_encoded'] = ordinal_encoder.fit_transform(data[['education_level']])

print(data)

วิธีการเข้ารหัสนี้มีประโยชน์อย่างยิ่งเมื่อหมวดหมู่มีลำดับหรือการจัดอันดับที่มีความหมาย เนื่องจากสามารถเก็บข้อมูลนี้และใช้ในโมเดลแมชชีนเลิร์นนิงบางรุ่นได้

อย่างไรก็ตาม ควรใช้ความระมัดระวังเมื่อใช้การเข้ารหัสตามลำดับ เนื่องจากอาจทำให้เกิดอคติหรือข้อสันนิษฐานเกี่ยวกับข้อมูลโดยไม่ได้ตั้งใจ ตัวอย่างเช่น การกำหนดค่าตัวเลขที่สูงกว่าให้กับหมวดหมู่ที่ถูกมองว่า "ดีกว่า" หรือ "สำคัญกว่า" อาจทำให้เกิดอคติในโมเดลได้ ดังนั้นจึงจำเป็นอย่างยิ่งที่จะต้องพิจารณาการจัดอันดับหมวดหมู่และผลกระทบอย่างรอบคอบก่อนที่จะใช้การเข้ารหัสลำดับกับข้อมูลของคุณ

คุณสามารถค้นหา Notebook สำหรับบทความนี้ได้ที่นี่: คลิกที่นี่

ขอบคุณที่อ่าน :)