Unit Testing สำหรับ Machine Learning

Chalach Monkhontirapat
Equinox
Published in
4 min readNov 9, 2020

ถ้าพูดถึงการทำ Software ในสมัยนี้ ก็คงปฏิเสธไม่ได้ว่าการเขียน Unit Tests เป็นอะไรที่จำเป็นต้องมี และช่วย Coverage Bug ต่างๆ เมื่อมีการ Change Requirment ได้เป็นอย่างดี และยิ่งถ้า Team ไหนทำ TDD แล้วยิ่งไม่ต้องพูดถึงเลยว่าการเขียน Test นั้นสำคัญขนาดไหน

แต่ไหนวงการของ Data Science ในไทยปัจจุบันนั้นการทำ Machnie Learning Model มีการเขียน Unit Tests กันน้อยมากบทความนี้ก็เลยจะมาเล่าให้ฟังว่าจริงๆแล้วการเขียน Unit Tests สำหรับ Machine Learning เนี่ยมันดีจริงๆนะ 😜

💻 สิ่งที่จะได้จากบทความนี้

✔️ Why Test ?
✔️ ML System Testing Concepts
✔️ Unit Testing with Machine Learning Model

Why Test ?

หลายคนที่ไม่ได้เขียน Testsนั้นจะตั้งคำถามว่าเขียนแล้วดียังไง มันสำคัญยังไง โอ๊ยย แค่งานที่ทำก็ทำไม่ทันแล้ว ไม่มีเวลาเขียนหรอกนะ อะ นั่งลงก่อนเดี้ยวจะเล่าให้ฟัง !

เริ่มจากสมมติว่าเราเป็นบริษัททางด้าน E-Commerce Platform เช่น Shopee ซึ่งการทำงานของเราก็เพื่อ Serve Business ของ Shopee สมมติว่าเราทำ Recommendation Product หากลูกค้าดูสินค้าอะไร เราก็จะพยายาม Recommend สินค้าที่ใกล้เคียงกัน เพื่อให้ลูกค้าได้สินค้าตามที่ต้องการมากที่สุด และขายของให้ได้มากที่สุด จะเห็นได้ว่า Business นี้ได้ถูกผูกเข้ากับ ML System หรือ Software เรียบร้อยแล้ว ซึ่งนั่นหมายความว่ามันจะต้องไปควบคู่กัน จะหนักไปทางใดทางนึงก็คงไม่ดี ทีนี้ความสำคัญของการเขียน Tests เนี่ยเราจะพูดถึง 2 หัวข้อหลักๆ ดังนี้

  1. Confidence
    คือ ถ้าเรามีการ Update version ของ Machnie Learning Model แล้วเรามั่นใจแค่ไหนว่า Model ใหม่ที่เราพึ่ง Update ไปจะยังคง Recommend ถูกอยู่ ดังนั้นหากเราเขียน Testsไว้เราก็จะยังคงมั่นใจได้ว่าระบบของเรายังคงทำงานได้เป็นปกติ
  2. Reliability
    คือ ในการทำ Machnie Learning Model ในระบบที่ค่อนข้างใหญ่มักไม่ได้ทำงานคนเดียวถึงแม้ว่าเราจะมี Version Control มาจัดการเรื่องนี้แล้วแต่ความน่าเชื่อถือของระบบ ว่าเราจะสามารถรองรับเหตุการณ์ที่ไม่คาดคิดได้ หากมีคน Update function นั้นๆ แล้วเกิดทำงานที่ผิดพลาดขึ้น การเขียน Testsก็จะช่วยให้เราแก้ปัญหาตรงจุดนี้ได้

สุดท้ายแล้วทำไมเราถึงต้องเขียน Tests นั้นก็ตอบได้เพียงง่ายๆเลยว่า เป็นวิธีที่ทำให้เราเห็นว่าสิ่งที่เรา Expect กับ ML System นั้นจะยังคงทำงานถูกต้องแม้ในขณะที่เราทำการเปลี่ยนแปลงระบบนั่นเอง

ML System Testing Concepts

Traditional Test สำหรับงาน Software Development นั้นได้ถูกนำมาใช้เป็น Concepts สำหรับงาน ML System Testing โดยจะมี 3 ส่วนหลัก เหมือนกันคือ

  1. Unit Tests
  2. Integration Tests
  3. System Monitoring

แต่ในบทความนี้เราจะ Cover แค่ส่วนของการ Unit Tests ML System เท่านั้นซึ่งเจ้า Unit Tests จากรูปด้านบนเนี่ยก็จะพูดถึงตามนี้

Features and Data Tests

เป็นการ Tests ในส่วนของ Data Prepocessing ว่าข้อมูลที่เข้ามามีลักษณะตรงตามที่ต้องการมั้ย เช่น Type ผิดหรือป่าว หรือมี Outlier หรือป่าวเป็นต้น

Tests for Reliable Model Development

เป็นการ Tests ในส่วนของการ Config Model ว่า Model ที่เราพัฒนาขึ้นมาเนี่ยถูกตรงตามกับที่เรา Expect ไว้ใน Test มั้ย และยังรวมถึงการ Tests predictions ด้วยว่า Model ของเรายังมี Accuracy อยู่ใน Benchmark ที่รับได้เหมือนเดิมมั้ยเมื่อมีการเปลี่ยนแปลง

Unit Testing with Machine Learning Model

หลังจากพูดถึงทฤษฏีไปคร่าวๆ กันแล้วคราวนี้เรามาลองดูตัวอย่างของการเขียน Unit Testing สำหรับ Machine Learning Model กัน
(Code บทความนี้ใช้ .py หากใครจะทำตามทำใน Jupyter หรือ Colab จะสะดวกกว่า)

Load Data
ทำการโหลดข้อมูลจาก sklearn โดยบทความนี้จะใช้ข้อมูล Iris dataset ในการเขียนก็จะเห็นข้อมูลคร่าวๆ ของ Iris Dataset จาก Code ชุดด้านล่างนี้

Load Iris Dataset

Create Pipeline
สร้าง Pipeline สำหรับ Machine Learning ตัวนึงเป็น Logistic Regression ในการ Classification ผลลัพธ์ของ Iris Dataset ว่าจะเป็น Class ไหน

Model Pipeline
  • init :เป็น Constructor ในการกำหนดค่าต่างๆ
  • load_dataset : โหลด Dataset แล้วทำการแบ่ง Train Test ที่ Test size 0.65
  • train : Train Logistic Regression ด้วย lbfgs แบบ Multi class
  • predict : Test Model ที่เรา Train มา
  • get_accuracy: เรียกดู Accuracy ของ Model
  • run_pipline: ทำการเรียกใช้งานส่วนต่างๆที่ต้องการ
ลองเรียก Pipeline ที่เขียนมา

ทีนี้เราก็จะได้ Classification Model มาแล้ว เริ่มเขียน Tests ต่อ

👉 Unit Testing — Input Data

เป็นการ Test Input Data เราก่อน Train ว่ามี Range อยู่ในช่วงที่ต้องการมั้ย มี Outlier ที่เข้ามารึป่าว หรือ Check type ของ Feature ที่เข้ามา เป็นการ Tests ที่ช่วยยืนยันกับ Data Engineer ได้ว่าถ้ามันผิดมันผิดที่ข้อมูลที่เข้ามาไม่ตรงถามที่เราคุยกับไว้นะ อะไรทำนองนั้นนั่นเอง

Create Json Schema for Tests Dataset
ทำการสร้าง Json ในการเก็บ Structure ที่เราต้องการจะทำ Tests ขึ้นมา

Json Feature Schema

Create Unit Tests — Input Data
เขียน Unit Test ต่างๆ ตามที่เราต้องการ เช่น Test Range หรือ Test Types เป็นต้น

Unit Test — Input Data
  • setUp : run pipeline test
  • test_input_data_ranges : Test Range โดยทำการ Loop ไปทุกๆ Feature จากนั้นก็ทำการ Check จาก Max Min ใน Json Schema ที่กำหนดไว้
  • test_input_data_types : Test Range โดยทำการ Loop ไปทุกๆ Feature จากนั้นก็ทำการ Check จาก Types ใน Json Schema ที่กำหนดไว้
ลองเรียก Unit Test — Input Data

จาก Code ข้างบนถ้าเราลอง Run Tests ดูก็จะได้ผลลัพธ์ว่า

Result for Unit Test — Input Data

จะเห็นได้ว่า Run=2 ก็คือ Pass ไม่มี Errors หรือ Failures นั่นเอง แต่สีแดงก็แอบขัดใจนิดๆ เหมือนกันนะ !!!

👉 Unit Testing — Model Config

เป็นการ Test Model Config เราก่อน Train ว่ามีแก้ไข ไม่ตรงตามที่ Research Team ได้ระบุไว้ หรือตาม Backlog Requirement หรือไม่ ซึ่งก็จะส่งผลให้ Model ผิดพลาดถ้าหากไม่ตรงตามที่คุยกันไว้เนาะ !

ตัว Code สามารถใช้ต่อจากที่ทำมาข้างบนได้เลยแล้วก็เพิ่มส่วนต่างๆตามหัวข้อ

Create Pipeline Config
ทำการสร้าง Pipeline ตัวใหม่สำหรับการ Test Model Config

Model with Config Pipeline
  • init : เป็น Constructor ในการกำหนดค่าต่างๆ
  • train :Train Logistic Regression โดยดึงค่า parameter จาก config

Create Unit Tests — Model Config
เขียน Unit Test ต่างๆ ตามที่เราต้องการ เช่น Test ว่า Model parameter ที่เป็น Solver นั้นอยู่ใน List ของ Config ที่ Research Team กำหนดไว้มั้ย

Unit Test — Model Config
  • setUp : run pipeline test
  • test_pipeline_config : Test parameter solver อยู่ใน List ของ Config มั้ย
ลองเรียก Unit Test — Model Config

จาก Code ข้างบนถ้าเราลอง Run Tests ดูก็จะได้ผลลัพธ์ว่า

Result for Unit Test — Model Config

จะเห็นได้ว่า Run=1 ก็คือ Pass ไม่มี Errors หรือ Failures !!!

👉 Unit Testing — Model Quality

เป็นการ Test Model Quality เราก่อนที่จะทำการส่งมอบหรือทำการ Tests ประเภทอื่นๆถัดไป เช่น การ Test Accuracy ว่าจะต้องได้เกิน 90% สำหรับ Model A และ 80% สำหรับ Model B นะ ซึ่งพวกนี้ก็จะต้องถูกกำหนดมาจาก Backlog Requirement มาอีกทีนึง

Create Pipeline Model Quality
ทำการสร้าง Pipeline ตัวใหม่สำหรับการ Test Model Quality

Model Quality Pipeline

Create Unit Tests — Model Quality
เขียน Unit Test ตามที่เราต้องการ เช่น Test ว่า Model Accuracy > Model B เป็นต้น

Unit Test — Model Quality

จากนั้นก็ Run Unit Tests แล้วก็ลองแก้ดูสิจะได้รู้ยังไงละว่าที่ทำมาเข้าใจมั้ยยย !!!

--

--