Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Linear Regression ใน Python: คู่มือครบวงจรพร้อมโค้ดและการวิเคราะห์

Linear Regression (ถดถอยเชิงเส้น) เป็นเครื่องมือ Machine Learning พื้นฐานสำหรับวิเคราะห์ความสัมพันธ์ระหว่างตัวแปรสองตัว (บวก/ลบ) และใช้ทำนายได้รวดเร็ว

Regression คืออะไร?

เทคนิคการสร้างแบบจำลองเชิงพยากรณ์ (Predictive Modeling) ที่สร้างความสัมพันธ์ระหว่าง Dependent Variable (Y) และ Independent Variable (X)

ประเภทของ Regression

  • Linear Regression
  • Logistic Regression
  • Polynomial Regression
  • Stepwise Regression

ขั้นตอนสร้างโมเดล Linear Regression

  1. Setup: โหลด dataset และ Jupyter Notebook
  2. Import libraries และ dataset
  3. Explore dataset (EDA)
  4. สร้าง Linear Regression model
  5. วิเคราะห์ความสัมพันธ์กับ Time of Day
  6. สรุปผล

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, KFold
  • scipy.stats - zscore สำหรับ outlier detection
  • matplotlib - visualization