แนวคิด AI ด้วย Python

พื้นฐานการจำแนกประเภท: 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 ตอบสนอง

โค้ดตัวอย่าง

รันโค้ด →
main.py
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 และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น

  1. เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
  2. พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
  3. แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
รันใน Python IDE →

ฝึกด้วยโจทย์

ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI

โจทย์ทั้งหมด