Linear regression และ logistic regression ใน Python
การถดถอย (regression) คือแมชชีนเลิร์นนิงแบบที่ง่ายที่สุด linear regression ทำนายตัวเลขด้วยเส้นตรง ส่วน logistic regression ส่งเส้นตรงนั้นผ่าน sigmoid เพื่อทำนายความน่าจะเป็นของคำตอบใช่/ไม่ใช่
แนวคิดแบบเข้าใจง่าย
การถดถอย (regression) คือแมชชีนเลิร์นนิงแบบที่ง่ายที่สุด linear regression ทำนายตัวเลขด้วยเส้นตรง ส่วน logistic regression ส่งเส้นตรงนั้นผ่าน sigmoid เพื่อทำนายความน่าจะเป็นของคำตอบใช่/ไม่ใช่
ลากเส้นตรงให้พอดีข้อมูลด้วยวิธีกำลังสองน้อยที่สุด แล้วแปลงคะแนนเป็นความน่าจะเป็นด้วย logistic regression
ประเด็นสำคัญ
- linear regression ทำนายค่าต่อเนื่อง เช่น ราคาหรืออุณหภูมิ
- logistic regression ทำนายความน่าจะเป็นสำหรับสองคลาส
- ทั้งสองแบบฝึกด้วย gradient descent แทนสูตรสำเร็จได้
- perceptron เป็นตัวจำแนกที่คล้ายกัน ซึ่งปรับน้ำหนักเฉพาะตอนทายผิด
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
คลิกที่กราฟด้านซ้ายเพื่อเพิ่มจุดและดูเส้นที่พอดีที่สุดอัปเดต ด้านขวาให้เปลี่ยน w และ b เพื่อเลื่อนเส้นแบ่งการตัดสินใจ
โค้ดตัวอย่าง
import math
# Linear regression: find the line that best fits the points (least squares).
xs = [1, 2, 3, 4, 5]
ys = [2.1, 3.9, 6.2, 8.1, 9.8]
mean_x, mean_y = sum(xs) / len(xs), sum(ys) / len(ys)
slope = sum((x - mean_x) * (y - mean_y) for x, y in zip(xs, ys)) / sum((x - mean_x) ** 2 for x in xs)
intercept = mean_y - slope * mean_x
print(f"line: y = {slope:.2f}x + {intercept:.2f}")
print("predict x=6:", round(slope * 6 + intercept, 2))
# Logistic regression turns a score into a probability with the sigmoid.
def predict_pass(hours_studied, weight=1.5, bias=-4.0):
return 1 / (1 + math.exp(-(weight * hours_studied + bias)))
for hours in (1, 3, 5):
p = predict_pass(hours)
print(f"{hours} hours -> pass probability {p:.2f} -> {'pass' if p >= 0.5 else 'fail'}")
ผลลัพธ์ที่คาดหวัง
line: y = 1.96x + 0.14
predict x=6: 11.9
1 hours -> pass probability 0.08 -> fail
3 hours -> pass probability 0.62 -> pass
5 hours -> pass probability 0.97 -> pass
หลักการทำงาน
สูตรกำลังสองน้อยที่สุดหาความชันและจุดตัดแกนที่ทำให้ผลรวมระยะห่างกำลังสองถึงจุดต่าง ๆ น้อยที่สุด ได้ y = 1.96x + 0.14 ส่วน predict_pass() คำนวณคะแนนจากจำนวนชั่วโมงที่อ่านหนังสือ แล้ว sigmoid แปลงเป็นความน่าจะเป็น โดย 0.5 คือเส้นแบ่งระหว่างสอบตกกับสอบผ่าน
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- การถดถอยเชิงเส้นอย่างง่าย (กำลังสองน้อยที่สุด) หาเส้นตรงที่เข้ากับจุดข้อมูลมากที่สุดด้วยสูตรกำลังสองน้อยที่สุด ปานกลาง
- การถดถอยเชิงเส้นด้วยการลดเกรเดียนต์ เรียนรู้ความชันและจุดตัดแกนของเส้นตรงด้วยการไล่ลงตามค่าคลาดเคลื่อนกำลังสองเฉลี่ยซ้ำๆ ปานกลาง
- การทำนายด้วยการถดถอยโลจิสติก จำแนกตัวอย่างเป็น 0 หรือ 1 โดยส่งผลรวมถ่วงน้ำหนักผ่าน sigmoid แล้วเทียบกับค่าเกณฑ์ ง่าย
- อัลกอริทึมการเรียนรู้ของเพอร์เซปตรอน ฝึกเพอร์เซปตรอนดั้งเดิม ซึ่งปรับน้ำหนักเฉพาะเมื่อทำนายผิด ปานกลาง