บันทึก training data science EP 7: Metrics – สินค้าที่ผ่าน QC
ตอนก่อนหน้า: บันทึก training data science EP 6: Decision Tree – ทางแยกมันแยกยาก
ที่ผ่านมา เรารู้จักแล้วลองเล่น Supervised ML algorithm ไปทั้งสองกลุ่มแล้วนะฮะ ก็คือ Regression และ Classification เนอะ คำถามต่อมาคือ เราจะทดสอบ model ของเรายังไงดีนะ ว่ามันให้ผล prediction โอเคแค่ไหนเนี่ย
ศัพท์แสงประจำวัน
การทดสอบย่อมตามมาด้วยคำว่า “Error” เหมือนแสงคู่กับเงานั่นแหละฮะ ทีนี้ error ที่เราเจอบ่อยๆ ใน Supervised ML จะมีประมาณนี้ฮะ
- Bias
bias หรือความโน้มเอียงเนี่ย มันคือ error ที่ออกห่างจากค่าปกติ เช่น เราสำรวจข้อมูลพนักงานโรงงานแห่งนึง แล้วจู่ๆ ก็พบว่ามีบางแผนกที่อายุพนักงานปาไปเกินร้อยปีแบบนี้ ซึ่งจริงๆมันก็ควรจะไม่เกิน 50 เป็นต้นฮะ - Variance
การกระจาย มันเป็น error ที่ข้อมูลไม่อยู่เป็นกลุ่มก้อน หรือแนวโน้มเดียวกัน เช่น สำรวจข้อมูลพนักงานเหมือนเดิมฮะ แต่ไปเจอว่ามีข้อมูลการทำโอทีของแผนกนึงที่มีค่าตั้งแต่ 0 – 20 ชั่วโมง กระจายไปทั่วๆ ไม่ได้เกาะกลุ่มกันเลยแบบนี้ ก็ทำให้เรา predict ยากขึ้นฮะ - Overfitting
เป็นเหตุการณ์ที่ model ของเราจับข้อมูลทุกเม็ดทุกหน่วย เก็บหมดทุก outlier ผลลัพท์คือ เกิด bias น้อย เพราะ model จะมองว่า (เกือบ) ทุกค่าที่เห็นเป็นค่าปกติ แต่จะทำให้มี variance มาก เพราะมันจับข้อมูลที่แม้จะไม่อยู่ในแนวโน้มเดียวกันฮะ ตัวอย่างเคสนี้คือ Decision tree ฮะ - Underfitting
ตามชื่อเลย มันตรงข้ามกับ Overfitting เพราะ model เราจะจับข้อมูลที่เป็นแนวโน้มเดียวกัน อยู่ในเส้นทางเดียวกัน ทำให้เกิด bias มากเพราะ outlier ที่ไม่อยู่ในแนวโน้มนั้น แต่จะมี variance น้อยนั่นเองฮะ ตัวอย่างคือ บรรดา Linear regression และ Logistic regression ฮะ
Ref: https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229
เครื่องมือทดสอบ model มีอะไรบ้างนะ
เรารู้จัก ML algorithm ไปสองกลุ่มแล้ว เครื่องมือทดสอบ model ทั้งสองกลุ่มหลักๆเลยมีดังนี้ฮะ
กลุ่ม Regressors
เคยเล่าไปบ้างแล้วใน EP 4 นะฮะ
- \(r^2\) score
เป็นค่าวัดการทำนายเทียบกับค่าจริง ยิ่งมากยิ่งดี และมีค่าสูงสุดที่ 1 ค่านี้บอกว่า model ของเราเนี่ยมีประสิทธิภาพมากแค่ไหนเมื่อเทียบกับ baseline (นึกถึง dummy model ในตอนที่แล้วนะฮะ) - \(MedAE\) or Median Absolute Error
เป็นค่า median ของความผิดพลาด ยิ่งน้อยยิ่งดี - \(MAE\) or Mean Absolute Error
เป็นค่าเฉลี่ยของความผิดพลาด ยิ่งน้อยยิ่งดี เพราะมันจะบอกเราได้ว่า มีค่า outlier มากน้อยแค่ไหนในเนื้อข้อมูล - \(MSE\) or Mean Square Error
เป็นค่ายกกำลังสองของความผิดพลาด ยิ่งน้อยยิ่งดี ซึ่งค่านี้สามารถบอกเราได้ว่ามีค่าผิดปกติมากน้อยแค่ไหนที่ทำให้ model ของเราไม่ตั้งอยู่บนการกระจายปกติ (Normal distribution)
Reference link:
- https://medium.com/@george.drakos62/how-to-select-the-right-evaluation-metric-for-machine-learning-models-part-1-regrression-metrics-3606e25beae0
- https://peltarion.com/knowledge-center/documentation/evaluation-view/regression-loss-metrics
กลุ่ม Classifiers
- Accuracy score
เป็นคะแนนที่บอกอัตราการทำนายถูกต้อง เทียบกับจำนวนครั้งที่ทำนายไป มีค่า 0 – 1 โดย 1 คือ ค่าที่ดีที่สุดฮะ - Precision score
เป็นคะแนนบอกอัตราการทำนายถูกต้องว่าใช่ (Positive) เทียบกับจำนวนครั้งที่ทำนายว่าเป็น Positive มีค่า 0 – 1 โดย 1 คือ ค่าที่ดีที่สุด - Recall score
คือคะแนนที่บอกอัตราการทำนายถูกต้องว่า Positive โดยเทียบกับจำนวน Positive จริงๆ มีค่า 0 – 1 โดย 1 คือค่าดีที่สุด - \(F_1\) score
เป็นคะแนนที่คำนวณระหว่าง Precision score กับ Recall score ฮะ มีสมการคือ \(F_1 = (\frac{Precision^{-1} + Recall^{-1}}{2})^{-1} = 2 \cdot \frac{Precision \cdot Recall}{Precision + Recall}\) มีค่า 0 – 1 โดย 1 คือค่าที่ดีที่สุด ซึ่งส่วนใหญ่แล้วค่านี้มักจะใช้ในเคสที่เราสนใจการทำนายผิดพลาดมากกว่าฮะ เพราะส่วนใหญ่แล้วข้อมูลที่เรามีก็ไม่ได้มีสัดส่วนของค่าที่ใช่กับไม่ใช่เท่าๆกันเสียหน่อย - Confusion matrix
เป็น matrix ที่แจกแจงมาเลยว่าผลการทำนายเทียบกันกับค่าจริงเป็นเท่าไหร่ ผลรวมของ matrix จะเท่ากับขนาดของข้อมูลทดสอบเสมอฮะ แต่กระนั้น เราสามารถใช้pd.crosstab()
เพื่อให้แสดงผลลัพท์เดียวกันนี้ในรูปของDataFrame
ที่แจงเป็นอัตราส่วนได้ฮะ มีผลรวมเท่ากับ 1
Reference link:
- https://www.bualabs.com/archives/1968/what-is-confusion-matrix-what-is-metrics-accuracy-precision-recall-f1-score-difference-metrics-ep-1/
- https://medium.com/analytics-vidhya/accuracy-vs-f1-score-6258237beca2
Model Selection
Scikit-learn มอบ module ที่ช่วยเราวิเคราะห์หา model parameter ที่เหมาะสมมาให้แล้วฮะ นั่นคือ sklearn.model_selection.GridSearchCV()
module ตัวนี้สามารถช่วยเราหา parameter ที่ให้ score ที่ดีที่สุดฮะ ตัวอย่างเช่น
รูปข้างล่าง คือ ผมใช้ class GridSearchCV()
เพื่อหา parameter ที่ให้ accuracy score สูงที่สุด โดยกำหนด parameters set คือ criterion เป็น gini ส่วน max_depth อยู่ในช่วงตั้งแต่ 3 แต่ไม่ถึง 10 ส่วนค่า cv เป็น cross-validation มีค่า 3 ที่เป็นค่า default (เวอร์ชันใหม่จะเป็น 5) ของ class นี้ฮะ มันจะใช้ใน algorithm ข้างในอีกที
รันเสร็จแล้ว เราจะเห็นเลยว่า .best_params_
คือ max_depth เป็น 3 ซึ่งให้ค่า .best_score_
สูงถึง 0.76 แน่ะฮะ
เท่าที่ลองหาข้อมูลเพิ่มเติม มันมีวิธีทดสอบ model อีกเป็นล้านแน่ะฮะ ที่ยกมาเป็นตัวอย่างที่อยู่ในขั้นเบสิคๆ ฮะ แต่ก็มีประโยชน์สำหรับการทดสอบเบื้องต้นแหละ
รอบหน้าจะมาเหลาเรื่องอะไร ติดตามนะฮะ
บาย~
ตอนต่อไป: บันทึก training data science EP 8: Ensemble – Avenger's ensemble