Confusion Matrix Explained

พ.ค. เข้าสู่หน้าฝนแล้ว แอดนั่งกินข้าวเที่ยงอยู่กับเพื่อน เลยลองให้เค้าทายเล่นๆว่าเย็นนี้ฝนจะตกหรือไม่ตก? เพื่อนมองออกไปดูฟ้าครึ้มๆก็เลยตอบว่า “กูว่าเย็นนี้ฝนตกแน่ๆ”

และนี่คือตัวอย่างง่ายๆของการทำ prediction ใช้ชีวิตประจำวัน เวลาที่เราพยายามจะทำนาย outcome ที่มีได้สองค่า (ฝนตก|ไม่ตก) นักสถิติเรียกปัญหานี้ว่า Binary Classification Problem

พอเราสร้างโมเดลสถิติขึ้นมาทำนาย binary outcome แล้ว ขั้นตอนต่อไปคือการวัดความถูกต้อง (accuracy) ของผลการทำนาย ด้วยตาราง Confusion Matrix ซึ่งใช้กันอย่างแพร่หลายในงาน machine learning ทุกวันนี้


Confusion Matrix Explained

ไอเดียของ confusion matrix นั้นเรียบง่าย จริงๆมันคือตาราง crosstabs ขนาด 2×2 ทั่วไป โดยแกนนอนคือ actual result ส่วนแกนตั้งคือ prediction result หน้าตาเหมือนรูปด้านล่าง

Confusion Matrix
Confusion Matrix: Accuracy = (2 + 4) / 10 = 0.6

สมมติเราพยากรณ์อากาศล่วงหน้าไป 10 วัน (ทายว่าฝนตก 6 วัน และฝนไม่ตกอีก 4 วัน) แล้วก็เทียบความจริงกับสิ่งที่เราพยากรณ์ไว้ว่าถูกทั้งหมดกี่ครั้งในสิบวันข้างหน้า?

  • ตัวเลขในตารางคือความถี่ รวมกันทุกช่องต้องเท่ากับ 10
  • ช่องซ้ายบน เราทายว่าฝนจะไม่ตกและฝนไม่ตกจริงๆ (actual = prediction)
  • ช่องขวาล่าง เราทายว่าฝนจะตกและฝนตกจริงๆ (actual = prediction)
  • เรามีทายผิดอยู่สองช่อง ด้านขวาบนและซ้ายล่าง (actual  prediction)

วิธีอ่านค่าในตาราง ใช้แค่คณิตศาสตร์ บวก ลบ คูณ หารง่ายๆ โดย accuracy วัดได้จากผลรวมของตัวเลขในเส้นทแยงมุม (diagonal) หารด้วยจำนวน observations ทั้งหมด

  • accuracy = (2 + 4) / (2 + 2 + 2 + 4) = 0.60
  • error rate = 1 – accuracy = 1 – 0.60 = 0.40

โดยที่ accuracy (0.6) + error rate (0.4) รวมกันต้องมีค่าเท่ากับ 1 พอดี (หรือ 100%)


R Tutorial

ใน R เราใช้ฟังชั่น table ในการสร้าง confusion matrix และคำนวณ accuracy ด้วยฟังชั่น sum และ diag ง่ายๆด้วยโค้ดตัวอย่างด้านล่าง

# create dataframe with two columns: actual and predicted
actual <- c(1,1,0,0,1,1,1,0,1,0)
predicted <- c(1,1,0,1,0,1,1,0,0,1)
data <- data.frame(actual, predicted)

# create confusion matrix using table() function
table1 <- table(data$actual, data$predicted, 
                dnn = c("ACTUAL", "PREDICTED"))
print(table1)

# compute model accuracy
model_accuracy <- sum(diag(table1)) / sum(table1)
print(model_accuracy)

# compute error rate
print(1 - model_accuracy)

พอรันเสร็จแล้วจะได้ค่า accuracy = 0.6 และ error rate = 0.4


Technical Details on Improving Accuracy

ถึงแม้ว่าการทำนายผลอะไรก็ตามให้ถูกต้อง 100% ทำได้ยากในทางปฏิบัติ แต่ machine learning researchers ในช่วงสิบปีที่ผ่านมาก็พัฒนาเทคนิคใหม่ๆที่ช่วยเพิ่ม accuracy ได้

วิธีที่ง่ายที่สุดที่ช่วยให้ algorithms ของเราทำนายผลได้ดีขึ้นคือการเพิ่มจำนวน data points รวมถึงการเลือกใช้ algorithms หลายๆแบบในการแก้ปัญหา classification เช่น logistic regression, decision tree, random forest, neural networks ฯลฯ และเลือกตัวที่ performance ดีที่สุด

อีกหนึ่งเทคนิคที่เรียกว่าเป็น Gold Standard ของการทดสอบโมเดล machine learning คือ Cross-Validation แถมยังช่วยลดปัญหา Overfitting อีกด้วย


Final Thoughts

Confusion Matrix คือตารางสำคัญในการวัดความสามารถของ machine learning ในการแก้ปัญหา classification ยังมีรายละเอียดอีกหลายอย่างเกี่ยวกับตารางนี้ เช่น การคำนวณค่า sensitivity | specificity | precision | recall | F1-score เดี๋ยวเราจะมาอธิบายในตอนต่อๆไป

ตัวอย่างวันนี้แสดงวิธีการสร้าง confusion matrix สำหรับปัญหา binary classification problem ตารางจะมีขนาด 2×2 แต่ถ้า outcome ของเรามีมากกว่าสองค่า เช่น การทำนาย customer segments (สมมติมี 6 segments) ตาราง confusion matrix ก็จะมีขนาด 6×6 และเราสามารถคำนวณ accuracy ได้ตามเส้นทแยงมุมเหมือนเดิม


ปล. ที่มาของชื่อ Confusion Matrix มาจากการที่โมเดลของเราสับสนระหว่าง actual กับ predicted values เลยทายผลผิด แฮร่!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.