Evaluate Model นั้นสำคัญอย่างไร ? : Machine Learning 101
ต้องดีขนาดไหนเธอถึงจะสนใจกัน ต้องแม่นยำขนาดไหนเธอถึงจะใช้งานมันได้ :(
บทความนี้จะมาพูดถึงเรื่องการประเมินโมเดลที่เราสร้างขึ้นมาว่า ดีพอหรือยัง ทำนายผิดเยอะมั้ย ทำนายพลาดเป็นอย่างอื่นหรือไม่ โดยโมเดลที่เราจะทำการตรวจสอบในบทความนี้คือ k-NN ที่เราเคยทำไปแล้ว
แต่ในบทความนี้จะไม่เน้นในการเขียนสูตรคำนวณมากนะครับ เพราะบางคนไม่ได้เก่งด้านคณิตศาสตร์ขนาดนั้น และเดียวนี้ก็มี lib มาช่วยในการคำนวณค่าพวกนี้แล้ว เลยจะสอนแค่เบื้องต้น + รู้จักวิธีคิดและวิธีใช้งานนั้นเอง
เราประเมินโมเดลเพื่ออะไร ??
เพื่อเช็คว่าโมเดลที่เราทำมันดีพอที่จะเอาไปใช้งานได้หรือยังโดยพิจารณาจาก ความแม่นยำ ความถูกต้อง ในบางครั้งเราก็ต้องพิสูจน์ว่าโมเดลของเราใช้งานได้ดีจริงๆหรือเปล่า เพราะทั้งหมดคือหลักวิทยาศาสตร์ คณิตศาสตร์ จะต้องพิสูจน์ได้ด้วยว่าดีจริงๆ
บางคนที่ทำการ evaluate model ก็จะทำแค่ acc ซึ่งบางครั้งก็ไม่สามารถบอกอะไรได้มากนักว่าดีหรือไม่ ผมเลยแนะนำให้ใช้ Confusion matrix และ ROC Curve ด้วยเพื่อที่จะรู้ว่าโมเดลของเราดีพอหรือยัง
ดีแค่ไหนถึงจะพอ ?
เมื่อเรานำไปใช้งานจริง แล้วพึงพอใจ นั้นเหละ ดีพอแน่นอน หรืออีกวิธีคือประเมินโมเดลแล้วแม่นยำมากกว่า 90%+ ก็จะเพียงพอ สำหรับข้อมูลขนาดเล็กๆ แต่ในบางกรณีข้อมูลของเรามีจำนวนเยอะมาก (10k data) ความแม่นยำก็อาจจะลดลงบ้าง
เริ่มจากอะไรง่ายๆก่อน
Precision,Recall,F1 Score คืออะไร ?
โดยที่
tp คือ ข้อมูลที่ทำนายแล้วถูกต้องเมื่อเทียบกับเฉลย
fp คือ ข้อมูลที่อยู่ในเฉลยแต่ไม่มีในการทำนาย (ตรงข้ามกับ fn)
fn คือ ข้อมูลที่ทำนายแล้วไม่ถูกต้องเมื่อเทียบกับเฉลย
Precision : ค่าความแม่นยำ เกิดจากการนำ ค่า tp มาเทียบกับ fp
Recall : ค่าความถูกต้อง เกิดจากการนำค่า tp มาเทียบกับ fn
F1 Score : ค่าเฉลี่ยของ Precision และ Recall
เริ่มลงมือทำ
เนื่องจากการคำนวณหาความถูกต้อง จำเป็นจะต้องคำนวณหาค่าที่แท้จริง แต่ว่าเดียวนี้ก็มี sklearn มาช่วยแล้ว เพราะฉนั้นเราไม่จำเป็นต้องเขียนคำนวณอะไรเลย แค่ใส่เฉลย กับ ผลการทำนายก็ได้ผลการคำนวณแล้ว
โดยข้อมูลตั้งต้นมาจากการทำ K-FOLD จากบทความ เพื่อให้เกิดความแม่นยำประมาณ 90 เกิดขึ้น
เรียก accuracy_score เพื่อทำการเช็คความแม่นยำของโมเดล
from sklearn.metrics import accuracy_score
accuracy_score(y_test, answer)
เรียก precision_score เพื่อทำการเช็คความแม่นยำของโมเดล
from sklearn.metrics import precision_score
precision_score(y_test, answer, average=’weighted’)
เรียก recall_score เพื่อทำการเช็คความถูกต้องของโมเดล
from sklearn.metrics import recall_score
recall_score(y_test, answer, average=’weighted’)
เรียก f1_score เพื่อทำการหาค่าเฉลี่ยของทั้ง precision และ recall
from sklearn.metrics import f1_score
f1_score(y_test, answer, average=’macro’)
แต่ sklearn สามารถรวมเอา precision,recall และ f1_score เข้าด้วยกันด้วยคำสั่งเดียวได้ด้วย classification_report
from sklearn.metrics import classification_report
print(classification_report(y_test, answer))
Confusion Matrix เมทริกซ์แห่งความสับสน
เป็นอีกหนึ่งการประเมินโมเดลโดยการนำเอาองค์ความรู้ด้านเมทริกซ์มาประกอบกันเป็นการทำ classification evaluate โดยเมทริกซ์ตัวนี้สามารถอธิบายค่า TP, TN, FN และ FP ของคำตอบของเราได้ เพื่อนำมาเช็คว่าเราทายผิดไปเยอะแค่ไหน
จากบทความนี้ Logsitic Regression ผมทำโมเดลเสร็จแล้ว เช็คแค่ Accuracy ผมเลยต้องการเช็ค confusion matrix เพิ่มเติมอีกสักหน่อย
โดยที่ค่าจะออกมาเป็น matrix ยังสามารถหา precision , recall และ f1_score ได้
- TP = 101
- FN = 25
- FP = 25
- TN = 64
ก็จะเห็นว่าผมทายผิดจากรอดเป็นตายไป 25 คน
ทายผิดจากตายเป็นรอดอีก 25 คน ทีนี้ลองทำให้ออกมาเป็นรูป confusion matrix แบบสวยๆหน่อย โดยที่สีม่วงคือทายผิดนั้นเอง ยิ่งสีเข้มยิ่งผิดเยอะ (จากรูปความแม่นยำโดยรวมประมาณ 79 %)
สรุป
เราทำ Evaluate Model เพื่อทดสอบว่าโมเดลพร้อมใช้งานหรือไม่ เป็นอีกหนึ่ง Work Flow ที่ขาดไม่ได้ เพราะมันเป็นตัวบ่งบอกว่าโมเดลของเรานั้นมีความแม่นยำเท่าไรเพื่อทำการเปรียบเทียบกับโมเดลชนิดอื่น เผื่อว่าโมเดลอื่นจะทำได้ดีกว่าโมเดลของเรา และเราสามารถหาสาเหตุและแก้ไขได้นั้นเอง
บทความถัดไป :
Linear / Poly Regression ทำนาย GDP ประเทศไทย : Machine Learning 101
บทความก่อนหน้า Under Fitting / Over Fitting ปัญหาที่มองไม่เห็นแต่สัมผัสได้ว่ามี….. : Machine Learning 101
Github : https://github.com/peeratpop/Machine_Learning_101
Medium : https://medium.com/@pingloaf
Linkedin : https://www.linkedin.com/in/peerat-limkonchotiwat/