พื้นฐานการจำแนกประเภท: softmax และ k-nearest neighbors ใน Python
การจำแนกประเภทคือการเลือกป้ายกำกับ เช่น แมวหรือหมา โมเดลอาจให้คะแนนแต่ละคลาสแล้วใช้ softmax แปลงเป็นความน่าจะเป็น หรือใช้วิธีง่าย ๆ อย่าง k-nearest neighbors ให้ตัวอย่างที่รู้แล้วซึ่งอยู่ใกล้ที่สุดช่วยกันโหวต
แนวคิดแบบเข้าใจง่าย
การจำแนกประเภทคือการเลือกป้ายกำกับ เช่น แมวหรือหมา โมเดลอาจให้คะแนนแต่ละคลาสแล้วใช้ softmax แปลงเป็นความน่าจะเป็น หรือใช้วิธีง่าย ๆ อย่าง k-nearest neighbors ให้ตัวอย่างที่รู้แล้วซึ่งอยู่ใกล้ที่สุดช่วยกันโหวต
แปลงคะแนนเป็นความน่าจะเป็นของแต่ละคลาสด้วย softmax ประเมินด้วย cross-entropy และจำแนกจุดด้วย k-nearest neighbors
ประเด็นสำคัญ
- softmax คงลำดับของคะแนนไว้และทำให้ผลรวมเป็น 1
- categorical cross-entropy ลงโทษหนักที่สุดเมื่อตอบผิดอย่างมั่นใจ
- k-NN ไม่มีขั้นตอนการฝึก มันแค่เทียบจุดใหม่กับตัวอย่างที่เก็บไว้
- Naive Bayes และต้นไม้ตัดสินใจ (Gini impurity, information gain) เป็นตัวจำแนกคลาสสิกอื่น ๆ
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
คลิกที่ใดก็ได้บนกราฟด้านซ้ายเพื่อจำแนกจุดใหม่ด้วยการโหวตของเพื่อนบ้านที่ใกล้ที่สุด k ตัว เปลี่ยนคะแนนด้านขวาเพื่อดู softmax ตอบสนอง
โค้ดตัวอย่าง
import math
from collections import Counter
# Softmax turns raw scores into probabilities that add up to 1.
def softmax(scores):
exps = [math.exp(s - max(scores)) for s in scores]
total = sum(exps)
return [e / total for e in exps]
probs = softmax([2.0, 1.0, 0.1])
print("softmax:", [round(p, 3) for p in probs])
# Cross-entropy is small when the true class gets a high probability.
print("cross-entropy if class 0 is right:", round(-math.log(probs[0]), 3))
# k-nearest neighbours: label a point by a vote of the closest examples.
examples = [((1, 1), "cat"), ((1, 2), "cat"), ((5, 5), "dog"), ((6, 5), "dog"), ((5, 6), "dog")]
def knn(point, k=3):
nearest = sorted(examples, key=lambda e: math.dist(point, e[0]))[:k]
return Counter(label for _, label in nearest).most_common(1)[0][0]
print("(2, 1) ->", knn((2, 1)))
print("(5, 4) ->", knn((5, 4)))
ผลลัพธ์ที่คาดหวัง
softmax: [0.659, 0.242, 0.099]
cross-entropy if class 0 is right: 0.417
(2, 1) -> cat
(5, 4) -> dog
หลักการทำงาน
softmax() ยกกำลัง e ของคะแนนแล้วหารด้วยผลรวม ความน่าจะเป็นทั้งสามจึงรวมกันได้ 1 การลบค่าสูงสุดออกก่อนช่วยป้องกันตัวเลขล้น cross-entropy คือ −log ของความน่าจะเป็นของคลาสที่ถูก ส่วน knn() เรียงตัวอย่างตามระยะทางแล้วให้ 3 ตัวที่ใกล้ที่สุดโหวต
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- ฟังก์ชัน softmax เปลี่ยนคะแนนดิบให้เป็นความน่าจะเป็นที่รวมกันได้ 1 โดยไม่เกิดการล้นของตัวเลขเมื่อค่ามีขนาดใหญ่ ง่าย
- ฟังก์ชันค่าสูญเสียแบบ categorical cross-entropy วัดค่าสูญเสียของตัวจำแนกหลายคลาสจากความน่าจะเป็นที่ทำนายและคลาสที่ถูกต้อง ง่าย
- ตัวจำแนกแบบ K เพื่อนบ้านที่ใกล้ที่สุด ทำนายป้ายกำกับด้วยเสียงข้างมากของจุดฝึก k จุดที่ใกล้ที่สุด ปานกลาง
- ตัวจำแนกแบบ Naive Bayes ทำนายคลาสจากฟีเจอร์แบบหมวดหมู่ด้วยทฤษฎีบทของเบย์และการปรับเรียบแบบลาปลาซ ปานกลาง
- ค่าความไม่บริสุทธิ์ของจีนี วัดว่าป้ายกำกับในกลุ่มปะปนกันแค่ไหน ซึ่งเป็นคะแนนที่ต้นไม้ตัดสินใจใช้เลือกการแบ่ง ง่าย
- ค่าเกนข้อมูล คำนวณว่าการแบ่งตามฟีเจอร์ช่วยลดเอนโทรปีได้แค่ไหน ซึ่งเป็นเกณฑ์ของต้นไม้ตัดสินใจ ID3 ปานกลาง