จัดการ Missing values ด้วย Multiple Imputation by Chained Equations
The model misses data when it’s breathing.
ในการทำงานเกี่ยวกับ Machine Learning model ข้อมูลเป็นตัวแปรที่สำคัญมากอย่างหนึ่ง เพราะเป็นจุดเริ่มต้นของทุกอย่างที่อาจส่งผลต่อการใช้งาน และข้อมูลที่ผ่านเข้ามา เกือบ 90% จะเป็นข้อมูลที่มี Missing values อยู่ด้วยเสมอ
ดังนั้นการทำให้ข้อมูลหายจากอาการ Missing values จึงเป็นสิ่งที่จำเป็นก่อนการเริ่มทำโมเดลใด ๆ การทำงานในลักษณะนี้เรียกว่า Imputation หรือการเติมข้อมูลด้วย Assumption ใด ๆ
Imputation
การทำ Imputation อาจแบ่งได้เป็น 2 แบบกว้าง ๆ คือ
- Single imputation
- Multiple imputation
การทำ Single imputation อาจไม่ได้ลงรายละเอียดมากนัก เพราะเป็นสิ่งที่คุ้นเคยกันดีอยู่แล้ว และเป็นหนึ่งในขั้นตอนพื้นฐานในการสร้างโมเดล มันเป็นขั้นตอนการแทนค่าข้อมูลด้วยคุณลักษณะ 1 มิติ เช่น การแทนค่า Missing values ด้วยค่า Mean, Medium หรือ Mode จากข้อมูลที่ Available อยู่
ในส่วนของการทำ Multiple imputation มีการนำข้อมูลหลาย ๆ ส่วนมาพิจารณาประกอบ ก่อนการแทนค่า Missing values เข้าไป เช่น มีการใช้ข้อมูลจากมิติข้างเคียง ที่อาจส่งผลต่อข้อมูลที่หายไป อาจมีการใช้ ML Model เป็นตัวช่วยในการหาค่า Estimate ที่เหมาะสม ซึ่งวิธีการ MICE ในวันนี้จะอยู่ในส่วนของ Multiple imputation
ก่อนเข้าสู่วิธีการ MICE ควรรู้จักกับลักษณะของค่า Missing values กันก่อน
Missing values
จริง ๆ ค่า Missing values มันมีรูปแบบของมันอยู่ ซึ่งถูกแบ่งออกเป็น 3 รูปแบบด้วยกันคือ
- Missing completely at random (MCAR) คือรูปแบบการหายของข้อมูล ที่ไม่สามารถหาจุดเชื่อมโยงความสัมพันธ์ได้ ซึ่งถือว่าเป็น Unrealistic assumption เพราะสิ่งที่จะเป็น True random บนโลกใบนี้มีน้อยมาก
- Missing at random (MAR) คือรูปแบบการหายของข้อมูล ที่สามารถหาจุดเชื่อมโยงได้ และจุดเชื่อมโยงดังกล่างมีความสัมพันธ์กัน ซึ่งข้อมูลในลักษณะสามารถใช้ Model เพื่อช่วยในการ Imputation ได้
- Missing not at random (MNAR) คือรูปแบบการหายของข้อมูล ที่สามารถหาจุดเชื่อมโยงได้ แต่เชื่อมโยงดังกล่าวไม่มีความสัมพันธ์กัน ดังนั้น Missing values ในลักษณะนี้จึงการยากที่จะสรุปผล ไม่สามารถวัดค่าได้
Multiple Imputation by Chained Equations
MICE หรือ Multiple Imputation by Chained Equations เป็นการเติมค่า Missing values ด้วยโมเดล ขอเล่าเป็นภาพ High-level เพราะรายละเอียดสามารถอ่านได้จาก Link ด้านล่าง
ขั้นตอนในการทำ MICE สามารถแบ่งออกได้เป็น 6 ขั้นตอน
- ใช้ Simple imputation แทนค่า Missing values ด้วย Mean หรือวิธีการใด ๆ ใน Dataset ค่าที่ถูกแทนเข้าไปด้วย Simple imputation เรียกว่า Place holder
- จากนั้น Place holder ของตัวแปรที่ต้องการทำ MICE จะถูกทำให้กลับเป็น Missing values อีกครั้ง ตัวแปรนี้เรียกว่า Var
- ตัวแปร Var จะถูกใช้เป็น Dependence variable และตัวแปรอื่น ๆ ทั้งหมดจะเป็น Independence variable ทำการ Regression เพื่อหา Prediction model สำหรับตัวแปร Var
- เมื่อได้ Prediction model มาแล้ว ค่า Place holder ของตัวแปร Var จะถูกแทนที่ด้วย Predicted values ที่เกิดจาก Model และใช้ค่าทั้งหมดของตัวแปร Var เป็น Independence variable สำหรับการหา Prediction model ของตัวแปร Var ตัวถัดไป
- ทำซ้ำตั้งแต่ขั้นตอนที่ 2–4 เพื่อหา Prediction model ของทุกตัวแปร Var ที่มีค่า Missing values จนทุกตัวแปร Var ถูกเติมเต็มทั้งหมด
- ทำซ้ำตั้งแต่ขั้นตอนที่ 2–4 เพื่อหา Prediction model ในแต่ละ Cycle เพราะในแต่ละรอบ Model อาจมีค่า Prediction ที่เปลี่ยนแปลงไป
สำหรับการหาจำนวน Cycle อาจขึ้นอยู่กับ Assumption ของแต่ละคน ซึ่งใน Paper บอกไว้ว่า 10 รอบ แต่ทั้งนี้อาจใช้ Percentages ของ Missing values เป็นตัวกำหนดได้เช่นกัน
Process ด้านบนเป็นตัวอย่างการทำงานของ MICE 1 Iteration
Code
ทดลอง Code เพื่อแสดงการทำงานของ MICE ซึ่งขอใช้เป็น Dataset ที่สร้างเองขึ้นมา (เพราะไม่รู้จะหา Dataset จากไหนมาเป็นตัวอย่าง)
Import libraries ที่จำเป็นต้องใช้งาน สำหรับการใช้งาน MICE ของ Scikit-learn ณ ตอนนี้ยังอยู่ใน Experimental phase ก่อนเริ่มต้นใช้งานต้องเปิดการใช้งาน Experimental phase ก่อนด้วย from sklearn.experimental import enable_iterative_imputer
จากนั้นให้ from sklearn.impute import IterativeImputer
ตามลำดับ
ต่อมาเป็นการสร้าง Mack-up dataset เขียนเป็น Function เพื่อให้เรียกใช้งานได้ง่าย โดยขอสร้าง Dataset ขนาด 100 Rows, 10 Columns และให้ค่า Missing rate เป็น 30% โดย Function จะทำการสุ่มเติมช่องว่างให้ DataFrame เมื่อนับรวมทั้งหมดใน DataFrame แล้ว จะมีค่า Missing values เท่ากับ 30% พอดี (แต่ละ Column ไม่เท่ากัน)
Plot แสดงผลลัพธ์จาก Dataset ที่เพิ่งสร้างขึ้นมา โดยสุ่มมาเป็นจำนวน 2 Columns และให้แสดงผลลัพธ์เปรียบเทียบข้อมูลที่สมบูรณ์ กับข้อมูลที่มี Missing values
ข้อมูลเส้นสีส้มคือข้อมูลชุดสมบูรณ์ ส่วนเส้นประสีเขียว เป็นข้อมูลที่โดยแทนค่า np.nan
เข้าไป ช่วงที่หายไปจะทำการแทนที่ด้วย MICE
ขอใช้เป็น Linear regression model ในการทำ Imputation ซึ่งโมเดลสร้างมากเปลี่ยนไปได้ตามที่ต้องการ อาจใช้เป็น Support Vector Machine หรือ Random forest ก็ได้
จากนั้นสร้างตัวแปรเพื่อเก็บ Imputation object IterativeImputer()
โดยที่ Parameters ที่ใส่ด้านในมีให้เลือกมากมาย แต่ขอใช้เฉพาะ 3 ตัวนี้คือ
estimator
คือ Imputer model ที่เลือกเอาไว้ก่อนหน้านี้max_iter
คือจำนวนรอบที่ต้องการ Estimate ในที่นี้ขอเลือกเท่ากับ Missing values percentinitial_strategy
คือ Simple imputer ที่ใช้ในการ Fill ข้อมูลรอบแรก ในที่นี้ขอเลือเป็นค่าเฉลี่ย หรือmean
เมื่อได้ Imputation object แล้ว สามารถสั่ง .fit()
เพื่อ Fitting MICE ได้เลย
เมื่อใช้คำสั่ง .transform()
จะ Return เป็น Array ซึ่งสามารถนำไปใช้ใน Process อื่นต่อได้ในโมเดล ใช้ Function plotCompare()
ที่เขียนไว้ก่อนหน้า เพื่อดูผลลัพธ์ที่ออกมาจากการทำ Imputation โดยไม่เปลี่ยน Random columns เพื่อให้สามารถเปรียบเทียบผลได้ง่าย
เส้นสีส้มยังคงเหมือนเดิม เพราะเป็น Dataset ชุดสมบูรณ์ แต่เส้นประสีเขียวได้ถูกเติมให้เต็มด้วย MICE เรียบร้อยแล้ว
Conclusion
จบแล้วสำหรับเทคนิคการทำ MICE เพื่อการเติมข้อมูลที่หายไปด้วย ML Model อาจไม่ได้เป็นวิธีการที่ดีที่สุด หรือวิธีการที่ให้ผลลัพธ์ใกล้เคียงค่าจริงที่สุด แต่ถือเป็นทางเลือกที่น่าสนใจ สำหรับการแก้ไขปัญหาเรื่องความสมบูรณ์ของข้อมูล
สำหรับ Notebook เกี่ยวกับเนื้อหาของตอนนี้ สามารถ Refer ได้จาก Link ด้านบน