การที่เราสร้างโมเดลๆ หนึ่งขึ้นมาทำนายผลนั้น เราจะต้องมีการวัดประสิทธิภาพของโมเดลนั้นด้วย เรื่องการวัดผลนี้ค่อนข้างสำคัญมาก ในงานวิจัยที่เราจะต้องนำเสนอสิ่งที่เราคิดค้นออกมาว่าดีแค่ไหน ในบล็อกนี้จะขอพูดถึงการวัดผลโดยใช้ปัญหาที่เรียกว่า two-class prediction (binary classification) ซึ่งเป็นการวัดประสิทธิภาพที่งานวิจัยส่วนใหญ่นิยมใช้กัน
ในปัญหานี้เราจะบอกว่าผลลัพธ์ที่ได้ว่าเป็นคลาส Positive หรือ Negative ซึ่งผลลัพธ์ที่ได้สามารถมีได้ 4 แบบ คือ
- True Positive (TP) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ p และค่าจริงๆ ก็คือ p ด้วย
- False Positive (FP) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ p แต่ว่าค่าจริงๆ แล้วคือ n
- True Negative (TN) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ n และค่าจริงๆ ก็คือ n ด้วย
- False Negative (FN) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ n แต่ว่าค่าจริงๆ แล้วคือ p
จะเห็นได้ว่า TN จะกลับกันกับ TP และ FN จะกลับกันกับ FP ตามลำดับ
หลายๆ คนจะค่อนข้างสับสนเวลาที่คำนวณค่าจริงๆ ก็จะอธิบายจากความเข้าใจของผมนะครับ และคิดว่าน่าจะเข้าใจง่ายที่สุดแล้ว (เครดิต: @b39ppr) ยกตัวอย่าง เช่น เวลาที่เราต้องการจะทำนายว่า พฤติกรรมของคนๆ นี้ผิดปกติหรือไม่? หรืออีกนัยหนึ่งคือ เราต้องการที่จะตรวจจับพฤติกรรมที่ผิดปกติของคนๆ หนึ่ง
ในที่นี้จะได้ว่า พฤติกรรมที่ผิดปกติคือคลาส Positive ส่วนพฤติกรรมปกติคือคลาส Negative จะได้ว่า
- TP คือ ระบบเราตรวจจับได้ว่าคนๆ นี้ผิดปกติ และ คนๆ นี้ได้มีพฤติกรรมผิดปกติจริงๆ
- FP คือ ระบบเราตรวจจับได้ว่าคนๆ นี้ผิดปกติ แต่ว่า จริงๆ แล้ว เค้าไม่ได้ทำอะไรผิดเลย
- TN คือ ระบบเราไม่ได้ตรวจจับอะไรเลย และ คนๆ นี้ก็ไม่ได้ทำผิด
- FN คือ ระบบเราไม่ได้ตรวจจับอะไรเลย แต่ว่า คนๆ นี้ จริงๆ แล้วเค้ามีพฤติกรรมที่ผิดปกติ!
พอนึกออกรึเปล่าครับ? ผมจะขอยกตัวอย่างอีกสักตัวอย่าง เช่น เราเขียนโมเดลระบบตรวจจับสแปมเมล ถ้าเจอสแปมเมลให้ลบทิ้งเลย (ระบบออกแนวโหดหน่อย)
ในที่นี้จะได้ว่า เมลที่เป็นสแปมคือคลาส Positive ส่วนเมลปกติคือคลาส Negative
- TP คือ ระบบทำนายว่าเมลนี้เป็นสแปม และ มันก็เป็นสแปมจริงๆ
- FP คือ ระบบทำนายว่าเมลนี้เป็นสแปม แต่ว่า จริงๆ แล้วเมลนี้เป็นเมลปกติ เช่น ข่าวสารทั่วไป เมลเกี่ยวกับงานต่างๆ
- TN คือ ระบบทำนายว่าเมลนี้เป็นเมลปกติ และ เมลนี้ก็ปกติจริงๆ
- FN คือ ระบบทำนายว่าเมลนี้เป็นเมลปกติ แต่ว่า จริงๆ แล้วมันเป็นสแปม!
ค่าที่ได้จาก 2 ตัวอย่างข้างต้นนี้ สามารถช่วยให้เราวิเคราะห์และนำไปพัฒนาโมเดลให้ดียิ่งขึ้นได้อีก จากตัวอย่างแรกจะเห็นได้ว่าค่า FN นั้นสำคัญมาก ถ้าค่า FN เราสูงไปแสดงว่า เราตรวจจับคนร้ายไม่ได้เลย และจากตัวอย่างที่สองจะเห็นได้ว่าค่า FP นั้นสำคัญ เนื่องจากเป็นระบบแนวโหดที่เวลาเจอสแปมแล้วจะลบทิ้งเลย ดังนั้นถ้าค่า FP สูง ระบบเราก็อาจจะลบเมลสำคัญๆ ของเราทิ้งไปนั่นเอง
มีสรุปเพิ่มเติมจากคุณ pat หรือคุณ @b39ppr นั่นเอง ดังนี้ครับ (มีคำถามให้คิดเล่นตอนท้าย)
การอ่าน (T,F)(P,N) แบบไม่งง
- ดูตัวหลังก่อน ว่า P หรือ N
ถ้า P คือ model ของเรา predict ว่ามันเป็น positive (เป็นคนร้าย, เป็น spam) - ต่อไปดูตัวหน้า ว่า T หรือ F
ถ้า T คือ ที่ model ของเรา predict ไปนั้น ถูกต้องแล้ว ถ้า F คือ predict ผิด
ตัวอย่าง: ระบบตรวจหา spam mail
- ตรวจหาอะไรก็ให้สิ่งนั้นเป็น positive
จะตรวจหา spam เมื่อคิดว่าเจอ spam ก็คือเจอกรณี positive - จะคำนวณ FP ทำอย่างไร?
ตอบ สำหรับ FP นั้น
2.1 ตัวหลังเป็น P ให้นับจำนวน mail ที่เรา predict ว่าเป็น “positive” (เป็น spam)
2.2 ตัวหน้าเป็น F ให้ดูว่าที่ predict ว่าเป็น spam ไปนั้น มีอันไหน “ผิด” บ้าง
เอ้า ลองคิดกันหน่อย:
มี email ใหม่ ส่งมาหาเราทั้งหมด 10 ฉบับ เข้ามาใน inbox 8 ส่วนอีก 2 เข้าไปอยู่ในกล่อง junk mail 8 mail ใน inbox นั้นมาจากคนรู้จักซะ 5 ที่เหลือเป็นเมล์ขายของ ไม่อยากได้ ส่วนในกล่อง junk mail ดันมีเมล์สำคัญจากเพื่อนอยู่ 1 ฉบับ ลองบอกค่า TP, FP, TN, FN ของระบบกรอง spam ตัวนี้มาหน่อย
หวังว่าจะมีประโยชน์นะครับ 🙂
ข้อมูลเพิ่มเติม: Receiver Operating Characteristic (ROC)
มีประโยชน์มาก ขอบคุณครับ
ขอลองสรุปดูหน่อยนะ
การอ่าน (T,F)(P,N)แบบไม่งง
- ดูตัวหลังก่อน ว่า P หรือ N
ถ้า P คือ model ของเรา predict ว่ามันเป็น positive (เป็นคนร้าย, เป็น spam)
- ต่อไปดูตัวหน้า ว่า T หรือ F
ถ้า T คือ ที่ model ของเรา predict ไปนั้น ถูกต้องแล้ว
ถ้า F คือ predict ผิด
ตัวอย่าง: ระบบตรวจหา spam mail
1. ตรวจหาอะไรก็ให้สิ่งนั้นเป็น positive
จะตรวจหา spam เมื่อคิดว่าเจอ spam ก็คือเจอกรณี positive
2. จะคำนวณ FP ทำอย่างไร?
ตอบ สำหรับ FP นั้น
2.1 ตัวหลังเป็น P ให้นับจำนวน mail ที่เรา predict ว่าเป็น "positive" (เป็น spam)
2.2 ตัวหน้าเป็น F ให้ดูว่าที่ predict ว่าเป็น spam ไปนั้น มีอันไหน "ผิด" บ้าง
เอ้า ลองคิดกันหน่อย:
มี email ใหม่ ส่งมาหาเราทั้งหมด 10 ฉบับ
เข้ามาใน inbox 8 ส่วนอีก 2 เข้าไปอยู่ในกล่อง junk mail
8 mail ใน inbox นั้นมาจากคนรู้จักซะ 5 ที่เหลือเป็นเมล์ขายของ ไม่อยากได้
ส่วนในกล่อง junk mail ดันมีเมล์สำคัญจากเพื่อนอยู่ 1 ฉบับ
ลองบอกค่า TP,FP,TN,FN ของระบบกรอง spam ตัวนี้มาหน่อย
ขออนุญาตเอาสรุปขึ้นภายในบล็อกนะครับ ขอบคุณครับ
งานวิจัยผมคือคิดค้นวิธีแก้ไวรัสโดยไม่ใช้AntiVirusแต่ผมไม่รู้ว่าจะวัดประสิทธิภาพได้อย่างไรครับ พอจะมีคำแนะนำไหมครับ ?
ที่ผมทำตอนนี้คือสุ่มไวรัส 10 ชนิด ใส่เครื่องทีละชนิด และก็แก้ชนิดละ 10 ครั้ง จับเวลาแต่ละรอบรวมก็ 100 ครั้ง ผลคือแก้ไวรัสได้ 97/100 แบบนี้นี่ถือว่าเป็นการวัดประสิทธิภาพสำหรับงานวิจัยป.โทได้ไหมครับ
@Hitzuja ผมเข้าใจว่าคุณ Hitzuja จะวัดค่า Accuracy ของโปรแกรม ผมไม่แน่ใจว่าวิธีที่ทำอยู่จะโอเคหรือเปล่านะครับ การที่เราสุ่มไวรัสมา 10 ชนิด และแก้ชนิดละ 10 ครั้ง สำหรับผมแล้ว วิธีนี้น่าจะเรียกว่าเป็นการหาค่าเฉลี่ยของการแก้ไวรัสแต่ละชนิดมากกว่า ดังนั้นการที่เรารวมเป็น 100 ก็อาจจะแปลกๆ อยู่สักหน่อยครับ
ถ้าเป็นผม ผมจะรวมโปรแกรมที่ไม่ใช่ไวรัสกับโปรแกรมที่เป็นไวรัสเข้ามาอยู่ชุดข้อมูลสำหรับทดสอบชุดเดียวกัน เช่น ไวรัส 10 และที่ไม่ใช่ไวรัสอีก 90 รวมเป็น 100 แล้วค่อยตรวจสอบประสิทธิภาพของโปรแกรมของเราครับ ว่าตรวจเจอไวรัสหรือไม่ เป็น % เท่าไหร่
ครับ
คือมันไม่ใช่โปรแกรมนะครับผม ของผมเป็นวิธีที่ผมคิดขึ้นเพื่อใช้แก้ไวรัสโดยไม่ต้องใช้ Antivirus เลย วิธีนี้จะเอามาใช้ตอนที่เครื่องโดนไวรัสแล้วค่อยเอามาแก้ครับ ผมก็เลยปล่อยไวรัสเข้าเครื่องแล้วใช้วิธีของผมนี้แก้ไปทีละตัวครับ ... แล้วถ้าผมจะวัดประสิทธิภาพว่าวิธีของผมนี้ใช้ได้จริงมากแค่ไหนนี่คุณ zkan พอจะแนะนำได้ไหมครับ ?
วิธีง่ายที่สุดในการวัดประสิทธิภาพในความคิดผมน่าจะแค่นับจำนวนไวรัสที่สามารถแก้ได้เทียบกับจำนวนของไวรัสทั้งหมดครับ
แต่ถ้าไวรัสนั้นมีมากมาย เราก็สุ่มมา 100 ตัว แล้วนับจำนวนไวรัสที่สามารถแก้ได้หารด้วย 100 ครับ ถ้าสุ่ม 10 ครั้ง ก็หาค่าเฉลี่ยครับ
ขอบคุณมากครับผม