/ Data Science

Machine Learning ตอนที่ 4: เตรียมข้อมูลเพื่อสร้าง model

ในตอนที่ 1 - 3 เราพูดถึงการทำงานของ Neural Network ซึ่งเป็น Machine Learning model ที่ใช้กันทั่วไป และมีประสิทธิภาพเมื่อมีข้อมูลที่มากพอ

ในตอนนี้ เราจะพูดถึงวิธีการจัดแบ่งข้อมูลที่เหมาะสม เพื่อใช้สอนและวัดประสิทธิภาพของ model

เตรียมข้อมูล

ก่อนอื่น เราต้องหาข้อมูลมาเพื่อใช้ในการสร้าง model ซึ่งต้องเป็นข้อมูลที่มีคำตอบ (labeled data)

  • ถ้าต้องการสร้าง model เพื่อหาโอกาสการเป็นโรค ต้องมีข้อมูลพื้นฐานของคน เช่น น้ำหนัก ความดัน ซึ่งใช้เป็นข้อมูล input และคนๆนั้นเป็นโรครึเปล่า ซึ่งใช้เป็นข้อมูล output
  • ถ้าต้องการสร้าง model เพื่อบอกเพศของคนในรูป ต้องมีรูป ซึ่งใช้เป็นข้อมูล input และเพศของคนในรูป ซึ่งใช้เป็นข้อมูล output

แบ่งข้อมูล

ข้อมูลที่เราได้มานั้น เราไม่ได้เอาสอน model ทั้งหมด เราต้องมีการจัดแบ่งและใช้งานอย่างเหมาะสม

โดยปกติเราจะแบ่งข้อมูลออกเป็น 3 ชุด

  • Training set
    เราใช้ข้อมูลชุดนี้ในการสอน Machine Learning model เพื่อให้ model เรียนรู้ parameter ที่เหมาะสม
  • Development set (ย่อว่า Dev set)
    โดยปกติแล้ว เราจะทดลองหลาย model พร้อมกัน เพราะเราไม่แน่ใจว่า model ไหนทำงานได้ดีที่สุด ซึ่งเราจะใช้ Development set เพื่อหาว่า model ตัวไหนมีความผิดพลาดน้อยที่สุด แล้วจึงเลือกใช้ model นั้น
  • Test set
    เมื่อเราได้ model ที่ดีที่สุดแล้ว เราจะใช้ Test set เพื่อวัดความผิดพลาดที่เป็นอิสระ (unbiased error)

ตัวอย่าง สมมุติว่าเราเลือก Neural Network model มาทั้งหมด 3 ตัว เพื่อบอกเพศของคนในรูปภาพ แต่ละ model อาจมีความแตกต่างกันในเรื่องจำนวน layer จำนวน node หรือค่าอื่นๆในการสอน model

layer กับ node คืออะไร
ตอนที่ 2: Neural Network
ตอนที่ 3: Deep Learning

3 models

สอน model ด้วย Training set

เราใช้ Training set ในการสอน model ด้วยขั้นตอนของ Gradient Descent

  1. ให้ model ทำนายคำตอบของข้อมูลใน Training set
  2. เทียบคำตอบจาก model กับคำตอบจริง เพื่อวัดความผิดพลาด (error)
  3. ปรับ parameter ของ model เพื่อให้ error รอบถัดไปลดลง

ทำ 1 - 3 วนไปเรื่อยๆ จน error ไม่ลดลงแล้วให้หยุด สิ่งที่เราได้มี 2 อย่าง คือ

  • model ที่ผ่านการฝึกแล้ว (มี parameter ที่เหมาะสม)
  • error สุดท้ายของ model นั้น

training set

เลือก model ด้วย Development set

จากรูปด้านบน จะเห็นว่า error ของ model ที่ 2 มีค่าต่ำสุดที่ 7.4% ดูเหมือนว่า model นี้น่าจะดีที่สุด เลือกอันนี้เลยได้มั้ย? คำตอบคือไม่ได้ เพราะว่า error นี้วัดบน training set ซึ่งเป็นข้อมูลชุดที่เราใช้สอน model

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

เช่นเดียวกัน เราต้องการวัดว่า model เข้าใจปัญหาแค่ไหน ไม่ได้วัดว่า model จำตัวอย่างได้ดีแค่ไหน ดังนั้นเราต้องวัด error จากชุดข้อมูลที่ model ไม่เคยเห็นมาก่อน เราเรียกข้อมูลชุดนี้ว่า Development set (Dev set)

development set

วิธีวัด error เหมือนกับขั้นที่ 1 - 2 ตอนเราสอน model

  1. ให้ model ทำนายคำตอบของข้อมูลใน Development set
  2. เทียบคำตอบจาก model กับคำตอบจริง เพื่อวัดความผิดพลาด (error)

ในกรณีนี้เราวัด error อย่างเดียว ไม่ได้สอน model ดังนั้นเราคำนวณเพียงรอบเดียว ไม่ต้องมีขั้นที่ 3 สำหรับปรับ parameter

จากรูปด้านบนจะเห็นว่า model ที่ 3 มีค่า error บน development set ต่ำที่สุดที่ 10.3 % ดังนั้น model ที่ 3 ถือว่าดีที่สุดจากทุก model ในการทดสอบนี้

วัด unbiased error ด้วย Test set

เมื่อเราได้ model ที่ดีที่สุดแล้ว ซึ่งในกรณีนี้คือ model ที่ 3 เราต้องการวัด error โดยใช้ข้อมูลที่เป็นอิสระจากทุกข้อมูลที่เราเคยใช้มาทั้งหมด (unbiased error) ข้อมูลชุดนี้เราเรียกว่า Test set

ค่า error นี้เป็นตัวบ่งบอกว่า เมื่อเราเอา model ไปใช้ในสถานการณ์จริง (ใช้กับข้อมูลใหม่ที่กำลังจะถูกป้อนเข้ามา) จะมี error โดยประมาณอยู่ที่เท่าไหร่

test set

Test set กับ Development set เหมือนกันในแง่ที่ว่า เป็นข้อมูลที่ไม่ได้ใช้สอน model แต่ใช้เพื่อวัดความผิดพลาดของ model เท่านั้น คำถามคือทำไมต้องมี Test set แยกกับ Development set? รวมเป็นชุดเดียวกันได้มั้ย?

แบ่งข้อมูลออกเป็น 2 ชุด (Training + Dev/Test) ได้มั้ย?

เราอาจจะเคยอ่านจากบทความอื่น ที่แบ่งข้อมูลออกเป็น 2 ชุด คือ Training set และ Dev/Test set

  • ใช้ Training set ในการสอน model เหมือนที่กล่าวด้านบน
  • ใช้ Dev/Test set ในการวัด error ของ model เพื่อเลือกว่า model ไหนดีสุด และใช้ error ตัวเดียวกันนี้แหละ เป็นค่าประมาณของ error ที่จะเกิดขึ้นในสถานการณ์จริง

ปัญหาคือ error ที่เราได้จาก Dev/Test set ในกรณีนี้จะไม่เป็นอิสระ ทำไมถึงเป็นแบบนั้น?

ถ้าย้อนกลับไปใหม่ เราใช้ข้อมูลใน Development set ในการวัด error เพื่อเลือกว่า model ไหนดีที่สุด ดังนั้น model ที่เลือกมาจะมีความสัมพันธ์กับข้อมูลชุดนี้ระดับหนึ่ง พูดอีกอย่างคือ model ที่เราเลือกทำงานได้ดี โดยการวัดด้วย Development set

ดังนั้นถ้าเราต้องการวัด unbiased error ที่แท้จริง เราต้องวัดโดยใช้ข้อมูลคนละชุดกัน ทำให้เราต้องมี Test set แยกจาก Development set

สรุปวิธีที่ถูกต้องในการแบ่งข้อมูลคือแบ่งเป็น 3 ชุด ได้แก่ Training set, Development set และ Test set

สัดส่วนของชุดข้อมูล

Development set และ Test set ถูกนำมาใช้เพื่อวัด error เท่านั้น ไม่ได้ใช้สอน model ดังนั้นเราไม่จำเป็นต้องแบ่งสัดส่วนให้ข้อมูลสองชุดนี้เยอะมาก เราแค่ต้องมีให้มากพอสำหรับการวัด error ที่มีความหมาย

ส่วนข้อมูล Training set นั้น เราใช้สำหรับสอน model ดังนั้นเราต้องมีข้อมูลชุดนี้ให้เยอะที่สุด ยิ่งเยอะยิ่งดี สัดส่วนของข้อมูลทั้งสามชุดจะเป็นประมาณนี้

data proportion

แล้วเราจะแบ่งข้อมูลออกเป็นชุดละกี่ % ดีล่ะ อันนี้ขึ้นอยู่กับว่าเรามีข้อมูลเยอะแค่ไหน

  • กรณีที่มีข้อมูลเยอะ เช่น เรามีข้อมูล 1,000,000 ตัวอย่าง

เราอาจจะแบ่ง Dev set = 10,000 ตัว (1 %) Test set = 10,000 ตัว (1 %) และ Training set = 980,000 ตัว (98 %) เพราะว่า 10,000 ตัวน่าจะเพียงพอต่อการวัด error ที่มีความหมายแล้ว และเราก็ใช้ที่เหลือทั้งหมดเป็น Traning set

  • กรณีที่มีข้อมูลน้อย เช่น เรามีข้อมูล 50,000 ตัวอย่าง

ถ้าเราแบ่ง Dev set ที่ 1% เหมือนด้านบน จะได้ข้อมูล 500 ตัว ซึ่งอาจจะน้อยไปสำหรับการวัด error ที่มีความหมาย เราอาจจะแบ่ง Dev set = 2,500 - 5,000 ตัว (5 - 10 %) Test set = 2,500 - 5,000 ตัว (5 - 10 %) และ Training set = 40,000 - 45,000 ตัว (80 - 90 %)

ผลจากการวัดค่า error

จาก model ที่ 3 ด้านบน เราจะเห็นว่า

  • error ใน Training set = 9.8 %
  • error ใน Development set = 10.3 %
  • error ใน Test set = 10.9 %

ทำไม error ของข้อมูลแต่ละชุดถึงไม่เท่ากัน ตัวเลขที่ได้ดีพอหรือยัง และเราจะปรับปรุง model ให้มี error น้อยลงได้ยังไง โปรดติดตามตอนต่อไป

Machine Learning ตอนที่ 4: เตรียมข้อมูลเพื่อสร้าง model
Share this

Subscribe to Code on the Hill