DEV Community

Kejkaew Thanasuan
Kejkaew Thanasuan

Posted on

สร้าง Simple Linear Regression model โดยใช้ Python

ถ้าเราจะต้องทำนายค่าจำนวนจริง เช่น ราคาหุ้นวันพรุ่งนี้ ยอดขายของปีหน้า หรือจำนวนสินค้าที่เราจะขายได้ในอนาคต หนึ่งในวิธีที่ง่ายและเหมาะสมที่ใช้สำหรับการทำนายข้อมูลแบบนี้ คือ การใช้ Linear Regression

บทความนี้ เราจะมาดู Linear Regression ใน Python กัน เราจะใช้ Google Colab ในการรันโค้ด โดย dataset ที่เราจะใช้เป็นตัวอย่างคือ mtcars ซึ่งเป็นข้อมูลรถ ได้มาจาก 1974 Motor Trend US magazine

ข้อมูลประกอบไปด้วย 32 แถว นั้นคือมีรถทั้งหมด 32 ประเภท (เป็นรถระหว่างปี 1973 - 1974)
ข้อมูลประกอบด้วย 11 columns ดังนี้

[, 1] mpg Miles/(US) gallon
[, 2] cyl Number of cylinders
[, 3] disp Displacement (cu.in.)
[, 4] hp Gross horsepower
[, 5] drat Rear axle ratio
[, 6] wt Weight (1000 lbs)
[, 7] qsec 1/4 mile time
[, 8] vs Engine (0 = V-shaped, 1 = straight)
[, 9] am Transmission (0 = automatic, 1 = manual)
[,10] gear Number of forward gears

ขั้นตอนที่ 1 นำเข้าข้อมูล mtcars

ตัวอย่างของข้อมูลสามารถ copy code และโหลดได้ตามนี้เลย

import pandas as pd
url = "https://raw.githubusercontent.com/ketnas/homework/main/AI/mtcars.csv"
mtcars = pd.read_csv(url, index_col=0)
mtcars.head()
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างผลที่ได้จาก code
ตัวอย่างข้อมูล mtcars

ขั้นตอนที่ 2 จัดการข้อมูลให้เหมาะสม และทำการวิเคราะห์ข้อมูลเบื้องต้น

ในตัวอย่างนี้เราจะหา Correlation และทำการวาดกราฟเพื่อดูความสัมพันธ์ระหว่าง weight และ mpg

อย่างแรก เราจะทำการหา Correlation Matrix ของข้อมูลทั้งหมดก่อน

mtcars.corr()

ผลที่ได้

correlation mtcars

ทดลอง plot graph ดูความสัมพันธ์ระหว่าง weight และ mpg โดยใช้ matplotlib library

import matplotlib.pyplot as plt

plt.scatter(mtcars.wt,mtcars.mpg)
plt.xlabel("weight")
plt.ylabel("mpg")
print(mtcars.wt.corr(mtcars.mpg))
Enter fullscreen mode Exit fullscreen mode

รูปกราฟที่ได้และค่า correlation

correlation and plot

ต่อมา เราจะทำการแยกค่า Independent variable (X) และ Dependent variable (y)

y = mtcars['mpg']
X = mtcars[['wt']]
Enter fullscreen mode Exit fullscreen mode

กำหนดให้ y เป็นค่าของ mpg และ X เป็นค่าของ wt (weight)

ขั้นตอนที่ 3 ทำการสร้าง Simple linear regression model

เราจะใช้ sklearn library ใน Python สำหรับการสร้าง model

# wt vs mpg

from sklearn import linear_model as lm

model = lm.LinearRegression()
results = model.fit(X,y)

print(model.intercept_, model.coef_)
Enter fullscreen mode Exit fullscreen mode

ผลที่ได้จะเป็นค่า Intercept และ Coefficient ของ regression model

intercept and coefficient

จะได้ว่า ค่า Intercept = 37.285 และค่า Coefficient หน้าตัวแปร wt = -5.344

ขั้นตอนที่ 4 ประเมิณประสิทธิภาพของ regression model ที่เราสร้างมา

ทำการคำนวณค่า Error

y_pred = model.predict(X)
y_error = y - y_pred
Enter fullscreen mode Exit fullscreen mode

ลองสร้างกราฟระหว่าง wt และ mpg พร้อมทั้งแสดง trend line ที่มีสีแดงด้วย

plt.scatter(X,y)
plt.xlabel("weight")
plt.ylabel("mpg")
plt.plot(X,y_pred,color='red')
Enter fullscreen mode Exit fullscreen mode

จะได้ผลแบบนี้

plot and trend line

ทำการหาค่า Root-mean square error (RMSE) จะได้ ค่า RMSE = 2.468

import math
import numpy as np
math.sqrt(np.mean(y_error**2))
Enter fullscreen mode Exit fullscreen mode

rmse

ขั้นตอนที่ 5 ทดลองปรับปรุง regression model

ในขั้นตอนนี้ เราจะลองปรับ Intercept ของ regression model ให้เป็น 0 โดยทำการกำหนด fit_intercept = False

from sklearn import linear_model as lm

model_0 = lm.LinearRegression(fit_intercept=False)
results = model_0.fit(X,y)

print(model_0.intercept_, model_0.coef_)
Enter fullscreen mode Exit fullscreen mode

จะได้ผลลัพธ์เป็น

coeffient

ทำการ plot กราฟ

y_pred = model_0.predict(X)
y_error = y - y_pred

plt.scatter(X,y)
plt.xlabel("weight")
plt.ylabel("mpg")
plt.plot(X,y_pred,color='red')

Enter fullscreen mode Exit fullscreen mode

รูปกราฟ

plot

และหาค่า RMSE จะได้ ว่าค่า RMSE = 11.091

math.sqrt(np.mean(y_error**2))
Enter fullscreen mode Exit fullscreen mode

RMSE

สรุปผล
เราจะได้ว่า ถ้าต้องการสร้าง regression model เพื่อทำนาย mpg โดยใช้ weight เราจะได้สมการ regression model ที่ดีที่สุดคือ mpg = 37.285 - (5.344 * weight) เนื่องจากมีค่า RMSE ที่น้อยกว่าอีกสมการที่เรากำหนดให้ intercept = 0

เย้!! 🎉

Top comments (0)