ตอนก่อนหน้า: บันทึก 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:

กลุ่ม 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:

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