Linear Regression เพื่อพยากรณ์ใน Machine Learning ด้วย Python
Linear Regression เป็นอัลกอริทึมหนึ่งใน Machine Learning ที่ใช้ในการพยากรณ์ค่าของตัวแปรตามที่อยู่ในช่วงเวลา โดยใช้ข้อมูลจำนวนมากเป็นตัวช่วยในการสร้างสมการเชิงเส้น (Linear Equation) ที่เข้ากับข้อมูลต้นฉบับ โดยมีวัตถุประสงค์เพื่อให้สามารถทำนายผลลัพธ์หรือค่าต่าง ๆ ที่เกี่ยวข้องกับตัวแปรต้นได้
การสร้างโมเดล Linear Regression ใน Machine Learning นั้น เริ่มต้นด้วยการเก็บข้อมูลเป็นชุดข้อมูล โดยทั่วไปแล้วชุดข้อมูลจะประกอบไปด้วยข้อมูลตัวอย่าง (examples) และค่าเป้าหมาย (target values) โดยตัวอย่างจะประกอบไปด้วยคุณสมบัติหรือตัวแปรต้น (features or independent variables) ซึ่งสามารถใช้ในการทำนายผลลัพธ์หรือค่าต่าง ๆ ของค่าเป้าหมายได้
โดย Linear Regression จะหาสมการเส้นตรง (straight line) ที่ใกล้เคียงกับข้อมูลต้นฉบับมากที่สุดโดยใช้วิธีการหาค่าต่าง ๆ เช่น Gradient Descent หรือ Normal Equation เพื่อหาค่าตัวประกอบของสมการเส้นตรงดังกล่าว จากนั้นนำสมการเส้นตรงดังกล่าวมาใช้ในการทำนายผลลัพธ์หรือค่าต่าง ๆ ที่เกี่ยวข้องกับตัวแปรต้น
Linear Regression คืออัลกอริทึมที่ใช้ในการเรียนรู้แบบสอนที่มีจุดประสงค์เพื่อคาดการณ์ค่าตัวแปรตามตัวแปรอื่น ๆ ที่เป็นตัวแปรอิสระ (independent variables) หรือ Feature ซึ่งเป็นตัวแปรที่สามารถใช้ในการอธิบายหรืออธิบายค่าตัวแปรเป้าหมาย (dependent variable) ได้
การใช้ Linear Regression ใน Machine Learning มักนำมาใช้ในการหาความสัมพันธ์ระหว่างตัวแปร เช่น การวิเคราะห์การขายสินค้า การประเมินผลการเรียนของนักเรียน การวิเคราะห์การเจริญเติบโตของธุรกิจ และอื่น ๆ
Linear Regression ทำงานโดยการหาค่าพารามิเตอร์ a และ b ที่เหมาะสมที่สุดเพื่อแทนความสัมพันธ์ระหว่างตัวแปรอิสระและตัวแปรตามหมายเลข เมื่อพารามิเตอร์เหล่านี้ถูกหาแล้ว โมเดล Linear Regression สามารถใช้ในการคำนวณค่าตัวแปรตามหมายเลขโดยใช้สมการ คือ
y = a + bx
โดยที่
- y คือตัวแปรตามหมายเลข
- x คือตัวแปรอิสระ
- a คือค่าคงที่ (intercept)
- b คือค่าสัมประสิทธิ์ (slope)
เมื่อค่าพารามิเตอร์ a และ b ถูกหาแล้ว โมเดล Linear Regression สามารถใช้ในการคำนวณค่าตัวแปรตามหมายเลขโดยใช้สมการดังกล่าว ทำให้สามารถทำนายค่าของตัวแปรตามหมายเลขได้โดยใช้ค่าตัวแปรอิสระที่กำหนดไว้
การประยุกต์ใช้ Linear Regression ใน Machine Learning นั้นมีหลายวิธีการและหลายสาขางานที่นำมาใช้ เช่นในการทำนายราคาหุ้น, การทำนายค่าความเสี่ยงของเครื่องบิน, การทำนายราคาบ้าน, การทำนายอุณหภูมิในอนาคต, การทำนายจำนวนผู้ใช้บริการของโรงแรม และอื่นๆ อีกมากมาย
โดยในการประยุกต์ใช้ Linear Regression นั้น มักจะมีขั้นตอนวิธีที่เรียกว่า Train-Test Split ซึ่งมีการแบ่งข้อมูลออกเป็น 2 ชุด คือชุด Train และชุด Test โดยส่วนใหญ่จะเลือกแบ่งข้อมูลออกเป็นสัดส่วนประมาณ 80:20 หรือ 70:30 ซึ่งเป็นสัดส่วนที่นิยมใช้โดยทั่วไป
ขั้นตอนการพยากรณ์โดยการใช้ Linear Regression ใน Machine Learning มีดังนี้
-
เตรียมข้อมูล: ปรับปรุงข้อมูลเพื่อเตรียมสำหรับการสร้างโมเดล รวมถึงการแยกข้อมูลออกเป็นชุดข้อมูล Train และ Test เพื่อใช้สำหรับการฝึกโมเดลและการทดสอบโมเดล และสำรวจข้อมูลที่เป็นเรื่องราวหรือปัจจัยที่เป็นตัวชี้วัด (features) ของตัวแปรตามศึกษา (target variable) และเก็บข้อมูลเหล่านั้นเพื่อนำมาใช้ในการสร้างโมเดล Linear Regression
-
แบ่งชุดข้อมูล: จากนั้นให้แบ่งชุดข้อมูลเป็นชุด Train set และ Test set เพื่อใช้ Train set เพื่อสร้างโมเดล Linear Regression และใช้ Test set เพื่อวัดประสิทธิภาพของโมเดลที่สร้าง
-
สร้างโมเดล: เลือกและสร้างโมเดล Linear Regression โดยใช้ชุดข้อมูล Train เพื่อให้โมเดลเรียนรู้จากข้อมูลและสามารถพยากรณ์ผลลัพธ์ได้ โดยใช้ Train set เพื่อสร้างโมเดล Linear Regression โดยใช้เครื่องมือหรือไลบรารีต่าง ๆ ที่มีอยู่ใน Python เช่น scikit-learn
-
ประเมินความแม่นยำโมเดล: ใช้ชุดข้อมูล Test เพื่อประเมินประสิทธิภาพของโมเดล Linear Regression ที่สร้างขึ้น โดยใช้เทคนิคต่าง ๆ เช่น Mean Squared Error (MSE) หรือ R-squared เพื่อประเมินความเหมาะสมของโมเดลในการทำนายผลลัพธ์
-
ปรับปรุงโมเดล: หากประสิทธิภาพของโมเดลไม่เพียงพอ จะต้องปรับปรุงโมเดลให้ดียิ่งขึ้น เช่น การเพิ่มหรือลดคุณสมบัติ (Feature) หรือการปรับค่าพารามิเตอร์ (Parameter) ของโมเดล ถ้าพบว่าโมเดล Linear Regression ไม่มีประสิทธิภาพที่ดีเพียงพอ ให้ทำการปรับปรุงโมเดลโดยการเปลี่ยนแปลงพารามิเตอร์หรือเลือกโมเดลอื่นที่ดีกว่า
-
ใช้โมเดล: เมื่อได้โมเดลที่เหมาะสมแล้ว จะนำโมเดลไปใช้ในการทำนายผลลัพธ์ โดยใช้ชุดข้อมูลที่ไม่ได้ใช้ในการสร้างโมเดล (Test Data) หรือชุดข้อมูลใหม่ที่ต้องการทำนายผลลัพธ์
การสร้างโมเดล Linear Regression ใน Python ด้วย Scikit-learn library มีขั้นตอนดังนี้
- Import libraries
เริ่มต้นด้วยการ import ไลบรารีที่จำเป็น เช่น scikit-learn (sklearn) เพื่อใช้สร้างโมเดล Linear Regression และ numpy เพื่อจัดการกับข้อมูล
import numpy as np
from sklearn.linear_model import LinearRegression
- เตรียมข้อมูล
สร้างตัวแปร X และ y เพื่อเก็บ feature (X) และ target (y) ของข้อมูล ตัวอย่างเช่น X เป็น array ของความยาวและ y เป็น array ของน้ำหนัก
X = np.array([[1.60], [1.65], [1.70], [1.75], [1.80], [1.85], [1.90], [1.95], [2.00], [2.05], [2.10]])
y = np.array([60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110])
- สร้างโมเดล Linear Regression
สร้าง object ของ LinearRegression จาก sklearn และใช้ method fit() เพื่อสร้างโมเดล Linear Regression จากข้อมูล training set (X, y)
reg = LinearRegression().fit(X, y)
- ทำนายพยากรณ์ค่า
ใช้ method predict() เพื่อทำนายค่า target (y) จาก feature (X) ที่ไม่เคยเห็นก่อน
y_pred = reg.predict([[1.95]])
- แสดงผลลัพธ์
แสดงผลลัพธ์โดยพล็อตจุดของข้อมูล (scatter plot) และเส้น regression บนกราฟ โดยใช้ matplotlib
import matplotlib.pyplot as plt
plt.scatter(X, y, color='black')
plt.plot(X, reg.predict(X), color='blue', linewidth=3)
plt.xlabel('Height (m)')
plt.ylabel('Weight (kg)')
plt.show()
จากโค้ดทั้ง 5 ขั้นตอน สามารถผลลัพธ์ได้ดังนี้
ตัวอย่าง การทำนายค่าราคาบ้าน (Price) จากข้อมูลขนาดพื้นที่บ้าน (Size)
นำโมเดล Linear Regression ไปใช้งานเพื่อทำนายค่า จะต้องมีข้อมูลที่ต้องการทำนายให้กับโมเดลก่อน ในที่นี้เราจะใช้ข้อมูลไฟล์ data.csv โดยมีรายละเอียด ดังนี้
Size (sqft) Price (thousands)
0 150 645
1 200 745
2 250 845
3 300 945
4 350 1145
5 400 1545
6 450 1845
7 500 2045
จากนั้นเราจะนำโมเดล Linear Regression ที่เราสร้างขึ้นมาใช้งาน โดยการทำนายค่าราคาบ้าน (Price) จากข้อมูลขนาดพื้นที่บ้าน (Size) โดยการเขียนโค้ดภาษา Python
import pandas as pd
from sklearn.linear_model import LinearRegression
# โหลดไฟล์ data.csv เข้ามาใน Python
df = pd.read_csv('data.csv')
# กำหนดข้อมูลในแกน X และ Y
X = df[['Size (sqft)']]
Y = df[['Price (thousands)']]
# สร้างโมเดล Linear Regression
model = LinearRegression()
# นำข้อมูลไปเรียนรู้
model.fit(X, Y)
# ทำนายค่าราคาบ้านจากขนาดพื้นที่บ้าน
predicted_price = model.predict([[400]])
print('Predicted price for 400 sqft:', predicted_price[0][0])
ผลลัพธ์ที่ได้ คือ
Predicted price for 400 sqft: 1343.6879432624114
ตัวอย่าง การหาค่า Linear Regression ด้วย Scikit-learn library พร้อมแสดงผลลัพธ์ทางกราฟ
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# กำหนดข้อมูล
x = np.array([10, 26, 31, 42, 58, 64, 72, 14, 37, 81, 32, 40, 50, 75, 12])
y = np.array([15, 47, 29, 21, 33, 25, 43, 56, 101, 13, 64, 45, 40, 35, 50])
# แปลง x ให้อยู่ในรูปของ matrix 2 มิติ
X = x[:, np.newaxis]
# สร้างโมเดล Linear Regression
model = LinearRegression()
# นำข้อมูล x,y มา fit โมเดล Linear Regression
model.fit(X, y)
# ทำการ predict ค่า y จากข้อมูล x ที่ใหม่
y_pred = model.predict(X)
# พล็อต scatter plot และเส้น Linear Regression
plt.scatter(x, y)
plt.plot(x, y_pred, color='red')
plt.show()
ผลลัพธ์ที่ได้คือกราฟ Scatter Plot พร้อมกับเส้น Linear Regression ดังนี้
ตัวอย่าง จากข้อมูลความสัมพันธ์ระหว่างจำนวนผู้ใช้บริการของโรงแรมกับจำนวนห้องพักที่มีในโรงแรม แล้วนำข้อมูลนั้นมาทำ Linear Regression เพื่อทำนายจำนวนผู้ใช้บริการของโรงแรมจากจำนวนห้องพัก
ก่อนอื่นเราจะสร้างข้อมูลจำลองขึ้นมาก่อน โดยใช้ฟังก์ชัน numpy.random
เพื่อสร้างข้อมูลตัวอย่าง 100 ชุด โดยมีตัวแปร x แทนจำนวนห้องพัก และ y แทนจำนวนผู้ใช้บริการ
import numpy as np
np.random.seed(0)
x = np.random.rand(100) * 100
y = 2 * x + np.random.randn(100) * 10
หลังจากนั้นเราจะนำข้อมูล x และ y มาสร้าง Linear Regression Model ด้วย scikit-learn library
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x.reshape(-1, 1), y)
จากนั้นเราจะสร้าง Scatter Plot และ plot ขีดเส้น Linear Regression ขึ้นมา เพื่อดูว่าข้อมูลมีความสัมพันธ์กันอย่างไร
import matplotlib.pyplot as plt
plt.scatter(x, y)
plt.plot(x, model.predict(x.reshape(-1, 1)), color='red')
plt.show()
ผลลัพธ์ที่ได้ คือ
จากตัวอย่าง การสร้างโมเดล Linear Regression ใน Python เพื่อทำนายจำนวนผู้ใช้บริการของโรงแรม โดยมีข้อมูล x เป็นข้อมูลตัวแปรอิสระ (independent variable) ซึ่งในที่นี้เป็นเวลาที่ใช้เป็นตัวกำหนดจำนวนผู้ใช้บริการ และ y เป็นข้อมูลตัวแปรตาม (dependent variable) ซึ่งในที่นี้เป็นจำนวนผู้ใช้บริการ โดยมีการสุ่มข้อมูลจำนวน 100 ชุด ด้วยฟังก์ชัน np.random.rand()
และ np.random.randn()
ซึ่งจะสุ่มค่าตั้งแต่ 0 ถึง 1 และค่าเฉลี่ย 0 และมี variance เป็น 1 ตามลำดับ
หลังจากนั้นเรานำข้อมูล x,y ไปสร้างโมเดล Linear Regression ด้วยตัวแปร model
จาก LinearRegression()
และทำการ fit model ด้วยข้อมูล x,y ด้วยคำสั่ง model.fit(x.reshape(-1, 1), y)
ซึ่ง x จะต้องถูก reshape เป็น matrix ขนาด (100,1) เนื่องจากโมเดล Linear Regression ของ Scikit-learn ต้องรับข้อมูลในรูปแบบนี้
จากนั้นเรานำข้อมูล x,y ไปแสดงผลลัพธ์ด้วย Scatter Plot และเส้น Linear Regression ด้วยการใช้ Matplotlib ซึ่ง Scatter Plot จะถูกสร้างขึ้นด้วย plt.scatter(x, y)
และเส้น Linear Regression จะถูกสร้างด้วย plt.plot(x, model.predict(x.reshape(-1, 1)), color='red')
โดยที่ model.predict()
เป็นคำสั่งที่ใช้ทำนายค่า y จากข้อมูล x ที่ใช้ fit model ไว้ก่อนหน้านี้
ผลลัพธ์ที่ได้แสดงความสัมพันธ์ระหว่างตัวแปร x (จำนวนห้องพักในโรงแรม) และตัวแปร y (จำนวนผู้ใช้บริการของโรงแรม) โดยข้อมูลถูกสุ่มขึ้นมาโดยใช้ฟังก์ชัน random ใน NumPy โดยมีความสัมพันธ์เชิงเส้นกันแบบกระจัดกระจาย โดยใช้ Linear Regression ในการหาค่าความสัมพันธ์และขีดเส้นตามแนวทางของ Linear Regression ในกราฟ Scatter Plot นี้ แสดงให้เห็นถึงความสัมพันธ์และค่าคาดการณ์ว่าจำนวนผู้ใช้บริการของโรงแรมจะเพิ่มขึ้นเท่าไหร่หากมีการเพิ่มจำนวนห้องพักในโรงแรมด้วย