สวัสดีครับทุกท่าน สำหรับบล็อกนี้ขอเล่าที่มาก่อนนิดนึง ถ้าขี้เกียจอ่านข้ามไปได้เลยนะครับ
ช่วงที่ผ่านมานี้ผมไปหัดเรียนเทคนิคต่างๆเกี่ยวกับ machine learning มา (หาหนังสือมาอ่านบ้าง หรือดูคลิปบน youtube ไปเรื่อยบ้าง)
แล้วเริ่มรู้สึกว่า เฮ้ย มันเยอะแฮะ มันมีอะไรหลายอย่างมากเลยเลยคิดว่า ถ้าเราแค่เรียนๆดูๆทำเองไปอย่างเดียว เดี๋ยวกลัวว่าเวลาผ่านไปอาจจะลืมเลยคิดจะเขียนซีรีย์ขึ้นมาซักซีรีย์นึงเกี่ยวกับ machine learning ล้วนๆเลย เผื่อซักวันลืมจะได้มาอ่านเอง
ก็เลยเป็นที่มาของบทความตอนแรกนี้และซีรีย์นี้นั่นเองครับ
อะไรคือ Linear Regression?
ผมเคยเขียนบทความการทำ Linear Regression มาก่อนแล้วครั้งนึงเมื่อนานมากๆแล้ว (น่าจะเป็นบทความแรกที่ผมเขียนลง medium เลยด้วย) แต่ตอนนั้นผมเขียนโดยใช้ Tensorflow ถ้าใครสนใจสามารถอ่านได้ที่นี่ครับ
Linear Regression แปลตรงตัวเลยคำว่า Linear แปลว่าเส้นตรง การทำ Linear Regression พูดง่ายๆคือ การหาสมการเส้นตรงสมการนึงที่สามารถประมาณค่าของความสัมพันธ์ของเลขชุดๆนึงได้
นึกไม่ออกให้ดูตามรูปภาพเลยครับ สมมติว่าเรามีข้อมูล x y เราสามารถนำไปพล็อตลงบนแผนภูมิ ทีนี้ถ้าเราอยากเดาว่าค่า x ซักค่านึงจะมีค่า y อยู่ที่ประมาณช่วงไหน เราก็ลองวาดเส้นตรงที่ครอบคลุมข้อมูลทุกชุดมากที่สุด หาสมการของมันมา แล้วก็เอาค่า x ไปแทนก็จะได้ค่า y ออกมา
เผื่อใครอยากอ่านทฤษฎีเพิ่มเติมว่ามันทำยังไงสามารถกดไปอ่านที่นี่ครับ
เขียนโปรแกรมกันดีกว่า
ก่อนอื่นจะต้องทำการติดตั้ง package ตามนี้นะครับ scipy, matplotlib ถ้ายังไม่ไม่ติดตั้งตัวไหนก็ใช้คำสั่ง
pip install <ชื่อแพคเกจ>
ได้เลย
ก่อนอื่นเราจะทำการสร้างชุดข้อมูลของเราขึ้นมาก่อนเพื่อที่จะลองนำ model ของเราไป fit ผมตั้งใจว่าจะสร้างสมการเส้นตรงที่มีค่าความชันเป็น 3 มีจุดตัดแกน y เป็น 15 แล้วก็อาจจะเพิ่ม random ไปนิดหน่อยให้ข้อมูลดูสมจริงมากขึ้น
สมการเส้นตรงมีรูปมาตรฐานแบบนึงคือ y = mx + b ; m = ความชัน, b = จุดตัดแกน yimport matplotlib.pyplot as plt
from random import randrangeX = []
y = []for x in range(100):
X.append(x)
y.append(3*x + 15 + randrange(5))plt.scatter(X,y)
plt.show()
แนวคิดของผมง่ายๆคือผมจะสร้างอาร์เรย์เอาไว้เก็บค่า x ทุกๆจุกจาก 0 ถึง 100 และอาร์เรย์เอาไว้เก็บค่า y ทุกๆจุดจาก x = 0 ถึง x = 100
คำนวณจาก y = mx + b แล้วให้มีค่า random นิดหน่อย (ผมให้ m = 3, b = 15)
จากนั้นก็เอาไปให้ matplotlib พล็อตออกมาให้
เมื่อรันโค้ดข้างบนแล้วจะเจอหน้าต่างแสดงจุดต่างๆที่เรา generate ข้อมูลออกมา
from scipy import statsm, b, r, p, std_err = stats.linregress(X, y)def predict(x):
return slope * x + intercept
โค้ดชุดข้างบนนี้เป็นการสร้างโมเดลจริงๆแล้วนะครับ เราใช้คำสั่ง stats.linregress(X, y)
ซึ่งไป import มาจาก scipy โดยค่าที่มันคืนค่าออกมามี 5 ค่า แต่ค่าที่เราสนใจในตอนนี้มีแค่ 2 ค่า คือค่า m กับ b ก็คือความชันและจุดตัดแกน y
จากนั้นผมสร้างฟังค์ชันขึ้นมาฟังค์ชันนึงชื่อ predict ฟังค์ชันนี้ทำหน้าที่ในการประมาณค่า y จาก x ที่เราป้อนไป
โดยประมาณจากค่า m และ b ที่เราได้มาจากตัวโมเดลของเรา
ถ้าผมลองรันฟังค์ชัน predict กับค่า x เป็น 10 จะได้ค่าออกมาประมาณ 53 กว่าๆ ซึ่งถ้าลองเอามาคำนวณจากสมการที่เราตั้งไว้เอง 3*10 + 15 = 45 จะเห็นว่าค่าที่โมเดลประมาณออกมาจะค่าเกินไปจากความจริงอยู่บ้าง แต่ก็พอรับได้ (เพราะอย่าลืมว่าเรามีการบวกค่า error เข้าไปตอน generate ชุดข้อมูลออกมาด้วย)predictions = []
for x in range(100):
predictions.append(predict(x))plt.plot(X, predictions, c='r')
plt.scatter(X, y)
plt.show()
พอได้ตัวโมเดลออกมาแล้วเลยอยากลองดูกราฟที่มัน generate ออกมาหน่อย ผมเลยสร้างอาร์เรย์ predictions เอาไว้เก็บผลจากการใช้โมเดลจาก 0 ถึง 100 แล้วก็พล็อตลงบนกราฟ จะได้ภาพออกมาตามนี้ครับ
จะเห็นว่าเส้นที่ model เราสร้างมาได้มีการเกาะจุดอยู่พอสมควร
สำหรับบทความนี้คงจบลงเพียงเท่านี้ครับ ถ้าใครอยากศึกษาเพิ่มเติมสามารถเข้าไปอ่านได้ที่ documentation ของ scipy ที่นี่
ที่ผ่านมาผมไม่ได้มีแฟนเพจเฟสบุ๊คหรือช่องทางติดต่อที่ง่ายๆ เวลาคนมีปัญหาอะไรเลยอาจจะไม่สะดวกบ้าง ผมเลยเปิดแฟนเพจเฟสบุ๊คขึ้นมาครับ (พึ่งเปิดมาไม่นานเหมือนกัน) ก็ถ้าใครมีปัญหาหรืออยากปรึกษาเรื่องอะไรสามารถติดต่อได้ที่แฟนเพจเลยนะครับ สวัสดีครับ
ลิ้งค์แฟนเพจ