(เครดิตภาพ : Pixabay)
ปัญหาอย่างย่อ
การแข่งครั้งนี้เป็นปัญหาเกี่ยวกับ Signal Processing โดยกำหนดให้เราสร้างโมเดลเพื่อ “detect” ความผิดปกติของสัญญาณไฟฟ้าสามเฟสครับ โดยผู้กำหนดปัญหาคือ VSB ซึ่งเป็นมหาวิทยาลัยในประเทศสาธารณรัฐเชก ดังนั้นเราขอเรียกการแข่งขันนี้ย่อๆ ว่า VSB ครับ
เว็บไซต์หลักของการแข่งขัน : https://www.kaggle.com/c/vsb-power-line-fault-detection/overview
เกริ่นนำปัญหา
เพื่อนๆ คงสังเกตเห็นสายไฟฟ้าที่เชื่อมโยงเป็นโครงข่ายไปทั่วทั้งเมืองกันทุกวันใช่ไหมครับ เนื่องจากเมืองของเรามีขนาดใหญ่ สายไฟซึ่งกระจายไฟฟ้าไปยังบ้านทุกหลังจึงย่อมมีมากขึ้นมหาศาลไปด้วย ทั้งนี้ในกรณีที่สายไฟบางเส้นเกิดปัญหาอาจส่งผลให้อุปกรณ์ไฟฟ้าหลักเสียหาย และทำให้บริเวณนั้นๆ ไม่มีไฟฟ้าใช้ได้ ทั้งนี้โดยปกติเราจะทราบว่าสายไฟ “มีปัญหา” ก็ต่อเมื่อ เราเห็นชัดเจนแล้วว่ามัน “มีปัญหาเกิดขึ้นกับเรา” เช่น ไฟดับทั้งบริเวณ เป็นต้น
จริงๆ แล้วสายไฟอาจจะ “เริ่มเสียหาย” ก่อนที่มันจะส่งผลกระทบกับอุปกรณ์ก็ได้ ซึ่งถ้าเราตรวจเจอสายไฟที่ “เริ่มมีปัญหา” เจอตั้งแต่เนิ่นๆ เราก็จะสามารถแก้ไขได้ก่อนที่จะเกิดเหตุการณ์ไฟดับ หรืออุปกรณ์ไฟฟ้าเสียหาย
อย่างไรก็ดีเนื่องจากสายไฟมีมากมายทั้งบ้านทั้งเมือง มันจึงเป็นงานที่แทบจะเป็นไปไม่ได้ที่จะส่งคนไปตรวจสอบสายไฟในทุกๆ จุด อย่างสม่ำเสมอ ดังนั้น ความหวังจึงมาอยู่กับระบบ AI ที่เมื่ออ่านค่ากระแสไฟในแต่ละจุดแล้ว สามารถบอกได้ว่าสายไฟเส้นนั้นควรจะมีปัญหาหรือไม่
(Technical Note : ความหมายของคำว่า “เริ่มมีปัญหา” หรือ "เริ่มเสียหายบางส่วน" ในที่นี้ทาง VSB กำหนดนิยามว่า มันเกิดปรากฏการณ์ “คายไฟฟ้าบางส่วน” (Partial Discharge) หรือไม่ โดยปรากฏการณ์ partial discharge ที่จะนำไปสู่การพังของสายไฟและอุปกรณ์ไฟฟ้าในอนาคตนี้นักวิศวกรไฟฟ้าจะรู้จักดีครับ)
ปัญหาทำนองนี้จัดอยู่ในกลุ่มปัญหาที่เรียกว่า "Predictive Maintainance" หรือ "การทำนายอายุการใช้งานของอุปกรณ์" ซึ่งมีความสำคัญมากๆ ในโลกปัจจุบันซึ่งเราเข้าสู่ยุคของการใช้แรงงานเครื่องจักรเป็นหลัก แทนแรงงานคน โดยเฉพาะเครื่องจักรที่เกี่ยวข้องกับงานที่ต้องเน้นความปลอดภัยขั้นสูงครับ
ข้อมูลที่การแข่งขันให้มาเพื่อเรียนรู้และทดสอบ
ข้อมูลจะเป็น “ค่า Voltage 800,000 ค่า ที่วัดได้ใน 20 milli-seconds (ms)” ซึ่งจะครบ 1 รอบกระแสไฟ (หรือ 1 รอบ Sine Wave) พอดีสำหรับเครือข่ายไฟฟ้าที่ทำงานที่ความถี่ 50Hz
การเก็บข้อมูลนั้นทำบนระบบไฟฟ้า 3 phases, ซึ่งถ้าเรานำข้อมูล 800,000 * 3 = 2.4 ล้านค่า Voltage มา plot ก็จะได้รูปข้างบนครับ
หมายเหตุ ในโจทย์นั้นแบ่งสัญญาณแต่ละ phase “แยกกัน”และในการทำนายเราสามารถตอบแยกเป็น phase ได้ว่า สัญญาณไฟของ phase ที่ 0-1 ปกติดี (class 0) แต่ phaseที่ 2 มีปัญหา (class 1) เป็นต้น
ข้อมูลสอน (training data)
สัญญาณไฟ (แยกเฟส) จำนวน 8712 สัญญาณ และข้อมูล labels ว่าเป็นสัญญาณที่มีปัญหา Partial Discharge (class 1) หรือไม่มีปัญหา (class 0)
ข้อมูลทดสอบ (testing data)
สัญญาณไฟ (แยกเฟส) จำนวน 2 หมื่นสัญญาณ
ความไม่สมดุล Imbalance ในข้อมูลสอน
ใน 8712 สัญญาณที่ให้มานั้น มีเพียงราวๆ 6% เท่านั้นที่เป็นสัญญาณที่ “มีปัญหา” ซึ่งการที่เรามีข้อมูลประเภทหนึ่งๆ (สัญญาณที่ไม่มีปัญหา) จำนวนมากกว่าอีกประเภทหนึ่งหลายเท่านั้น มักทำให้การเรียนรู้และการวัดผลยากขึ้นไปด้วย ดังนั้นเราจำเป็นต้องมีการวัดผลที่ซับซ้อนขึ้น ดังจะกล่าวในวิธีการวัดผล MCC ในหัวข้อข้างล่างครับ
จากตัวอย่างข้างล่างจะเห็นว่าสายตาของเราแยกออกได้ “ไม่ง่าย”เลย ว่าข้อมูลที่ได้มานั้นอยู่ในกลุ่มมีปัญหาหรือไม่ ดังนั้นปัญหานี้ท้าทายมากๆ ครับ
ตัวอย่างไฟที่ “มี” ปัญหา Partial Discharge (Class 1)
ตัวอย่างไฟที่ “ไม่มี” ปัญหา Partial Discharge (Class 0)
วิธีการวัดผล : Matthew Correlation Coefficient (MCC)
เนื่องจากธรรมชาติของข้อมูลมีความไม่สมดุล (imbalance) มาก (สัญญาณส่วนใหญ่ราวๆ 94%++ ไม่มีปัญหา) ดังนั้นวิธีการวัดผลความแม่นยำของ Model ด้วย Accuracy จึงไม่เหมาะสมนัก เพราะเพียงเราทำนายว่าสัญญาณไฟทุกสัญญาณ “ไม่มีปัญหา” เราก็จะได้ความแม่นยำของโมเดล 94% ซึ่งตัวเลขที่มากนี้ ทำให้เราทำความเข้าใจจุดบกพร่องของระบบและปรับจูนระบบได้ยาก
จึงเป็นที่มาของการวัดผลที่มีชื่อย่อว่า MCC ที่ทาง VSB และ Kaggle เลือกมาใช้ในการแข่งขันครั้งนี้ โดยมาตรวัด MCC ในรูปปกตินั้น สูตรจะดูซับซ้อนสักหน่อย อย่างไรก็ดีเราสามารถอธิบาย MCC ได้อย่างง่ายๆ ดังนี้ครับ
MCC = (A + B - 1)*C
โดย
A = ความแม่นยำ (Precision)ในการทายตัวอย่างบวก
B = ความแม่นยำในการทายตัวอย่างลบ
C = ความแม่นยำในการทาย “สัดส่วน” ของตัวอย่างบวกและลบ
(ผู้สนใจรายละเอียดว่า สูตร MCC นั้นแปลงมาอยู่ในรูปนี้ได้อย่างไร ดูได้ที่ Kernel ของผมที่เขียนอธิบายแยกไว้ที่นี้ครับ https://www.kaggle.com/ratthachat/demythifying-matthew-correlation-coefficients-mcc/ )
อย่างไรก็ดี เพื่อให้เข้าใจง่ายๆ คือจะได้คะแนน MCC ดีดี เราต้องทายแม่นทั้งบวกและลบ นอกจากนั้นสัดส่วนของบวกและลบที่เราทำนายก็ต้องใกล้เคียงจริงด้วย (เช่น ใน VSB คือ 6% และ 94% ตามลำดับ)
ข้อสังเกตในเรื่อง Class ของสัญญาณทั้ง 3เฟส และการ Preprocess Data เบื้องต้น
แม้ว่าในการแข่งครั้งนี้ จะแยกสัญญาณไฟแต่ละเฟสมาให้เราทำนายแยกกัน (เช่น เราอาจทำนายว่า เฟส 1 เป็น class 0 ส่วน เฟส 2 เป็น class 1) ทว่าจากการสังเกตข้อมูลสอน เราพบว่า “ข้อมูลเกือบทั้งหมด” สัญญาณไฟทั้ง 3 เฟส (ของสายไฟเส้นเดียวกัน) จะมีคลาสเดียวกันอย่างสม่ำเสมอ มีข้อมูลเพียงส่วนน้อยมากเท่านั้นที่ label ของสัญญาณบางเฟส ไม่เหมือนกับเฟสที่เหลือ
ซึ่งก็ดูสมเหตุสมผล เพราะสัญญาณทั้ง 3 เฟสมาจากสายไฟเส้นเดียวกัน ถ้าเฟสใดเฟสหนึ่งบกพร่อง ก็มีแนวโน้มที่จะทำให้สายไฟเสียหาย และทำให้อีกสองเฟสบกพร่องตามไปด้วย
ข้อสังเกตนี้ (ซึ่งสอดคล้องกับความรู้ความเข้าใจพื้นฐานของสายไฟ) เราอาจมองได้ว่าเป็น Background Knowledge หรือ Prior Information ที่เราสามารถนำมาใส่ความรู้ลงไปในโมเดล เพื่อให้แม่นยำสูงขึ้นได้
ดังนั้นในการเทรนข้อมูลสอน เราจะแปลงข้อมูลเบื้องต้นด้วยการยุบสัญญาณทั้ง 3 เฟส (3 ตัวอย่างเดิม) ให้เป็น 1 ตัวอย่างใหม่ ทั้งนี้จะทำให้จำนวนตัวอย่างเราลดลง 1/3 นั่นคือจาก 8712 Examples ใน training data เราก็จะแปลงให้เหลือเพียง 2904 Examples ครับ (โดยในแต่ละ Example ก็จะมีปริมาณข้อมูลเพิ่มขึ้นสามเท่า)
สังเกตว่า ในทางตรงข้ามถ้าเราไม่ยุบข้อมูลมารวมกัน ในกระบวนการสอน Deep Learning Model มักจะมีการ shuffle training data ซึ่งจะทำให้โมเดลไม่สามารถทราบได้เลยว่าสัญญาณเฟสไหนมาจากสายไฟเส้นเดียวกัน และจะทำให้เราสูญเสียข้อมูลสำคัญตรงนี้ และทำให้ความแม่นยำของโมเดลสุดท้ายลดลง (ซึ่งผู้เข้าแข่งขันหลายคนได้ทดลองแล้วและได้ผลตรงกันครับ)
Raw Signal หรือ Denoised Signal ?
เนื่องจากทุกๆ สัญญาณไฟฟ้าจะมีสัญญาณ Sinusoidal Waves (ในหลายช่วงความถี่) เป็นส่วนประกอบหลัก ดังเช่นเส้นสีดำเข้มในรูปข้างต้น
AI Data Scientists หลายท่านเลยมีแนวคิดว่าน่าจะถอดสัญญาณ Sinusoidal Waves เหล่านี้ออกก่อน เนื่องจากเมื่อพิจารณจาก visualization ของสัญญาณที่ไม่ดี (class 1 ดังที่แสดงในกระทู้บน) จุดสำคัญที่ตัดสินว่าสายไฟเสียหายบางส่วนหรือไม่น่าจะเป็น Variance รอบๆ Sinusoidal Signal เหล่านี้เสียมากกว่า
อย่างไรก็ดี แนวคิดนี้ก็อาจจะขัดกับแนวคิด Deep Learning ที่ว่าควรจะรักษาข้อมูลต้นฉบับให้มากที่สุด และให้ Deep Learning Model ทำการสกัด หรือ Extract information ที่สำคัญออกด้วยตัวเอง ซึ่งในความเห็นส่วนตัวของผม คิดว่าเราควรจะลองทั้งสองวิธี โดยมีวิธีการวัดผลที่ชัดเจนว่าวิธีไหนดีกว่ากัน หรืออาจจะนำผลทำนายที่ได้จากทั้งสองวิธีมารวมกันเพื่อให้ได้คำตอบที่แม่นยำที่สุดก็เป็นได้ (ทดลองทำด้วยตัวเองได้ใน Workshop ในลิงก์ข้างล่างครับ)
ในกรณีที่ต้องการใช้ Denoising Algorithm ผู้เข้าร่วมแก้ปัญหาหลายท่านได้นำเสนอหลากหลายวิธี เช่น
Wavelet Denoising https://www.kaggle.com/jackvial/dwt-signal-denoising
Fourier Denoising https://www.kaggle.com/theoviel/fast-fourier-transform-denoising
Moving Average Denoising https://www.kaggle.com/residentmario/denoising-algorithms
ออกแบบระบบการวัดผล validation score ด้วย Stratified K-Folds (1)
อย่างที่กล่าวไว้ข้างต้น ในปัญหานี้เรามี MCC score เป็นตัววัดผลหลักบน test set อย่างไรก็ดีในการแข่งขัน VSB กติกากำหนดไว้ว่าจะสามารถวัดผลบน test set ได้เพียงวันละ 2 ครั้งเท่านั้น
ดังนั้นในทางปฏิบัติเราจึงจำเป็นต้องทำ validation score ขึ้นมาเอง ซึ่งวิธีที่ง่ายที่สุดที่อาจเรียกว่า validation split คือการแบ่งข้อมูลสอนแยกไว้ส่วนหนึ่ง โดยห้ามนำข้อมูลส่วนนี้มาสอน และเรียกข้อมูลนี้เรียกว่า validation set เพื่อใช้จำลอง test set นั่นเอง ตามรูปข้างล่าง
วิธีง่ายๆ นี้ได้ผลดีในกรณีที่เรามีข้อมูลสอนปริมาณมาก ทว่าในปัญหา VSB นี้เรามีสองปัญหา
(1) เรามีข้อมูลสอนน้อยมาก (2904 examples) ดังนั้นการแบ่งข้อมูลจาก training set มาสัก 10-20% ตัว validation set อาจจะเล็กเกินไปและไม่แม่นยำเท่าไรนัก
(2) เรามีข้อมูลบวก (class 1) ในสัดส่วนที่น้อยมากๆ ถ้าเราแบ่ง validation set แบบสุ่ม อาจเป็นไปได้ว่า สัดส่วนตัวอย่างบวกใน training set กับ validation set อาจต่างกันมากและไม่สะท้อนถึงสัดส่วนแท้จริงครับ
วิธีที่จะเป็นพระเอกในการแก้ทั้งสองปัญหานี้เรียกว่า การทำ validation ด้วย Stratified K-Folds นั่นเองครับ