python #03 – Train/Validation/Test and Accuracy Assessment with Confusion Matrix

ต่อจาก python #02 – ติดตั้ง Tensorflow และ Keras ซึ่งกล่าวถึง ขั้นตอนการสร้าง Model และ วาง Layers ต่าง ๆ ของ Keras รวมไปถึง การใช้ model.summary() เพื่อแสดงโครงสร้าง Neural Network ที่สร้างขึ้นมาแล้ว

ต่อไป เป็นการ นำข้อมูลมาแบ่งเป็นชุด สำหรับ Train/Validate/Evaluate

การแบ่งข้อมูล

สมมุติมีข้อมูล ที่อาจจะมาจาก CSV File ซึ่งมี field 0 – 9 คือ ตัวแปรต้น หรือ ที่มักเรียกว่า Features และ มี field 10 เป็น ตัวแปรตาม หรือ ที่เรียกว่า Label

ทำการแบ่งข้อมูล เป็น X และ y
(วิธีการ Slice ข้อมูล จะเป็นรูปแบบ data[ row, column])

ก่อนนำไปใช้ ต้องแปลง y ให้เป็น One-Hot Encode ซึ่ง Keras เองมีเครื่องมือให้อยู่แล้ว

การแบ่งข้อมูลเป็น Train/Test สามารถทำได้หลายวิธี แต่วิธีหนึ่งที่ง่ายและสะดวก คือ ใช้ train_test_split จาก Scikit Learn ในตัวอย่างนี้ มีข้อมูลตัวอย่างน้อย คือ เพียง 5 samples จึงแบ่งสัดส่วน Test Size = 0.3 หรือ 30%

การสร้าง Model

สมมุติ เราออกแบบ Neural Network ตามภาพ กล่าวคือ มี Input Layer จำนวน 10 Nodes และ มี Hidden Layers เป็น Dense 2 ชั้น จำนวน 8 และ 5 Nodes ตามลำดับ โดยมี Activation Function เป็น Relu จากนั้น ส่งไปยัง Output Layer ที่มี 3 Nodes ใช้ Activation Function เป็น Softmax เพราะจะเป็น Categorial Classification

และ ใช้ Code ตามนี้ แล้ว Compile โดยใช้ Loss Function เป็น Categorical Crossentropy, Optimizer เป็น Adam ที่ Learning Rate 0.001 (เลือกจะตั้งค่าหรือไม่ก็แล้วแต่กรณี) และกำหนด Metrics เป้น Accuracy

การ Training

ใช้คำสั่ง fit ในการ train โดยกำหนด X_train คือข้อมูลสำหรับการสอนโมเดล และ y_train เพื่อให้โมเดลเปรียบเทียบว่าต่างจากผลที่คำนวณแค่ไหน (ผ่าน Loss Function) จากนั้นจึงทำการ Adjust Weights กลับมา (ผ่าน Optimizer) ในกระบวนการ Backpropagation
ในตัวอย่างนี้ ตั้งค่า epochs หรือ จำนวนรอบที่จะ Train และ batch_size เพื่อกำหนดว่า จะให้ใช้ X_train ครั้งละกี่ sample ส่วน verbose ใช้สำหรับกำหนดระดับการแสดงผล 0 คือ แสดงทุกกอย่าง 2 คือแสดงแค่สรุป 2 บรรทัด เป็นต้น

ในการ Train โมเดล สามารถกำหนด validation_data หรือ ข้อมูลที่ใช้ในการตรวจสอบความแม่นยำของโมเดล ระหว่างการ Train ได้ โดยอาจจะแยกข้อมูลสำหรับ Validation ออกมาต่างหากก็ได้ หรือ จะใช้ X_test, y_test ก็ได้ หรือ จะใช้ข้อมูลใน X_train, y_train แบ่งออกมา โดยการตัังค่า validation_split ก็ได้เช่นกัน

นอกจากนั้น หากข้อมูลมีความไม่สมดุลย์ของคลาส (Imbanace Classes) ก็สามารถกำหนด class_weight ให้แต่ละ Class ได้ เพื่อให้โมเดลปรับความสมดุลย์เพิ่มเติมได้ และกำหนดการสลับลำดับ (Shuffle) ได้

ส่วน Callbacks ใช้สำหรับเชื่อมต่อกับ Tensorboard ซึ่งจะกล่าวต่อไปบทความหลังจากนี้

การ Evaluate ความแม่นยำ

จะใช้ evaluate() สำหรับทดสอบความแม่นยำของโมเดล

แสดงผลในรูปของ Graph

ต้นแบบมาจาก

https://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/

ดูไอเดียนะครับ ยัง Overfit และการ Learning ยังไม่ไดี (แหะ ๆ ข้อมูลน้อย และ เป็นตุ๊กตาเท่านั้น) ที่ควรจะเป็นคือ Accuracy ควรจะค่อย ๆ เพิ่มขึ้น และ Loss ค่อย ๆ ลดลง

Confusion Matrix

ต้นแบบจาก SciKit Learn -> Confusion Matrix

https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html

วิธีการใช้งาน

หวังว่าจะเป็นประโยชน์ครับ