จัดการกับข้อมูลไปจนถึงสร้างโมเดล ML มีขั้นตอนอะไรบ้าง ?

Mr.P L
mmp-li
Published in
4 min readMar 21, 2019

ทำใจ ยอมรับความจริง ว่ามันไม่ง่ายเลย… ล้อเล่นนนนน

หลังจากที่มีบทความ machine learning กว่าสิบบทความแล้วตัวผมเองก็ยังไม่หยุดหาความรู้ ไปลองลงเรียนคอร์สๆหนึ่งของ datacamp ที่ชื่อว่า

Supervised Learning with scikit-learn

เรียบร้อยยยยยยยย

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

ก่อนสร้างโมเดล Machine Learning ควรเตรียม data ให้พร้อมก่อน เป็นอันดับแรก

1. ตรวจเช็ค data ของเรา

การตรวจแบบง่ายที่สุดคือเรียกข้อมูลของเราออกมาดูก่อน โดยสิ่งที่เราจะต้องตรวจอย่างแรกเลยคือ Outlier data หรือข้อมูลที่แปลกประหลาดเช่น ข้อมูลรูปด้านล่าง

สังเกตุดีๆจะพบว่ามี ‘?’

นั้นคือ outlier ของเรานั้นเองเราต้องทำการแปลงค่าพวกนี้ให้เป็นค่าอื่นเช่นแปลงให้เป็นค่า NaN

ง่ายๆโดยใช้ numpy ช่วย

ทีนี้เราจะทำการดรอปค่า NaN ก็ได้ แต่ต้องระวังเพราะว่าถ้า drop ค่า NaN แล้วบางที data ของเราอาจจะหายไปเยอะอย่างเช่นรูปด้านล่าง

หายไป 200 (เกือบครึ่ง) แบบนี้รับไม่ได้

ถ้าเกิดมันหายเยอะแบบนี้ (ที่จริงก็ไม่ควร drop NaN) เราก็ขอเสนอนวัตกรรมที่เรียกว่า “Imputer” โดยหน้าที่ของมันคือแปลงค่าหนึ่งไปสู่อีกค่าหนึ่งได้ เช่น เราต้องการแปลงค่า NaN ให้เป็นค่าที่ปรากฏบ่อยที่สุด หรือแปลงเป็นค่า mean , median ก็ได้

ง๊ายง่าย

โดยผลลัพธ์ก็จะประมาณนี้

https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html

2. การเลือก Feature

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

วิธีบ้านๆ

ใช้สามัญสำนึก เช่นบทความ Logistic Regression ที่ทำนายว่าใครจะรอดจากเรือไททานิคมากกว่ากัน

ตอนแรกผมไม่ได้ใส่เพศเข้าไปในโมเดล ผมความแม่นยำประมาณ 69% พอใส่เพศเข้าไปในโมเดลความแม่นก็กลายเป็น 79% ผมก็แค่ใช้สามัญสำนึก+ดูหนัง ว่า ผญ จะได้ลงเรือเยอะกว่า ผช แน่นอน

วิธีวิชาการ

เราสามารถเลือกแบบมีหลักการได้โดยการ plot ค่าออกมาดูและเปรียบเทียบจากบทความ Random Forest ที่เฉลยข้อสอบ Microsoft : Machine Learning นั้นเอง

เช่น seaborn แล้วเลือกใช้ boxplot นั่งดูค่าความแตกต่างของแต่ละคลาสและแต่ละคอลัม ถ้าต่างมากก็เลือกเป็น Feature ต่างน้อยก็อาจไม่เลือก แต่ก็ไม่ได้ผลเสมอไป เพราะนี้เป็นแค่ความสัมพันธ์ 1 มิติ บางครั้งถ้า plot 2 มิติออกมา (นำ 2 คอลัมมา plot เป็นความสัมพันธ์ร่วมกัน) ค่าอาจจะแตกต่างกันมากก็ได้

วิธี ML

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

3. ทำการ Centering and scaling

ปกติแล้วใน Machine Learning บางโมเดลจะใช้หลักการคณิตศาสตร์ในการหาระยะของข้อมูลแต่ละจุด เช่น KNN ที่หาเพื่อนบ้านใกล้เคียง หรือ SVM ที่หาข้อมูลที่อยู่ใกล้เส้นแบ่ง เป็นต้น

สาเหตุที่เราทำการ scaling ก็เพื่อให้ข้อมูลไม่กระจายตัว/ชิดกัน มากเกินไป เช่น ในรูปข้างล่างที่ไฮไลท์สีแดงเอาไว้จะมีค่าที่ห่างกันมากเช่น min = 6 แต่ max = 289 หรือ min = 0.99 แต่เป็น max = 1 การ scaling ก็จะช่วยในส่วนของตรงนี้ได้

https://campus.datacamp.com/courses/supervised-learning-with-scikit-learn/preprocessing-and-pipelines?ex=9

ทีนี้เราก็ต้องทำการ scaling ด้วยคำสั่งสองบรรทัด

เรียก lib และนำค่าที่ต้องการแปลงไปใส่ในฟังก์ชั่น

แล้วลองดูผลลัพธ์เปรียบเทียบระหว่าง unscaled กับ scaled จะเห็นว่า mean และ std ต่างกันเยอะจริงๆ

ทีนี้ข้อมูลของคุณก็พร้อมใช้งานไปที่ขั้นตอนที่ต้องเสียเวลามากที่สุด

เมื่อข้อมูลพร้อม ก็ต้องเลือกโมเดลให้เหมาะสม

4. เลือกใช้โมเดล

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

https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

5. การปรับ parameter

นี้ก็อีกหนึ่งปัจจัยสำคัญที่จะช่วยให้โมเดลดียิ่งขึ้น เช่นถ้าเราใช้ KNN ถ้าเราลองปรับค่า n_neighbors จาก 1–10 เราจะได้ค่าความแม่นที่ไม่เท่ากัน

แต่ละ data จะใช้ค่า parameter ที่ไม่เท่ากัน และในแต่ละโมเดลต้องปรับค่า hyper parameter ที่ไม่เหมือนกันอีก เช่น ถ้า KNN ต้องปรับค่า n_neighbors ถ้าเป็น Logistic Regression ต้องปรับค่า C นั้นเอง

สร้างค่า C ตั้งแต่ -5 จนถึง 8 ทั้งหมด 15 ค่า
จากนั้นเอาไปฝึกฝนได้เลย

ทีนี้ก็ลองปริ้นค่าว่า parameter ที่เท่าไรดีที่สุดสำหรับ data นั้นๆ และได้ค่า scores เท่าไร

best_params_ = C:3.7276 , best_score_ = 0.7708

6. เอาทุกอย่างมารวมกันด้วย pipeline

Pipeline เป็นอีกหนึ่ง lib ที่ผมเคยยกตัวอย่างไปใน บทความ NLP ซึ่งการทำงานของมันคือทำงานเป็นลำดับเหมือนท่อ โดยเราสามารถใส่ฟังก์ชั่นเข้าไปท่อนี้ได้เช่นรูปข้างล่าง คือการนำเอาฟังก์ชั่น Imputer ไว้จัดการค่า NaN จากนั้นนำค่าไป scale แล้วก็เข้า ML โมเดลของเราคือ ElasticNet นั้นเอง

ซึ่งรูปแบบของ Pipeline ก็คือ -> ‘Name’ , Function()

จัดการค่า NaN -> Scale ค่า -> เข้า ML โมเดล

จากนั้นก็นำฟังก์ชั่นที่เราเรียงเรียบร้อยมาใส่ใน Pipeline ได้เลย

ยังไม่พอเราสามารถใช้ GridSearchCV กับ Pipeline ได้อีกด้วยโดยให้ใช้รูปแบบ Name__(2อันเดอร์สกอร์)Hyper parameter ที่ต้องการปรับ

ทีนี้ก็ลองเช็คสกอกับ parameter

อย่าลืมประเมินโมเดล ตรวจดูว่าพอใจกับผลลัพธ์แล้วหรือยัง

7. ทำการประเมินผลของโมเดล

ขั้นตอนนี้เราอาจต้องใช้ lib มาช่วยเยอะหน่อยเช่น f1_score,accuracy สำหรับการทดสอบเบื้องต้น แต่เราก็สามารถทำการสรุปได้ง่ายๆอีกโดยการใช้ classification_report ที่จะสรุป precision,recall,f1 ให้เราอีกด้วย

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html

สำหรับ Regression ก็ต้องใช้ R2 หรือ MSE

https://scikit-learn.org/stable/modules/model_evaluation.html

บทสรุป

ในการทำ Machine Learning จะมีขั้นตอนการเตรียมข้อมูลและขั้นตอนการเตรียมโมเดลเยอะพอตัว ซึ่งแต่ละ dataset ก็จะต้องเตรียมตัวไม่เหมือนกันซึ่งวิธีที่จะรับมือได้ง่ายที่สุดโดยที่เราไม่ได้เทพขนาดที่จะดู data แล้วเข้าใจทะลุ 100% คือการลองรันหลายๆรูปแบบ หลายๆโมเดล ซึ่งจะทำให้เรามีข้อเปรียบเทียบและมีประสบการณ์เพิ่มขึ้นอีกด้วย

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