ออกแบบระบบการวัดผล validation score ด้วย Stratified K-Folds (2)
ก่อนที่เราจะพูดถึง Stratified K-Folds เราควรพูดถึง Simple K-Folds ก่อน โดย Simple K-Folds เป็นวิธี validation ที่สามารถแก้ปัญหาข้อ (1) ที่ว่าเรามีจำนวน data น้อยเกินไปได้ (แต่ไม่ได้แก้ปัญหาข้อ (2) ที่เรามี very imbalance data)
วิธี Simple K-Folds จะแบ่งข้อมูลเป็น K ส่วน (เรียกว่า K folds) เท่าๆ กัน และจะใช้ K-1 folds ในการสอน และ 1 fold ในการทำ validation ซึ่งดูเผินๆ ก็เหมือนการทำ validation split ธรรมดาในกระทู้ข้างบน แต่สังเกตว่าเราสามารถทำกระบวนการนี้ซ้ำได้ K ครั้ง โดยในแต่ละครั้ง fold ทดสอบเราก็จะไม่เหมือนเดิม ไล่จาก fold ที่ 1st ไปยัง fold ที่ Kth และ folds สอนก็เป็น K-1 folds ที่เหลือ
นั่นคือด้วยวิธีการ Simple K-Folds นี้ เราสามารถทำ validation split ได้ K ครั้งนั่นเอง และสังเกตว่าทุกๆ validation split จะไม่ซ้ำกันเลย และผลทดสอบทั้งหมด K ครั้งถ้าเราเอามารวมกันจะเท่ากับจำนวน Training Data พอดี ดังนั้นการทำ Simple K-Folds นี้แม้เราจะเสียเวลาในกระบวนการสอนและทดสอบเพิ่ม K เท่าตัว แต่เราใช้ข้อมูลทั้้งหมดอย่างคุ้มค่า นั่นคือเราใช้ข้อมูล Training Data ทั้งหมดเป็น Validation Set ด้วย
เนื่องจากข้อมูลที่ใช้ทำ validation มีเยอะกว่าวิธี simple split ในกระทู้บน ผล Validation score ของ Simple K-Folds ก็จะมีความแม่นยำมากขึ้นกว่า simple split มากครับ
Simple K-Folds ยังไม่ดีพอ
อย่างไรก็ดีในกรณี VSB ซึ่งเรามีปัญหา Imbalance Data อยู่ด้วย, simple K-Folds อาจให้คำตอบที่พลาดได้ในบาง fold เช่น บาง fold อาจจะบังเอิญไม่มีข้อมูล class 1 อยู่เลย (เพราะ class 1 เดิมมีน้อยอยู่แล้ว และสุ่มมาไม่อยู่ใน fold นี้เลย) ทำให้ model ที่ทำ validate บน fold นี้จะได้ Score MCC ต่ำผิดปกติ
วิธี upgrade simple K-Folds ให้จัดการ imbalance data ได้ก็คือ Stratified K-Folds ครับ!! ไอเดียของ stratified K-Folds จริงๆ แล้วง่ายมาก นั่นคือในการแบ่ง K-Folds นั้นแทนที่จะสุ่มข้อมูลอะไรก็ได้ตรงๆ เหมือน Simple K-Folds, วิธี stratified K-Folds จะสุ่มแบบการันตีว่าทุกๆ folds จะมีสัดส่วนของทุกๆ classes เท่าๆ กันด้วย ซึ่งอธิบายได้ในรูปด้านล่างครับ
โดยในภาพประกอบนี้สมมติ K=4 และเรามี Class ทั้งหมด 3 classes คือ A,B และ C โดยค่อนข้าง Imbalance โดย A มีสัดส่วนที่น้อยที่สุด และ C มีสัดส่วนที่เยอะทีสุด ตามภาพครับ ... ในการสุ่มตรงๆ ถ้าเราแบ่ง folds เป็น K folds เราอาจโชคร้ายว่าบาง fold อาจไม่มี Class A เลยก็เป็นได้
วิธีการ Stratified 4-Folds นี้การันตีว่าจะไม่มีปัญหานี้เกิดขึ้นด้วยการสุ่มแบ่ง Class A เป็น 4 ส่วนเท่าๆ กัน, แบ่ง Class B เป็น 4 ส่วนเท่าๆ กัน และ Class C เป็น 4 ส่วนเท่าๆ กันเช่นกันครับ
จากนั้นในการสร้าง Fold แต่ละ fold ก็จะสุ่มนำ 1/4 ของ Class A, B และ C มารวมกันทำให้การันตีว่าในการสุ่มแบ่ง 4 folds ตามกระบวนการนี้นั้น ทุกๆ fold จะมีสัดส่วนของ classes ทั้งหมดใกล้เคียงกับ training data ตั้งต้นครับ
ทั้งนี้ดูวิธีการสุ่มแบ่ง validation set ในแต่ละ fold (K=4) ตามรูปข้างบนเลยครับ
ไอเดียการเรียนรู้โมเดลด้วย Bidirectional LSTM
ในโพสต์ข้างบนเราได้เข้าใจ
(1) ที่มาที่ไปของปัญหา
(2) การ Formulate ปัญหาให้อยู่ในรูปของ Machine Classification
(3) มาตรวัดผล และการออกแบบกระบวนการวัดผลให้มีความแม่นยำทางสถิติ
(4) กระบวนการ Preprocess ข้อมูลเบื้องต้น
เพื่อนๆ สังเกตไหมครับว่า ในกระบวนการแก้ปัญหาต่างๆ ด้วย Deep Learning นี้เราต้องทำความเข้าใจปัญหา ออกแบบปัญหาให้อยู่ในรูปคณิตศาสตร์และออกแบบระบบทดสอบให้ดีก่อนที่จะคิดเรื่องการสร้าง Deep Learning Model ถ้ากระบวนการดังกล่าวเรียบร้อยดีแล้ว การสร้างโมเดลก็จะทำได้ง่ายขึ้นมากครับ
ในที่นี้เราจะทำนายว่าสัญญาณไฟฟ้ามาจากสายไฟที่เริ่มมีปัญหาหรือไม่ (class 1) ด้วยโมเดล LSTM ครับ โดย Model LSTM นั้นเป็น Sequential Model ที่มี Input / Output ที่อาจมองอย่างง่ายๆ ดังนี้
Input : Sequence of Vectors --> { LSTM with SoftMax } --> Output : Prediction [0 หรือ 1]
สังเกตว่า LSTM ต้องการ input เป็น "ลำดับ" (Sequence) ของ vector ในทางคณิตศาสตร์ ดังนั้นเราต้องแปลงข้อมูลสัญญาณไฟเราให้อยู่ในรูปนี้ก่อนครับ ... จริงๆ แล้วใน 1 example, ข้อมูลสัญญาณไฟ 3 เฟส (แต่ละเฟสมีค่า voltage ที่วัดมา 8แสนค่า) ที่เรามี เราอาจมองเป็น Sequence of Vectors ขนาด (800,000 x 3) ได้เลย โดยไม่ต้องทำอะไร
อย่างไรก็ดีในกรณีนี้ข้อมูลต่อ 1 example อาจจะมีขนาดใหญ่เกินไป และข้อมูลทั้งหมดทำให้หน่วยความจำของ GPU ไม่เพียงพอในการเรียนรู้ ดังนั้นเราจะใช้วิธี Sliding Windows ในการแปลงข้อมูลให้เล็กลงครับ
ไอเดียของ Sliding Windows อาจแสดงได้ง่ายๆ ดังภาพข้างล่าง โดยเราจะกำหนดขนาดของ Window ขึ้นมา (ในที่นี้เพื่อความง่ายให้ขนาดของ window = 1% ของความยาวสัญญาณ = 8,000 หน่วยวัด) และสกัด Features ต่างๆ จำนวน D features ออกมาจากข้อมูลใน window นี้ครับ โดย Features ต่างๆ อาจจะเป็นค่าทางสถิติที่สำคัญของ Signal ใน window นั้นๆ เช่น mean, sigma, percentile ต่างๆ หรือใครจะ creative วัดค่าที่ซับซ้อนขึ้นเช่น Entropy ของ window นี้ก็ได้ครับ (รายละเอียดการทำจริงดูได้ใน Workshop Notebook ตามลิงก์ข้างล่าง)
การรวม Prediction จาก K-Folds ด้วย Ensemble
เนื่องจากว่าเราออกแบบการทดสอบระบบด้วย K-Folds ใช่ไหมครับ ดังนั้นเราก็จะมีโมเดลทั้งหมด K Models ที่เราได้ฝึกสอนไว้ตามจำนวน folds, ในการทำนายจริง ถ้าเราจะเลือกเพียงโมเดลเดียวมาทำนาย ก็จะทำให้เสียคุณค่าของโมเดลอื่นๆ ไปฟรีๆ ดังนั้นวิธีการที่ง่ายและได้ผลดีก็คือ "รวมคำทำนายของทั้ง K models" เข้าด้วยกันครับ วิธีนี้เรียกว่า "K-Fold Ensemble" (คล้ายๆ Avenger Assemble :p ) ซึ่งแสดงในรูปด้านล่างครับ โดยวิธีการรวมคำทายอาจมีตั้งแต่ง่ายๆ คือเอา ค่าความน่าจะเป็นของทุกโมเดลมาเฉลี่ยกัน หรือวิธีที่ซับซ้อนมากขึ้นคือพยายามหา weights ตามความแม่นยำของแต่ละโมเดล
สำหรับเนื้อหาของปัญหา VSB หรือ ปัญหาตรวจสอบหาความผิดปกติบนสัญญาณไฟฟ้า 3 เฟส ด้วย Deep Learning model ก็อธิบายภาพรวมหมดแล้วครับ เพื่อนๆ ที่พร้อมจะลุยแก้ปัญหาจริงแล้วก็ขอเชิญเข้าไปที่ workshop ได้เลยครับ หรือถ้าผมอธิบายอะไรตกหล่นหรือมีข้อสงสัยตรงไหน เพื่อนๆ สามารถโพสต์ถามในกระทู้นี้หรือใน workshop ได้เลยครับผม
ถ้าเพื่อนๆ พร้อมแล้วสามารถเข้าไปทำ Workshop ของปัญหา VSB ได้ที่นี่เลยครับ