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 มีดังนี้

  1. เตรียมข้อมูล: ปรับปรุงข้อมูลเพื่อเตรียมสำหรับการสร้างโมเดล รวมถึงการแยกข้อมูลออกเป็นชุดข้อมูล Train และ Test เพื่อใช้สำหรับการฝึกโมเดลและการทดสอบโมเดล และสำรวจข้อมูลที่เป็นเรื่องราวหรือปัจจัยที่เป็นตัวชี้วัด (features) ของตัวแปรตามศึกษา (target variable) และเก็บข้อมูลเหล่านั้นเพื่อนำมาใช้ในการสร้างโมเดล Linear Regression

  2. แบ่งชุดข้อมูล: จากนั้นให้แบ่งชุดข้อมูลเป็นชุด Train set และ Test set เพื่อใช้ Train set เพื่อสร้างโมเดล Linear Regression และใช้ Test set เพื่อวัดประสิทธิภาพของโมเดลที่สร้าง

  3. สร้างโมเดล: เลือกและสร้างโมเดล Linear Regression โดยใช้ชุดข้อมูล Train เพื่อให้โมเดลเรียนรู้จากข้อมูลและสามารถพยากรณ์ผลลัพธ์ได้ โดยใช้ Train set เพื่อสร้างโมเดล Linear Regression โดยใช้เครื่องมือหรือไลบรารีต่าง ๆ ที่มีอยู่ใน Python เช่น scikit-learn

  4. ประเมินความแม่นยำโมเดล: ใช้ชุดข้อมูล Test เพื่อประเมินประสิทธิภาพของโมเดล Linear Regression ที่สร้างขึ้น โดยใช้เทคนิคต่าง ๆ เช่น Mean Squared Error (MSE) หรือ R-squared เพื่อประเมินความเหมาะสมของโมเดลในการทำนายผลลัพธ์

  5. ปรับปรุงโมเดล: หากประสิทธิภาพของโมเดลไม่เพียงพอ จะต้องปรับปรุงโมเดลให้ดียิ่งขึ้น เช่น การเพิ่มหรือลดคุณสมบัติ (Feature) หรือการปรับค่าพารามิเตอร์ (Parameter) ของโมเดล ถ้าพบว่าโมเดล Linear Regression ไม่มีประสิทธิภาพที่ดีเพียงพอ ให้ทำการปรับปรุงโมเดลโดยการเปลี่ยนแปลงพารามิเตอร์หรือเลือกโมเดลอื่นที่ดีกว่า

  6. ใช้โมเดล: เมื่อได้โมเดลที่เหมาะสมแล้ว จะนำโมเดลไปใช้ในการทำนายผลลัพธ์ โดยใช้ชุดข้อมูลที่ไม่ได้ใช้ในการสร้างโมเดล (Test Data) หรือชุดข้อมูลใหม่ที่ต้องการทำนายผลลัพธ์ 

การสร้างโมเดล Linear Regression ใน Python ด้วย Scikit-learn library มีขั้นตอนดังนี้

  1. Import libraries

เริ่มต้นด้วยการ import ไลบรารีที่จำเป็น เช่น scikit-learn (sklearn) เพื่อใช้สร้างโมเดล Linear Regression และ numpy เพื่อจัดการกับข้อมูล

import numpy as np
from sklearn.linear_model import LinearRegression

  1. เตรียมข้อมูล

สร้างตัวแปร 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])

  1. สร้างโมเดล Linear Regression

สร้าง object ของ LinearRegression จาก sklearn และใช้ method fit() เพื่อสร้างโมเดล Linear Regression จากข้อมูล training set (X, y)

reg = LinearRegression().fit(X, y)

  1. ทำนายพยากรณ์ค่า

ใช้ method predict() เพื่อทำนายค่า target (y) จาก feature (X) ที่ไม่เคยเห็นก่อน

y_pred = reg.predict([[1.95]])

  1. แสดงผลลัพธ์

แสดงผลลัพธ์โดยพล็อตจุดของข้อมูล (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 นี้ แสดงให้เห็นถึงความสัมพันธ์และค่าคาดการณ์ว่าจำนวนผู้ใช้บริการของโรงแรมจะเพิ่มขึ้นเท่าไหร่หากมีการเพิ่มจำนวนห้องพักในโรงแรมด้วย