Linear Regression (ถดถอยเชิงเส้น) เป็นเครื่องมือ Machine Learning พื้นฐานสำหรับวิเคราะห์ความสัมพันธ์ระหว่างตัวแปรสองตัว (บวก/ลบ) และใช้ทำนายได้รวดเร็ว
Regression คืออะไร?
เทคนิคการสร้างแบบจำลองเชิงพยากรณ์ (Predictive Modeling) ที่สร้างความสัมพันธ์ระหว่าง Dependent Variable (Y) และ Independent Variable (X)
ประเภทของ Regression
- Linear Regression
- Logistic Regression
- Polynomial Regression
- Stepwise Regression
ขั้นตอนสร้างโมเดล Linear Regression
- Setup: โหลด dataset และ Jupyter Notebook
- Import libraries และ dataset
- Explore dataset (EDA)
- สร้าง Linear Regression model
- วิเคราะห์ความสัมพันธ์กับ Time of Day
- สรุปผล
Dataset: Building Energy Consumption
ดาวน์โหลด: building1retail.csv
ทำนาย Power (kW) จาก Outdoor Air Temperature - OAT (F)
โค้ดเต็ม: Import และ Load Data
import pandas as pd
import numpy as np
from scipy import stats
from datetime import datetime
from sklearn import preprocessing
from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline
# อ่าน CSV, parse date ใน column 0
df = pd.read_csv('building1retail.csv',
index_col=[0],
date_parser=lambda x: datetime.strptime(x, "%m/%d/%Y %H:%M"))
df.head()
Exploratory Data Analysis (EDA)
1. Plot ข้อมูลทั้งหมด
df.plot(figsize=(22, 6))
2. ตรวจสอบ Missing Values
df.isnull().values.any() # False = ไม่มี missing data
3. ตรวจสอบ Outliers (ค่าผิดปกติ)
พบ "long downward spikes" → ตัด outliers ที่เกิน 3 standard deviations
std_dev = 3 df = df[(np.abs(stats.zscore(df)) < float(std_dev)).all(axis=1)] df.plot(figsize=(22, 6))
4. ตรวจสอบ Distribution
df.hist()
Histogram แสดง distribution ใกล้เคียง Normal Distribution
5. Validate Linear Relationship (Scatter Plot)
plt.scatter(df['OAT (F)'], df['Power (kW)'])
สร้าง Linear Regression Model
Baseline Model (K-Fold Cross Validation, k=3)
X = pd.DataFrame(df['OAT (F)'])
y = pd.DataFrame(df['Power (kW)'])
model = LinearRegression()
scores = []
kfold = KFold(n_splits=3, shuffle=True, random_state=42)
for i, (train, test) in enumerate(kfold.split(X, y)):
model.fit(X.iloc[train, :], y.iloc[train, :])
score = model.score(X.iloc[test, :], y.iloc[test, :])
scores.append(score)
print(scores)
# [0.388, 0.385, 0.385] - R² ประมาณ 0.39 (ไม่ค่อยดี)
ปรับปรุงโมเดลด้วย Time of Day (One-Hot Encoding)
Power consumption ขึ้นกับเวลาของวันมาก → เพิ่ม feature "ชั่วโมง" แบบ One-Hot Encoding
# เพิ่มชั่วโมงจาก index (datetime)
df['hour'] = df.index.hour
# One-hot encoding ชั่วโมง
hour_dummies = pd.get_dummies(df['hour'], prefix='hour')
df = df.join(hour_dummies)
# Features ใหม่: OAT + ทุกชั่วโมง dummy
feature_cols = ['OAT (F)'] + [c for c in df.columns if c.startswith('hour_')]
X = df[feature_cols]
y = df['Power (kW)']
# Train ใหม่
model = LinearRegression()
scores = []
kfold = KFold(n_splits=3, shuffle=True, random_state=42)
for i, (train, test) in enumerate(kfold.split(X, y)):
model.fit(X.iloc[train, :], y.iloc[train, :])
scores.append(model.score(X.iloc[test, :], y.iloc[test, :]))
print(scores)
# [0.807, 0.814, 0.811] - R² ประมาณ 0.81 (ดีขึ้นมาก!)
สรุป
- Baseline model (OAT only): R² ≈ 0.39
- เพิ่ม Time of Day (24 hour dummies): R² ≈ 0.81
- Time of Day เป็น feature สำคัญมากสำหรับการทำนายการใช้พลังงาน
- ขั้นตอนสำคัญ: EDA → Outlier removal → Feature engineering → Cross validation
Libraries ที่ใช้
pandas- จัดการข้อมูลscikit-learn- LinearRegression, KFoldscipy.stats- zscore สำหรับ outlier detectionmatplotlib- visualization