จัดการกับข้อมูลไปจนถึงสร้างโมเดล ML มีขั้นตอนอะไรบ้าง ?
ทำใจ ยอมรับความจริง ว่ามันไม่ง่ายเลย… ล้อเล่นนนนน
หลังจากที่มีบทความ machine learning กว่าสิบบทความแล้วตัวผมเองก็ยังไม่หยุดหาความรู้ ไปลองลงเรียนคอร์สๆหนึ่งของ datacamp ที่ชื่อว่า
Supervised Learning with scikit-learn
ทีนี้ไอ้เราก็ย้อนมาดูบทความของเรา…เห้ยมันตกเรื่อง preprocessing กับ pipeline ถึงแม้เราจะแทรกๆไปในบทความของเราบ้างแต่มันน่าจะมีหัวข้อแยกออกมาเลยน่าจะดีกว่าเพราะตัว ML ต้องใช้สกิล preprocessing และ pipeline ที่มากพอตัว
ก่อนสร้างโมเดล Machine Learning ควรเตรียม data ให้พร้อมก่อน เป็นอันดับแรก
1. ตรวจเช็ค data ของเรา
การตรวจแบบง่ายที่สุดคือเรียกข้อมูลของเราออกมาดูก่อน โดยสิ่งที่เราจะต้องตรวจอย่างแรกเลยคือ Outlier data หรือข้อมูลที่แปลกประหลาดเช่น ข้อมูลรูปด้านล่าง
นั้นคือ outlier ของเรานั้นเองเราต้องทำการแปลงค่าพวกนี้ให้เป็นค่าอื่นเช่นแปลงให้เป็นค่า NaN
ทีนี้เราจะทำการดรอปค่า NaN ก็ได้ แต่ต้องระวังเพราะว่าถ้า drop ค่า NaN แล้วบางที data ของเราอาจจะหายไปเยอะอย่างเช่นรูปด้านล่าง
ถ้าเกิดมันหายเยอะแบบนี้ (ที่จริงก็ไม่ควร drop NaN) เราก็ขอเสนอนวัตกรรมที่เรียกว่า “Imputer” โดยหน้าที่ของมันคือแปลงค่าหนึ่งไปสู่อีกค่าหนึ่งได้ เช่น เราต้องการแปลงค่า NaN ให้เป็นค่าที่ปรากฏบ่อยที่สุด หรือแปลงเป็นค่า mean , median ก็ได้
โดยผลลัพธ์ก็จะประมาณนี้
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 ก็จะช่วยในส่วนของตรงนี้ได้
ทีนี้เราก็ต้องทำการ scaling ด้วยคำสั่งสองบรรทัด
แล้วลองดูผลลัพธ์เปรียบเทียบระหว่าง unscaled กับ scaled จะเห็นว่า mean และ std ต่างกันเยอะจริงๆ
ทีนี้ข้อมูลของคุณก็พร้อมใช้งานไปที่ขั้นตอนที่ต้องเสียเวลามากที่สุด
เมื่อข้อมูลพร้อม ก็ต้องเลือกโมเดลให้เหมาะสม
4. เลือกใช้โมเดล
ทีนี้เราก็ต้องมาดูว่าข้อมูลของเราเหมาะกับโมเดลชนิดไหนอีก ซึ่งนี้เป็นเพียงแค่เบื้องต้นเท่านั้นเพราะสุดท้ายแล้วเราก็ต้องรันหลายๆโมเดลเพื่อนำมาเปรียบเทียบกันนั้นเอง เพื่อหาอันที่ดีที่สุด ซึ่งในบทความที่ผมเคยเขียนก็มีอันหลักๆครบแล้ว ถ้าสงสัยอันไหนก็ลองกลับไปอ่านได้ครับ
5. การปรับ parameter
นี้ก็อีกหนึ่งปัจจัยสำคัญที่จะช่วยให้โมเดลดียิ่งขึ้น เช่นถ้าเราใช้ KNN ถ้าเราลองปรับค่า n_neighbors จาก 1–10 เราจะได้ค่าความแม่นที่ไม่เท่ากัน
แต่ละ data จะใช้ค่า parameter ที่ไม่เท่ากัน และในแต่ละโมเดลต้องปรับค่า hyper parameter ที่ไม่เหมือนกันอีก เช่น ถ้า KNN ต้องปรับค่า n_neighbors ถ้าเป็น Logistic Regression ต้องปรับค่า C นั้นเอง
ทีนี้ก็ลองปริ้นค่าว่า parameter ที่เท่าไรดีที่สุดสำหรับ data นั้นๆ และได้ค่า scores เท่าไร
6. เอาทุกอย่างมารวมกันด้วย pipeline
Pipeline เป็นอีกหนึ่ง lib ที่ผมเคยยกตัวอย่างไปใน บทความ NLP ซึ่งการทำงานของมันคือทำงานเป็นลำดับเหมือนท่อ โดยเราสามารถใส่ฟังก์ชั่นเข้าไปท่อนี้ได้เช่นรูปข้างล่าง คือการนำเอาฟังก์ชั่น Imputer ไว้จัดการค่า NaN จากนั้นนำค่าไป scale แล้วก็เข้า ML โมเดลของเราคือ ElasticNet นั้นเอง
ซึ่งรูปแบบของ Pipeline ก็คือ -> ‘Name’ , Function()
จากนั้นก็นำฟังก์ชั่นที่เราเรียงเรียบร้อยมาใส่ใน Pipeline ได้เลย
ยังไม่พอเราสามารถใช้ GridSearchCV กับ Pipeline ได้อีกด้วยโดยให้ใช้รูปแบบ Name__(2อันเดอร์สกอร์)Hyper parameter ที่ต้องการปรับ
อย่าลืมประเมินโมเดล ตรวจดูว่าพอใจกับผลลัพธ์แล้วหรือยัง
7. ทำการประเมินผลของโมเดล
ขั้นตอนนี้เราอาจต้องใช้ lib มาช่วยเยอะหน่อยเช่น f1_score,accuracy สำหรับการทดสอบเบื้องต้น แต่เราก็สามารถทำการสรุปได้ง่ายๆอีกโดยการใช้ classification_report ที่จะสรุป precision,recall,f1 ให้เราอีกด้วย
สำหรับ Regression ก็ต้องใช้ R2 หรือ MSE
บทสรุป
ในการทำ 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/