Data Preprocessing นั้นสำคัญอย่างไร ? แล้วจะทำเมื่อไหร่ ?

Mr.P L
mmp-li
Published in
4 min readApr 30, 2019

เป็นอีกหนึ่งหัวข้อที่เป็นหัวใจสำคัญของ Machine Learning

ที่จริงในการทำ Machine Learning มีหัวใจสำคัญอยู่ 2 อย่างเลยคือการ Clean data และ Preprocessing Data นั้นเอง ในบทความต่างๆผมจะพยายามแทรกๆเข้ามาด้วยแต่ยังไม่เป็นเรื่องเป็นราว โดยในรอบนี้จะมาทำบทสรุปของ Preprocessing เพื่อให้นำไปใช้งานกันแบบจริงจัง

https://hackernoon.com/what-steps-should-one-take-while-doing-data-preprocessing-502c993e1caa?gi=a29b073a8f9f

บทความรอบนี้จะเป็นการสรุปคอร์สที่ชื่อว่า

Preprocessing for Machine Learning in Python

อะไรคือ Data Preprocessing ?

Data Preprocessing คือขั้นตอนหลังจาก Clean data เป็นการเตรียมข้อมูลของเราให้พร้อมนำไปใช้กับ Machine Learning Model เช่น การเลือก Feature หรือ การแปลงข้อความเป็นตัวเลข (ซึ่ง ML โมเดลต้องการ Input ที่เป็นตัวเลขเท่านั้น) ซึ่งต่างจาก Clean data ตรงที่ Clean data จะเน้นไปที่การทำให้ข้อมูลถูกต้องมากกว่าเช่น การจัดการกับข้อมูลประเภท Nan or NULL หรือจัดการกับ Outlier data โดยจะเน้นไปทางด้าน Data Analysis ซะมากกว่า

ความสำคัญของการทำ Preprocessing ?

หลักๆเลยที่เราจะเห็นได้บ่อยที่สุดคือการ “Standardizing Data” , “Feature Engineering” และ “Feature Selection” เราทำ 3อย่างนี้เพื่อให้ข้อมูลอยู่ในฟอร์มที่ถูกต้องมากขึ้นเพื่อความแม่นยำและถูกต้องมากที่สุดของโมเดล โดยจะแยกออกมาได้ 3 หัวข้อได้แก่

หัวข้อที่ 1 : Scaling Data คือ ? แล้วทำเพื่ออะไร ?

อะไรคือ Scaling ? กับ 4 ข้อหลักๆในการ Scale

โดยภายในคอร์สจะยกตัวอย่างมา 4 ข้อซึ่งสามารถอธิบายสาเหตุว่าทำไมถึงต้อง Scaling ได้อย่างดีได้แก่

ข้อที่ 1 Feature ของเรามีขนาดข้อมูลที่ต่างกัน

โดยปกติแล้วภายใน dataset ของเราจะมีข้อมูลที่มีความสัมพันธ์กัน แต่ข้อมูลเหล่านั้นมีค่า “Variance” (ค่าความแปรปรวน) / ค่า “mean” (ค่าเฉลี่ย) ของข้อมูลซึ่งเราต้องปรับให้ความแปรปรวนข้อมูลเหล่านี้มีค่าเท่ากันและปรับให้ค่าเฉลี่ยมีค่าเท่าๆกันก่อนที่จะนำข้อมูลไปใช้

แต่ละคอลัมน์ค่า variance ไม่เท่ากันเลย

จากนั้นให้ทำการ Scaling ด้วยฟังก์ชั่น StandardScaler จะพบว่าค่า variance มันเท่ากันซึ่งโดยปกติฟังก์ชั่น Scale จะเป็นการทำให้ variance มีค่าเป็น 1 หรือใกล้เคียง ซึ่งจะเป็นเหตุผลของข้อที่ 3–4

หลังจากทำ Scale แล้วค่า variance จะใกล้เคียงกันหมดเลย

ข้อที่ 2 Machine Learning Model ที่เราจะใช้เป็นประเภท “Linear” เช่น Linear Regression หรือ KNN เป็นต้น

ถ้าใครเคยอ่านบทความของ KNN / Linear Regression โดยเราจะยกตัวอย่างกับ KNN หลักการของมันคือการเอาข้อมูลมาวางบนกราฟ แล้วเวลาจะ predict คือเอาข้อมูลที่จะ predict มาวางไว้บนกราฟเดียวกันแล้วหาว่าข้อมูลที่ใกล้ๆกับมันเป็นคลาสอะไรนั้นเอง โดยโมเดลประเภท Linear จะเน้นไปที่การหาระยะนั้นเอง

ข้อที่ 3–4 ทำให้การ Scale ค่ามีผลมากกับ Linear Model

ถ้าเกิดข้อมูลของเราผ่านการ Scale มาแล้ว ค่าความแปรปรวนก็จะเท่าๆกันในทุกๆ feature และอีกทั้งยังทำให้ค่า mean ของข้อมูลของเราเป็นกลางมากขึ้นอีก และแปลงข้อมูลของเราด้วยวิธีการแจกแจงปรกติ โดยเมื่อ Scale ข้อมูลแล้วจะยิ่งทำให้การหาระยะไม่ผิดเพี้ยนนั้นเอง

Example : การ Scale ส่งผลต่อโมเดลขนาดไหน ?

โดยภายในคอร์สได้ทดสอบกับ dataset ที่ชื่อว่า “Wine Dataset” ซึ่งมีอยู่ภายใน sklearn อยู่แล้ว

โดยจะมีข้อมูลทั้งหมด 13 feature โดยใช้โมเดล KNN เปรียบเทียบระหว่างข้อมูลที่ Scale และ UnScale นั้นเอง

โดยเมื่อลองกับข้อมูลที่ยังไม่ Scale จะได้ค่าความแม่นยำ = 0.644 ถือว่าน้อยมากยังไม่ดีพอจะใช้งานได้

ใช้ฟังก์ชั่น score() ภายในโมเดลเพื่อวัดค่าความแม่นยำได้เลย

แต่เมื่อลองกับข้อมูลที่ Scale เรียบร้อยแล้ว ความแม่นยำ = 0.933 ถือว่าเพิ่มขึ้นมากจากเดิม

เพิ่มขึ้นราวๆ 0.30 เลยนะเนี่ย

ทำให้เราเห็นแล้วว่าการ Scale ข้อมูลก่อนสร้างโมเดลมันทรงพลังขนาดไหน แต่ทั้งนี้ทั้งนั้นเพราะ feature ของ dataset นี้ทั้ง 13 คอลัมน์เป็นตัวเลขไม่ใช่ตัวอักษรจึงไม่มีปัญหาอะไร เแต่ถ้าเป็นตัวอักษรละอย่างเช่น เพศ / ใช่หรือไม่ / หัวข้อ(title) จะทำอย่างไรละ ? จึงเกิดสิ่งที่เรียกว่า Feature Engineering ขึ้นมานั้นเอง

หัวข้อที่ 2: Feature Engineering คือ ?

หัวข้อนี้ไม่ค่อยยากเท่าไหร่ เพราะเป็นแค่การใช้ให้ถูกต้องเฉยๆ ไม่ได้มีหลักคณิตศาสตร์มาเกี่ยวอะไรมากนัก สาเหตุที่เราต้องทำ Feature Engineering เพราะ Machine Learning Model นั้นต้องการ input ที่เป็นตัวเลขนั้นเอง มันไม่สามารถนำตัวอักษรเป็น input ได้จะต้องทำการแปลงก่อนนั้นเอง แต่การจะแปลงนั้นก็มีหลักการเหมือนกัน

ปัญหาแรก : การแปลงตัวอักษรจำพวก “ประเภท” มาเป็นตัวเลข

จะเห็นว่ามีทั้ง y/n หรือ blue/green/orange

การแปลงข้อความพวก ประเภท (Category) จะง่ายที่สุดเพราะส่วนมากจะเป็นข้อความสั้นๆ และมีจำนวนไม่มากก็จะทำได้ 3 วิธีซึ่งผลลัพธ์จะต่างกันและใช้งานต่างกัน

  • วิธีแรก ใช้ฟังก์ชั่นภายในของ pandas

วิธีนี้เหมาะสำหรับกรณีที่เราใช้ pandas ในการเปิดไฟล์อยู่แล้ว เราก็ใช้ build-in funcion ได้เลย โดยใช้ apply() ซึ่งเราจะต้องรู้ก่อนว่าเรามีประเภทอะไรบ้างและยังสามารถกำหนดได้ว่าจะเปลี่ยนข้อความเป็นตัวเลขยังไงได้อีกด้วย

ถ้ามี dataframe อยู่แล้วก็ใช้ build-in function ไปเลย
  • วิธีที่สอง แปลงข้อความเป็นตัวเลข (Label Encoder)

วิธีนี้คือแปลงประเภทข้อความของเราเป็นตัวเลข 0 1 2 3 ไปเลยแต่ไม่เหมาะจะนำไปเป็น input ของ model เหมาะสำหรับเป็น output มากกว่าเพราะเลข 0,1,2,3 ที่เราแปลงออกมาจะไม่มีความเกี่ยวข้องกัน ทำให้วิธีต่อไปเหมาะสมมากกว่า

sklearn.preprocessing -> LabelEncoder
  • วิธีที่สาม แปลงข้อความเป็น 1-hot

วิธีนี้เป็นที่นิยมในการทำ Machine Learning และ Deep Learning เพราะจะทำการแปลงข้อความเป็นเลข 0 และ 1 โดยที่จะเป็น 1 ก็ต่อเมื่อมีข้อมูลชนิดนั้นๆ และจะเป็น 0 เมื่อไม่มีข้อมูลชนิดนั้นๆ โดยที่เมื่อแปลงเป็น 1 hot แล้วข้อมูลของเรายังมีความสัมพันธ์กันอยู่ไม่หายนั้นเอง

ใช้ get_dummies หรือ sklearn.preprocessing.OneHotEncoder ก็ได้

ปัญหาที่สอง: การแปลงตัวอักษรจำพวก “ข้อความ” เป็นตัวเลข

ปัญหานี้ส่วนมากจะเป็นการทำ Text Classification หรืองานประเภท Natural Language Processing ซะมากกว่า โดยผมเคยเขียนไว้ในบทความนี้แล้ว

ซึ่งการจะแปลงข้อความทั้งหมดเป็นตัวเลขนั้นทำได้หลายแบบไม่ว่าจะเป็นการทำ

Countvectorizer เพื่อสร้าง bag-of-word

TF-IDF เพื่อนับจำนวนความถี่ของคำที่ปรากฏ

Word Embedding แปลงข้อความเป็น Vector ที่กำลังเป็นที่นิยมในขณะนี้

Word2Vec ที่กำลังโด่งดังในขณะนี้

ซึ่งตัวอย่างของการใช้ 3 วิธีนี้ก็ได้ยกตัวอย่างไว้หมดแล้วบทความ NLP นั้นเอง

หรือจะเป็นบทความอื่นๆเช่น

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

หัวข้อที่ 3: Feature Selection คือ ?

เป็นการเลือก Feature เพื่อที่จะใช้กับ model ของเราเป็นขั้นตอนสุดท้ายของ preprocessing ซึ่งการเลือก Feature ที่ถูกต้องนั้นจะช่วยส่งผลกับโมเดลของเราอย่างมากและทำให้เราได้เห็น insight ของข้อมูลแบบชัดเจนอีกด้วย

ซึ่งเราจะเลือก Feature ด้วย 2 วิธีง่ายๆได้แก่

  • หา Correlated Features

เป็นวิธีที่ง่ายที่สุดเพียงแค่ใช้คำสั่ง corr() ก็จะได้แสดงความสัมพันธ์ระหว่าง Feature แต่ละอันนั้นเอง ยิ่งอันไหนใกล้ 1 มากที่สุดก็จะยิ่งสัมพันธ์ต่อกันมากขึ้นเช่น A กับ B มี ค่าความสัมพันธ์กันที่ 0.787 ซึ่งถือว่ามากอยู่ แต่เมื่อนำ A เทียบกับ C ก็จะมีเพียงแค่ 0.543 ซึ่งน้อยกว่าเยอะ B เยอะมาก

แบบ Manual วิธีที่ 1
  • Dimention Reduction การลดมิติข้อมูล

เป็น model ของ Unsupervised Learning ซึ่งหน้าที่ของถ้าอธิบายแบบง่ายๆคือลดมิติของข้อมูลลงนั้นเอง โดยจะเลือก Feature ที่ส่งผลต่อโมเดลเท่านั้น

ส่วนตัวอย่างการลดมิตินั้นผมเคยทำบทความไว้แล้ว ซึ่งเป็นการใช้ NMF จะต่างกับ PCA แค่กำหนดมิติว่าจะลดเหลือเท่าไหร่ในตอนต้น

เมื่อเราทำทั้ง 3 อย่างครบแล้วเพียงเท่านี้เราก็นำโมเดลของเราไปเข้าสู่กระบวนการ Machine Learning Engineering ได้เลย

บทสรุป

การ Scale ข้อมูลนั้นเป็นสิ่งที่มือใหม่หลายๆคนและผมได้มองข้ามและไม่ให้ความสำคัญกับมัน แต่เมื่อเราได้ลองทำการเปรียบเทียบระหว่าง Scale และ Unsclae ก็น่าจะเห็นความต่างกันแล้วและเรื่องของ Feature Selection ก็เป็นสิ่งที่สำคัญเช่นกัน หากเลือก Feature ได้ดี ตัว Model ของเราก็จะมีความแม่นยำเพิ่มมากขึ้นอีกด้วย

Github : https://github.com/peeratpop/Machine_Learning_101

Medium : https://medium.com/@pingloaf

Linkedin : https://www.linkedin.com/in/peerat-limkonchotiwat/

บทความนี้เป็นส่วนหนึ่งของบทความ

เริ่มเรียน Machine/Deep Learning 0–100 (Introduction)

--

--

Mr.P L
mmp-li
Editor for

Lifestyle of Programmer & IoT (Node-RED|Blynk) & Data Science (ML,DL,NLP) and Whatever I want to do | cat can coding too | Ph.D. -> VISTEC -> IST