สร้าง Simple Linear Regression model โดยใช้ Python
Tags: machinelearning, ai
Published: 2023-03-22 14:35:57

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

ตัวอย่างผลที่ได้จาก code
![ตัวอย่างข้อมูล mtcars](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5rc5kgy6ahpdpbzw0tk.png)


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

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

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

`mtcars.corr()`

ผลที่ได้


![correlation mtcars](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ksoilo8dxqk4nmnp59o7.png)

ทดลอง 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))
```
รูปกราฟที่ได้และค่า correlation


![correlation and plot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3fp9rpks71oicw3wm4e0.png)


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

```
y = mtcars['mpg']
X = mtcars[['wt']]
```
กำหนดให้ 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_)
```

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


![intercept and coefficient](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2y0o6k7s6fjodddg5pd.png)

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


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

ทำการคำนวณค่า Error
```
y_pred = model.predict(X)
y_error = y - y_pred
```

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

```
plt.scatter(X,y)
plt.xlabel("weight")
plt.ylabel("mpg")
plt.plot(X,y_pred,color='red')
```
จะได้ผลแบบนี้

![plot and trend line](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kej2s4az1jy5snmulroo.png)


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

```
import math
import numpy as np
math.sqrt(np.mean(y_error**2))
```

![rmse](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z18lnujqwp0g0v0hivrf.png)

### ขั้นตอนที่ 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_)
```
จะได้ผลลัพธ์เป็น

![coeffient](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hlzub2q9t1mu3shl27un.png)

ทำการ 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')

```
รูปกราฟ


![plot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a785q87g8llfodhgr8qk.png)

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

```
math.sqrt(np.mean(y_error**2))
```

![RMSE](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1nufnp8pg9i38lra0rl.png)



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

เย้!! 🎉