มาสร้างโมเดลทำนายปริมาณฝุ่น PM2.5 ด้วย Deep Learning กันเถอะ!

How to

ในช่วงหนึ่งเดือนที่ผ่านมา ปัญหาที่ชาวกรุงเทพทุกคนต้องเจอคงหนีไม่พ้นคือ ปัญหาจากฝุ่นละอองขนาดเล็ก PM 2.5 ซึ่งเราน่าจะได้เคยเห็นการถกเถียงปัญหานี้ในแง่มุมต่าง ๆ มากันแล้ว ไม่ว่าจะเป็นต้นตอของปัญหาในกรุงเทพ, ปัจจัยภายนอกจากสภาพแวดล้อม เป็นต้น ซึ่งวันนี้ผมจะชวนมาลองดูว่า เราพอจะเล่นอะไรสนุก ๆ กับข้อมูลเรื่องนี้ได้บ้าง

Motivations

วัตถุประสงค์ของ blog นี้คือต้องการให้เห็นว่าเราสามารถนำข้อมูลในชีวิตประจำวันต่าง ๆ มาวิเคราะห์และสร้างแบบจำลองง่าย ๆ ได้ และอยากดูว่าปัจจัยต่าง ๆ ที่เกี่ยวข้องกับปริมาณฝุ่นละออง PM 2.5 ตามที่มีพูดถึงใน Internet ไม่ว่าจะเป็นกระแสลม หรือความชื้นมีผลกับปริมาณฝุ่นละอองอย่างไร

Data

เราสามารถหาข้อมูลคุณภาพอากาศในประเทศไทยได้จากเว็บไซต์ของกรมควบคุมมลพิษ โดยข้อมูลเหล่านี้เก็บมาจากสถานีวัดคุณภาพอากาศจุดต่างๆ ทั้งหมด 62 จุดและเรียกดูข้อมูลย้อนหลังได้สูงสุด 1 เดือน

ข้อมูลที่เราได้จากเว็บไซต์ของกรมควบคุมมลพิษข้างต้นประกอบด้วยความเร็วและทิศทางลม

  • อุณหภูมิ
  • ความชื้นสัมพัทธ์
  • ปริมาณน้ำฝน
  • ปริมาณฝุ่นละออง PM 2.5

โดยเราเลือกสถานีที่อยู่ในกรุงเทพฯ และ จังหวัดที่อยู่ในแนวตะวันออก — ตะวันตกของกรุงเทพฯ และใช้ข้อมูลในช่วง 18 ธันวาคม 2561 ถึง 17 มากราคม 2562 โดยมีการเก็บข้อมูลทุก 1 ชั่วโมง ทำให้เรามีข้อมูลของฝุ่นในแต่ละช่วงเวลาด้วย

ถึงแม้ 1 เดือนจะไม่ใช่เวลาที่ไม่ยาวมาก แต่สถานการณ์ฝุ่นในช่วงเวลาดังกล่าวมีการเปลี่ยนแปลงพอสมควร จึงน่าจะเพียงพอสำหรับการทดลองเล็กๆของเราได้ครับ

Data Preparation & Exploration

ถึงเราจะได้แหล่งข้อมูลที่ค่อนข้างครบถ้วนมาแล้ว แต่ด้วยความที่เว็บไซต์ของกรมควบคุมมลพิษไม่ได้เตรียม api ไว้ให้เรียกใช้ได้โดยตรง การนำข้อมูลมาใช้ท่ายากนิดนึง คือ เราต้องไปดึงตารางจากหน้าเว็บและมาแปลงเองด้วย BeatifulSoup และ Pandas ซึ่งเราจะได้ข้อมูลออกมาในรูปแบบตาราง จากนั้นเราก็จัดการ normalise data ที่เรามี เพราะตัวข้อมูลมีการกระจายตัวที่ค่อนข้างสูง ซึ่งอาจจะส่งผลกระทบกับ performance ของ model ได้

และเรามาดูกันว่าข้อมูลที่เราได้มีลักษณะอย่างไร

ค่า PM 2.5 เมื่อเทียบกับเวลา โดนเส้นสีแดงแสดงช่วงที่มีฝนตกในบริเวณนั้น ๆ ซึ่งค่า PM 2.5 ลดลงหลังจากที่ฝนตก

ในกราฟนี้เราได้ใส่ระดับผลกระทบต่อสุขภาพตาม AQI Scale ที่บอกความรุนแรงของผลกระทบต่อสุขภาพ ซึ่งดูคร่าว ๆ เกือบครึ่งหนึ่งของข้อมูลตกอยู่ในช่วงที่มีผลกระทบต่อสุขภาพ (เกินกว่า 150)

นอกจากนั้นในกราฟยังได้ระบุวันที่มีฝนตกด้วยเส้นสีแดง ซึ่งจะเห็นว่าวันที่มีฝนตกจะทำให้ค่า PM 2.5 ลดลงอย่างเห็นได้ชัด

นอกจากนั้นเรายังเห็นว่า ปริมาณฝุ่นละออง PM 2.5 มีการเปลี่ยนแปลงเป็นขึ้นลงตามช่วงเวลา ดังนั้นเวลาก็อาจจะเป็นปัจจัยหนึ่งที่ส่งผลกระทบกับปริมาณฝุ่นละอองด้วยเช่นกัน

เราพอจะตั้งสมมติฐานคร่าวๆได้ว่า สภาพแวดล้อมต่าง ๆ เช่น กระแสลม หรือ ปริมาณน้ำฝน รวมไปถึงเวลา ส่งผลกระทบกับปริมาณ PM2.5 ซึ่งเราจะนำสมมติฐานนี้ ไปใช้ในโมเดลของเราครับ

Model

เราเลือกใช้ Gated Recurrent Units (GRUs) ซึ่งเป็น Recurrent Network รูปแบบหนึ่ง

รูปส่วนประกอบภายในของ (a) Long-Short Term Memory และ (b) Gated Recurrent Units สังเกตว่าจำนวนส่วนประกอบที่ใช้ใน GRUs น้อยกว่า LSTMs Source: Chung et. al. (2014). “Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling”

เหตุผลที่เราเลือกใช้ GRUs ในการสร้าง model ปริมาณฝุ่นละออง PM2.5 เนื่องจากตัว GRUs สามารถนำเก็บข้อมูลในอดีตมาใช้ทำนายผลลัพธ์แบบเดียวกับใน Long-Short Term Memory Network (LSTMs) แต่ใน GRUs มีจำนวน model parameters น้อยกว่า และยังไม่มีข้อสรุป้ว่า GRUs หรือ LSTMs มีความแตกต่างกันในเรื่องประสิทธิภาพ[1] เราจึงเลือกใช้ GRUs ซึ่งน่าจะเหมาะสมกับสถานการณ์ที่ข้อมูลมีจำนวนไม่มากเช่นข้อมูล PM2.5 ของเรา

ด้วยโมเดลนี้ เราจะบอกว่า ปริมาณฝุ่น PM2.5 ในพื้นที่กรุงเทพฯ ขึ้นอยู่กับปัจจัยต่างๆ ได้แก่ ความเร็วและทิศทางของกระแสลม ปริมาณน้ำฝน ความชื้นสัมพัทธ์ และเวลาต่างๆของวัน ทีนี้เราก็เอาข้อมูลทั้งหมดใส่ไปใน GRUs ของเราเพื่อให้เรียนรู้ความสัมพันธ์ และให้ออกมาเป็นค่า PM2.5 ของหนึ่งชั่วโมงข้างหน้า หรือ เวลา t + 1

และข้างล่างคือผลลัพธ์ของการ train model ของเราครับ

กราฟแสดง loss ของการ train model ของเราในแต่ละรอบ สีน้ำเงินคือ training loss และสีส้มคือ validation loss

Results

หลังจากที่เรา train GRUs model เรามาลองดูว่า model ของเราทำนายค่า PM2.5 ออกมาเป็นอย่างไรกันครับ

ผลการทำนาย PM2.5 (สีน้ำเงิน) เปรียบเทียบกันค่าจริง (สีส้ม) สังเกตว่าเส้นสีฟ้าจะนำหน้าเส้นสีส้มอยู่เล็กน้อย เนื่องจากโมเดลของเราทำนายค่าในชั่วโมงถัดไป (t + 1)

จะเห็นว่าผลการทำนาย (สีฟ้า) ค่อนข้างสอดคล้องกับค่าจริง (สีส้ม) พอสมควร ซึ่งเรานำผลการทำนายที่ได้มาเทียบกับทั้งข้อมูลที่ใช้ train (โซนสีเขียว) และ test (โซนสีเหลือง) จะเห็นว่าค่าจากการทำนายและค่าจริงมีความใกล้เคียงกันครับ

Conclusions

ด้วยข้อมูลคุณภาพอากาศที่ได้จากกรมควบคุมมลพิษ และ ผลลัพท์จากการทำนายค่า PM2.5 เราพอจะสรุปได้คร่าวๆว่า ทั้งสภาพอากาศ และ ทิศทางลม ในช่วงเวลาต่างๆ ส่งผลกับปริมาณฝุ่นละออง PM2.5 พอสมควร และ เราสามารถนำข้อมูลนี้มาสร้างเป็นแบบจำลองง่ายๆด้วย Deep Learning Model และจากสมมติฐานแบบง่ายๆของเราว่า สภาพแวดล้อมส่งผลกับปริมาณฝุ่นละออง PM2.5 ในบริเวณนั้น สามารถนำมาสร้างโมเดลทำนายปริมาณฝุ่นละอองได้ เมื่อใช้ข้อมูลปริมาณน้ำฝน ความเร็วและทิศทางลม ความชื้นสัมพัทธ์ และช่วงเวลาของวัน และได้ผลลัพธ์ที่ใกล้เคียงกับข้อมูลจริงครับ

References [1] Chung, Junyoung; Gulcehre, Caglar; Cho, KyungHyun; Bengio, Yoshua (2014). “Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling”. arXiv:1412.3555 [cs.NE].

Contact us

Drop us a line and we will get back to you