AI時代系列(3) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
26/100 第三週:監督學習(回歸)
26. 支援向量回歸(SVR) 🔥 適合複雜數據,透過超平面找到最佳預測點!
🔥 支援向量回歸(SVR)
適合複雜數據,透過超平面找到最佳預測點!
________________________________________
📌 1️⃣ 什麼是支援向量回歸(SVR)?
支援向量回歸(Support Vector Regression, SVR)是 支援向量機(SVM) 在 回歸問題 中的應用。
它的核心概念是:
• 不像線性回歸只最小化誤差,而是尋找「最大間隔」的最佳超平面
• 允許一小部分數據點位於「誤差範圍(ε tube)」外
• 適合複雜、非線性數據,能找到更平滑的擬合曲線
________________________________________
📌 2️⃣ 支援向量回歸(SVR) vs. 傳統回歸
線性回歸與支援向量回歸(SVR)都是回歸分析的方法,但核心目標與適用場景有所不同。線性回歸著重於最小化整體的均方誤差(MSE),所有數據點的偏差都會影響模型,因此適合用於數據具有明顯線性關係的情境。相較之下,SVR 更關注在誤差容忍範圍「ε tube」之外的數據點,目的是找到一條在容忍範圍內最平滑的超平面,忽略範圍內的微小誤差,特別適合處理非線性或複雜結構的數據。簡而言之,線性回歸追求整體誤差最小化,SVR 則更強調對異常點和邊界的精確控制,適用於更具挑戰性的資料型態。
✅ SVR 特別適合非線性回歸問題!
________________________________________
📌 3️⃣ SVR 的核心概念
🎯 目標
• 找到一條「間隔最大」的超平面,使誤差在 ±ε 內的數據點 不影響模型
• 只有「超過誤差範圍(ε tube)」的數據點才會影響模型
• 這讓 SVR 對異常值更有彈性,避免過擬合
📊 數學公式
SVR 的核心目標是:
找到一個函數 f(x)=w^Tx+b,使預測值距離實際值在「ε 容忍範圍」內,並且讓模型儘可能平滑。
比喻:
SVR 目標就像是——「開車過山路時,在允許的偏移範圍內盡量平穩前進,超出範圍就付出代價,但整體要保持路線平滑,避免激烈操作。」
________________________________________
📌 4️⃣ SVR 的三種核心內核(Kernels)
1. 線性內核(Linear Kernel) → 適合數據呈線性分佈
2. 多項式內核(Polynomial Kernel) → 適合稍微非線性的數據
3. RBF(徑向基函數內核) → 適合高度非線性數據,最常用
✅ RBF 是最常用的內核,因為它能夠適應大多數數據類型!
________________________________________
📌 5️⃣ Python 實作:SVR
🎯 目標:預測房價(非線性數據)
我們比較:
1. 線性回歸(Linear Regression)
2. SVR(RBF 內核)
________________________________________
✅ (1) 產生非線性數據
python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.svm import SVR
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
# 產生非線性數據(房屋面積 vs. 房價)
np.random.seed(42)
X = np.random.randint(20, 200, size=(50, 1)) # 房屋面積
y = 3000 * np.sqrt(X) + np.random.randint(-50000, 50000, size=(50, 1)) # 非線性房價
# 繪製數據
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("房價 vs. 房屋面積(非線性數據)")
plt.legend()
plt.show()
📌 房價與房屋面積的關係呈現非線性曲線,線性回歸可能不適用!
________________________________________
✅ (2) 訓練線性回歸 vs. SVR
python
# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 🔹 線性回歸
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
# 🔹 標準化數據(SVR 需要標準化)
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X_train_scaled = scaler_X.fit_transform(X_train)
X_test_scaled = scaler_X.transform(X_test)
y_train_scaled = scaler_y.fit_transform(y_train)
# 🔹 訓練 SVR(RBF 內核)
svr_reg = SVR(kernel='rbf', C=100, epsilon=100)
svr_reg.fit(X_train_scaled, y_train_scaled.ravel())
📌 為什麼 SVR 需要標準化?
• SVR 對數據範圍敏感,如果不標準化,可能會影響結果
________________________________________
✅ (3) 預測與評估
python
# 預測
y_pred_lin = lin_reg.predict(X_test)
y_pred_svr = scaler_y.inverse_transform(svr_reg.predict(X_test_scaled).reshape(-1, 1)) # 反標準化
# 計算 MSE 和 R²
mse_lin = mean_squared_error(y_test, y_pred_lin)
r2_lin = r2_score(y_test, y_pred_lin)
mse_svr = mean_squared_error(y_test, y_pred_svr)
r2_svr = r2_score(y_test, y_pred_svr)
print(f"線性回歸 - MSE: {mse_lin:.2f}, R²: {r2_lin:.4f}")
print(f"SVR - MSE: {mse_svr:.2f}, R²: {r2_svr:.4f}")
📌 結果示例:
線性回歸 - MSE: 3.5e+10, R²: 0.55
SVR - MSE: 1.2e+9, R²: 0.92
📌 解讀
• SVR MSE 明顯更低(誤差小)
• R² 接近 1,代表 SVR 擬合效果更佳!
________________________________________
✅ (4) 視覺化 SVR 的預測曲線
python
# 產生更細的測試點來畫曲線
X_grid = np.linspace(min(X), max(X), 100).reshape(-1, 1)
X_grid_scaled = scaler_X.transform(X_grid)
y_pred_svr_curve = scaler_y.inverse_transform(svr_reg.predict(X_grid_scaled).reshape(-1, 1))
# 繪製結果
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.plot(X, lin_reg.predict(X), color='red', linewidth=2, label="線性回歸")
plt.plot(X_grid, y_pred_svr_curve, color='green', linewidth=2, label="SVR 擬合曲線")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("SVR vs. 線性回歸")
plt.legend()
plt.show()
📌 結果:
• 線性回歸(紅色):擬合效果不佳
• SVR(綠色):擬合曲線更符合數據
________________________________________
📌 6️⃣ SVR 的優缺點
✅ 優點
• 適合非線性數據
• 對異常值不敏感
• 可用不同內核(RBF, Polynomial)擬合不同數據
⚠ 缺點
• 計算成本較高(O(n²))
• 需要標準化數據
• 參數(C, ε, kernel)需要調整
________________________________________
🎯 總結
✅ SVR 對非線性數據效果比線性回歸好!
✅ RBF 內核最常用,能適應大多數情境
✅ 適合複雜數據,但計算成本較高
🚀 下一步:探索「隨機森林回歸」來提升預測能力!🌲🔥