Finding MCI! MoCA-clock Time-Series Classification

Pannawit Wantae
3 min readNov 5, 2023

--

สวัสดีครับ! ผมกองทัพนะครับ วันนี้ผมมีเรื่องราวเกี่ยวกับโครงการที่ผมได้ทำในช่วงที่เข้าร่วมโครงการ Brain Code Camp 2023 มาเล่าให้ฟังกันครับ

Introduction

มาเริ่มกันที่ ที่มาของโครงการนี้กันดีกว่าครับ อย่างที่เรารู้ว่าแบบทดสอบ MoCA — Montreal Cognitive Assessment ที่ออกแบบมาเพื่อเป็นเครื่องมือคัดกรองอย่างเร็วสำหรับภาวะสมองเสื่อมระยะแรกเริ่ม โดยประกอบด้วย Tasks สั้น ๆ ที่สามารถประเมินหน้าที่ของการทำทำงานของสมองด้านต่าง ๆ ได้แก่ ความตั้งใจ (Attention) สมาธิ (Concentration), การบริหารจัดการ (Executive Function), ความจำ (Memory), ภาษา (Language), มิติสัมพันธ์ (Visuoconstruction), ความคิดรวบยอด (Conceptual Thinking), การคิดคำนวน (Calculation), และการรับรู้สภาวะรอบตัว (Orientation) หนึ่งใน Task ที่ผมสนใจนั่นคือ Visuoconstruction Skill จากการวาดหน้าปัดนาฬิกา โดยการทดสอบนั้นจะให้ผู้เข้ารับการทดสอบวาดหน้าปัดนาฬิกาโดยให้เข็มนาฬิกาชี้ไปที่เวลา 11:10 น. ส่วนการนับคะแนนจะแบ่งออกเป็น 3 ส่วนด้วยกัน นั่นคือ รูปร่าง ตัวเลข และเข็ม และมีคะแนนรวม 3 คะแนน โดยปกติแล้วการวัดผลการทดสอบจะทำโดยการใช้การมองภาพที่ผู้เข้ารับการทดสอบวาดหรือเขียนออกมา แต่ในปัจจุบัน มีการเก็บข้อมูลแบบ Time-series ในขณะที่ผู้ป่วยจรดปากกาลงบนแท็บเล็ตที่ใช้ทดสอบ วันนี้ผมเลยจะพาทุกคนมาดูการคัดแยกผู้ป่วยที่มีลักษณะเข้าข่าย MCI โดยการใช้ข้อมูลแบบ Time-Series กันครับ

Thai MoCA Test

Dataset

เรามาดูกันต่อที่ Data ที่เราได้มากันครับ

นี่เป็นหน้าตาของการจรดปากกาจากการวาดภาพหน้าปัดนาฬิกาใช้บอกเวลา 11:10 น. ของผู้เข้ารับการทดสอบแต่ละคนครับ แต่ละคอลัมน์จะบอกข้อมูลที่เป็นประโยชน์ของการทดสอบนี้ อย่างเช่น position x, position y ซึ่งเป็นคู่อันดับของการจรดปากกาของผู้เข้ารับการทดสอบครับ และอีกหนึ่งคอลัมน์ที่สำคัญคือ drawtime ครับเพราะจะเป็นตัวที่บอกเราว่าผู้เข้ารับการทดสอบใช้เวลาในการวาดภาพช้าหรือเร็วได้นั่นเอง แต่จากข้อมูลข้างต้นเรายังไม่รู้ว่าผู้เข้ารับการทดสอบนั้นมีผลการประเมินเป็นอย่างไรใช่มั้ยล่ะครับ เราจึงต้องเอาผลการทดสอบของแต่ละคน ซึ่งบอกได้จากการ Match ด้วยคอลัมน์ patient_id เข้ากับ Dataset ที่บอก score ของการทดสอบนี้ครับ

ทาดาาา! ได้มาแล้ว Dataset ที่มีทั้ง score ที่เป็นได้ทั้ง 0, 1, 2, 3 ในการทดสอบนี้ เรามาลอง plot ดูกันดีมั้ยครับว่าหน้าตาของ posx, posy ของผู้เข้ารับการทดสอบเป็นอย่างไรกันบ้าง

ถ้าไม่บอกว่าแต่ละกราฟได้คะแนนเท่าไหร่กันเนี่ยแยกออกกันมั้ยครับว่า ผู้เข้ารับการทดสอบได้คะแนนเท่าไหร่ ยากมากเลยใช่มั้ยล่ะครับ ดังนั้น เรามาลองให้โมเดลปัญญาประดิษฐ์แยกให้เรากันเถอะ!

แต่ทว่า การที่เราจะตัดสินว่าผู้เข้ารับการทดสอบนี้เข้าข่ายการเป็นผู้ป่วย MCI หรือไม่ เราตัดสินใจจากการทดสอบนี้ Task เดียวไม่ได้แน่ ๆ ใช่มั้ยล่ะครับ ดังนั้น ผมจึงเอา patient_id มา Match อีกครั้ง แต่ครั้งนี้เป็นการ Match กับ Korkai Dataset ที่บอกเราได้ว่าผู้เข้ารับการทดสอบคนนี้เป็น MCI หรือไม่ ทำให้เราสามารถตีความได้แล้วว่าคนไหนป่วยหรือไม่ป่วย ซึ่งจะเป็นประโยชน์ในการสอนให้โมเดลปัญญาประดิษฐ์สามารถคัดแยกผู้ป่วย MCI จากการใช้ข้อมูลแบบ Time-series นั่นเองครับ!

จากนั้น ผมก็ทำการจัดการข้อมูลที่มี Missing Data กล่าวคือ ใน Korkai Dataset ไม่มี patient_id นี้อยู่ออกไป แล้วทำการเลือกคอลัมน์ที่น่าจะเป็น feature ที่สามารถใช้แยกผู้ป่วย MCI ออกมาได้ อย่างเช่น score, posx, posy, drawtime, และ force_strength และเลือกคอลัมน์ที่เป็น Target หรือสิ่งที่เราอยากจะให้โมเดลปัญญาประดิษฐ์ทำนายออกมา ซึ่งในที่นี้คือ diag หรือการที่เป็น MCI หรือไม่นั่นเอง จากนั้นผมได้แบ่งข้อมูลที่ใช้สำหรับการ train และ test เป็นอัตราส่วน 0.8 : 0.2 ครับ

Random Forest

มาดูกันที่อัลกอริทึมแรกที่ผมเลือกใช้นะครับ นั่นก็คือ Random Forest นั่นเอง ก่อนอื่น เราลองเทรนบน base model กันเลย โดยผมจะใช้เมทริกซ์ accuracy, f1-score ในการประเมินประสิทธิภาพโมเดลเป็นหลักนะครับ และนี่คือผลลัพธ์ที่ได้ครับ

ได้ accuracy สูงถึง 97% !!! สูงมากเลยทีเดียว แต่อย่าพึ่งดีใจไปครับ เพราว่าข้อมูลที่เราใช้เทรนมีความไม่เท่ากันของจำนวนข้อมูลอยู่ (Imbalanced Data) ทำให้เราต้องดู f1-score เพื่อความมั่นใจในการใช้โมเดลนี้ ก็พบว่ามีค่าสูงอยู่พอสมควร ดังนั้น หากเรานำโมเดลนี้ไปใช้ก็น่าจะมีผลลัพธ์ที่ดีใช่มั้ยล่ะครับ

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

k-Nearest Neighbor

มาดูกันต่อที่อัลกอริทึมถัดไป นั่นก็คือ KNN นั่นเอง โดยโมเดลนี้ผมจะลองทำ GridSearch เพื่อหาค่า parameter ที่ดีที่สุดด้วย อย่ารอช้ามาดูผลลัพธ์กันเลยดีกว่าครับ

KNN ให้ accuracy, f1-score ต่ำลงมาจาก Random Forest อยู่พอสมควรเลยนะครับ โดยที่มี parameter ที่ดีที่สุดคือ n_neighbor = 3, weights = distance หรือก็คือ การมองหาเพื่อนบ้านที่เหมือนกัน 3 คน โดยมีหลักคิดคือ เพื่อนบ้านที่อยู่ใกล้เราที่สุดจะรู้จักเราดีที่สุดนั่นเองครับ

Conclusion

เป็นยังไงกันบ้างครับ จากการลองใช้ทั้ง 2 Machine Learning Algrithm ดู จะพบว่า Random Forest Algorithm ให้ความแม่นยำกับเรามากกว่า k-Nearest Neighbor ครับ แต่ถึงยังไง การนำโมเดลไปใช้จริงยังคงต้อง ดูคะแนนจากส่วนอื่น ๆ ร่วมกันเพื่อตัดสินว่าผู้เข้ารับการทดสอบนี้เป็นผู้ป่วย MCI หรือไม่อยู่ดีนะครับ

จบกันไปแล้วนะครับ สำหรับเรื่องราวเกี่ยวกับโครงการที่ผมได้ทำในโครงการ Brain Code Camp 2023 ยังไงก็ต้องขอขอบพระคุณผู้สนับสนุน อาจารย์ และพี่ ๆ TA ที่ได้ช่วยให้โครงการนี้สำเร็จลุล่วงไปได้ด้วยดีนะครับ แล้วเจอกันใหม่ครับ!

--

--