Polynomial Regression เพื่อพยากรณ์ใน Machine Learning ด้วย Python

Polynomial Regression เป็นเทคนิคหนึ่งใน Machine Learning ที่ใช้สำหรับการพยากรณ์หรือทำนายค่าของตัวแปรตามอีกตัวแปรหนึ่ง โดยใช้โมเดลเชิงพหุนาม (polynomial model) ที่สามารถจำแนกข้อมูลได้ดีกว่าโมเดลเชิงเส้น (linear model) ในบางกรณี เช่น เมื่อข้อมูลมีความซับซ้อนมากขึ้น เมื่อมีความสัมพันธ์ไม่เป็นเส้นตรง หรือเมื่อมีข้อมูลที่มี outlier หรือข้อมูลผิดปกติ

โมเดลเชิงพหุนาม (polynomial model) คือ โมเดลที่มีความซับซ้อนมากกว่าโมเดลเชิงเส้น (linear model) โดยการใช้ฟังก์ชันพหุนาม (polynomial function) เพื่อสร้างสมการที่สามารถจำแนกข้อมูลได้ดีขึ้น โดยจะใช้ค่าระดับหนึ่งของพารามิเตอร์ (degree) ในการกำหนดความซับซ้อนของโมเดล โดยที่ degree = 1 จะเป็นโมเดลเชิงเส้น (linear model) และ degree > 1 จะเป็นโมเดลเชิงพหุนาม (polynomial model)

สำหรับการสร้างโมเดล Polynomial Regression ใน Machine Learning จะใช้วิธีการเดียวกับ Linear Regression โดยใช้ scikit-learn library ใน Python โดยโค้ดทั่วไปจะประกอบด้วยการสร้างโมเดล การเทรนโมเดลด้วยข้อมูล training และการทำนายค่าด้วยข้อมูล test หลังจากนั้นจึงแสดงผลลัพธ์เป็นกราฟหรือตารางข้อมูล

Polynomial Regression เป็นอีกหนึ่งวิธีการทำ Regression Analysis ใน Machine Learning โดยที่ Polynomial Regression จะใช้ Polynomial Function ในการจำแนกข้อมูล โดยจะเลือกค่า Degree ของ Polynomial Function เพื่อให้เหมาะสมกับข้อมูล ซึ่ง Polynomial Regression มีความสามารถในการจำแนกข้อมูลได้ดีกว่า Linear Regression ในบางกรณีที่ข้อมูลมีความซับซ้อนมากขึ้น

หลักการทำงานของ Polynomial Regression คือการนำข้อมูล x ที่เป็น Feature และ y ที่เป็น Label มาสร้าง Polynomial Function โดย Degree ของ Polynomial Function จะเป็นตัวกำหนดความซับซ้อนของโมเดล จากนั้นจึงใช้ Polynomial Function นี้ในการ Train โมเดล โดยการคำนวณค่าความคลาดเคลื่อน (Error) ของโมเดล และปรับแต่งค่า Coefficients ของ Polynomial Function เพื่อให้โมเดลมีค่า Error น้อยที่สุด และสามารถทำนายผลลัพธ์ได้แม่นยำ

การสร้าง Polynomial Regression สามารถทำได้ง่ายๆ ด้วย Library ใน Python อย่างเช่น Scikit-learn ซึ่งมีฟังก์ชั่น PolynomialFeatures ให้ใช้งาน สามารถสร้าง Polynomial Features จาก Feature ที่เรามีอยู่แล้ว โดยกำหนด Degree ที่เหมาะสมในการจัดเรียง Feature โดยเพิ่มค่าตัวยกกำลังของ Feature ที่มีอยู่ และสร้าง Model ด้วย Linear Regression ตามปกติโดยมี Polynomial Features เป็น Input Feature ของโมเดล

เราสามารถใช้ไลบรารี Scikit-learn ใน Python สำหรับการสร้างโมเดล Polynomial Regression แสดงความสัมพันธ์ระหว่างความเค็มของน้ำในทะเลและอุณหภูมิ มีขั้นตอนดังนี้

  1. นำเข้าไลบรารี Scikit-learn และ Numpy
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

  1. กำหนดข้อมูล x และ y
# กำหนดข้อมูล x และ y
x = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
y = np.array([0.5, 0.9, 1.5, 2.1, 2.7, 3.5, 4.5, 5.5, 6.5])

  1. สร้างเมทริกซ์ของพจน์กำลังสอง (degree=2) และหาค่า Polynomial Regression
# สร้างเมทริกซ์ของพจน์กำลังสอง
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(x.reshape(-1, 1))

# หาค่า Polynomial Regression
poly_reg = LinearRegression()
poly_reg.fit(X_poly, y)

  1. แสดงผลลัพธ์เป็นกราฟ
# แสดงผลลัพธ์เป็นกราฟ
plt.scatter(x, y, color='blue')
plt.plot(x, poly_reg.predict(poly.fit_transform(x.reshape(-1, 1))), color='red')
plt.title('Polynomial Regression')
plt.xlabel('Salinity')
plt.ylabel('Temperature')
plt.show()

ผลลัพธ์ที่ได้คือกราฟ Polynomial Regression ที่แสดงความสัมพันธ์ระหว่างความเค็มของน้ำในทะเลและอุณหภูมิ ดังรูปต่อไปนี้

จากรูปจะเห็นได้ว่า โมเดล Polynomial Regression ทำนายความเปลี่ยนแปลงของอุณหภูมิจากความเค็มของน้ำในทะเลได้ดี โดยที่เมื่อความเค็มเพิ่มขึ้น อุณหภูมิจะเพิ่มขึ้นตามสมการโมเดล Polynomial Regression ที่ได้ศึกษาไปแล้ว

ตัวอย่าง โมดูล sklearn ใน Python มีฟังก์ชัน PolynomialFeatures ที่ช่วยให้เราสามารถสร้าง feature ที่เป็น polynomial ได้โดยง่าย โดยใช้งานคำสั่ง fit_transform() เพื่อแปลงข้อมูล input ให้กลายเป็น polynomial feature ตามต้องการ จากนั้นเราสามารถสร้างโมเดล Linear Regression ใหม่ขึ้นมาจาก feature ใหม่นี้ได้ ดังตัวอย่างต่อไปนี้

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# สร้างข้อมูลตัวอย่าง
x = np.array([3, 2, 4, 1, 5]).reshape((-1, 1))
y = np.array([5, 3, 8, 1, 12])

# กำหนดระดับของ polynomial
poly = PolynomialFeatures(degree=2)

# แปลง feature เป็น polynomial feature
x_poly = poly.fit_transform(x)

# สร้างโมเดล Linear Regression ด้วย polynomial feature
model = LinearRegression()
model.fit(x_poly, y)

# ทำนายผล
y_pred = model.predict(x_poly)

# แสดงผลลัพธ์
print(y_pred)

ผลลัพธ์ที่ได้จะเป็นค่าที่ทำนายได้จากโมเดล Polynomial Regression ดังนี้

[ 4.25 -0.75  7.25 -0.75 10.25]

สามารถเรียกดู coefficient ของโมเดลได้ดังนี้

print(model.coef_)

ผลลัพธ์ที่ได้ คือ

[ 0.         -4.78571429  1.35714286]

โดย coefficient แต่ละตัวจะเป็นค่าของ polynomial ที่สร้างขึ้น ในกรณีนี้คือ y = 0 + (-4.79)x + 1.36x^2

ตัวอย่าง การใช้ Polynomial Regression แสดงผลลัพธ์ในรูปแบบกราฟ

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# กำหนดตัวแปร x, y
x = [1,5,8,15,17,24,29,32,36,40,43,49,55,59,60,65,69,76,88,99]
y = [169,150,122,109,89,77,72,62,55,59,65,70,76,79,85,90,111,125,150,159]

# เปลี่ยนรูปร่าง x และ y เป็นอาร์เรย์ 2 มิติ
x = np.array(x).reshape((-1,1))
y = np.array(y)

# แปลง x เป็น Polynomial
poly_transform = PolynomialFeatures(degree=3)
x_poly = poly_transform.fit_transform(x)

# สร้างโมเดล Polynomial Regression
model = LinearRegression()
model.fit(x_poly, y)

# พล็อตจุดข้อมูล
plt.scatter(x, y, color='blue')

# สร้างเส้นพหุนาม Polynomial
x_range = np.arange(min(x), max(x), 0.1).reshape((-1,1))
x_range_poly = poly_transform.transform(x_range)
y_range = model.predict(x_range_poly)

# พล็อตกราฟและเส้น Polynomial
plt.plot(x_range, y_range, color='red')

# แสดง plot
plt.show()

โดยเมื่อรันโปรแกรม จะแสดงกราฟ Scatter Plot ของข้อมูลและขีดเส้น Polynomial Regression ที่พยากรณ์จากข้อมูล แสดงผลลัพธ์ดังนี้