AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
24/100 第三週:監督學習(回歸)
24. 多項式回歸 🏛 當線性回歸不夠用時,讓 AI 用曲線來擬合資料!
🏛 多項式回歸(Polynomial Regression)
當線性回歸不夠用時,讓 AI 用曲線來擬合資料!
________________________________________
📌 1️⃣ 為什麼需要多項式回歸?
線性回歸只能擬合直線,但現實數據通常是非線性的!
例如:
• 房價變化:隨著時間或市場需求,房價可能呈曲線增長 📈
• 疾病進展:某些疾病的惡化速度隨時間呈指數或拋物線型變化 🏥
• 車速與煞車距離:當車速增快時,煞車距離呈現二次曲線 🚗💨
這時候,我們可以使用 多項式回歸(Polynomial Regression) 來擬合 非線性數據!
它其實是 線性回歸的一種擴展,但它增加了 高次項特徵,讓回歸線變成曲線。
________________________________________
📌 2️⃣ 多項式回歸的數學公式
多項式回歸方程(以二次為例):
y=w1X+w2X平方+by
這樣,回歸線就變成了一條 拋物線 📈!
當我們增加 更高次項(n次方) 時,模型可以擬合更複雜的非線性關係。
________________________________________
📌 3️⃣ Python 實作:多項式回歸
🎯 例子:房價隨著房屋面積的非線性變化
我們用 線性回歸 vs. 多項式回歸 來對比它們的擬合效果。
________________________________________
✅ (1) 產生數據
python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
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 * X**2 - 5000 * X + 100000 + np.random.randint(-500000, 500000, size=(50, 1)) # 非線性房價
# 繪製散點圖
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("房價 vs. 房屋面積")
plt.legend()
plt.show()
📌 房價 vs. 房屋面積的數據呈現「非線性曲線關係」。
________________________________________
✅ (2) 使用線性回歸擬合
python
# 創建線性回歸模型
lin_reg = LinearRegression()
lin_reg.fit(X, y)
# 預測
y_pred_lin = lin_reg.predict(X)
# 繪製圖形
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.plot(X, y_pred_lin, color='red', linewidth=2, label="線性回歸擬合")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("線性回歸擬合效果")
plt.legend()
plt.show()
📌 結果: 線性回歸無法準確擬合數據,因為數據是非線性的!
________________________________________
✅ (3) 使用二次多項式回歸擬合
python
# 創建二次多項式特徵
poly = PolynomialFeatures(degree=2) # 2 次方
X_poly = poly.fit_transform(X)
# 創建並訓練模型
poly_reg = LinearRegression()
poly_reg.fit(X_poly, y)
# 預測
y_pred_poly = poly_reg.predict(X_poly)
# 繪製圖形
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.plot(X, y_pred_poly, color='green', linewidth=2, label="二次多項式回歸擬合")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("二次多項式回歸擬合效果")
plt.legend()
plt.show()
📌 結果: 多項式回歸能準確擬合數據,擬合的曲線明顯更符合原始數據!
________________________________________
✅ (4) 模型評估
我們比較 線性回歸 vs. 多項式回歸 的 均方誤差(MSE) 和 決定係數(R²):
python
# 計算 MSE 和 R²
mse_lin = mean_squared_error(y, y_pred_lin)
r2_lin = r2_score(y, y_pred_lin)
mse_poly = mean_squared_error(y, y_pred_poly)
r2_poly = r2_score(y, y_pred_poly)
print(f"線性回歸 - MSE: {mse_lin:.2f}, R²: {r2_lin:.4f}")
print(f"二次多項式回歸 - MSE: {mse_poly:.2f}, R²: {r2_poly:.4f}")
📌 結果示例:
線性回歸 - MSE: 3.2e+10, R²: 0.45
二次多項式回歸 - MSE: 1.5e+9, R²: 0.92
📌 解讀:
• MSE(均方誤差)越小越好 → 多項式回歸誤差比線性回歸小很多
• R²(決定係數)越接近 1 越好 → 多項式回歸的 R² 遠高於線性回歸
________________________________________
📌 4️⃣ 何時使用多項式回歸?
多項式回歸適用於數據呈現非線性關係的情境,當散點圖中的數據點顯示出彎曲的趨勢時,利用多項式回歸可以更精準地擬合這種曲線型態。此外,當數據量較小、無法有效運用成本較高的深度學習技術時,多項式回歸是一種簡單又強大的替代方案,能有效捕捉數據中的複雜關係。同時,多項式回歸透過特徵轉換,將原始特徵擴展到更高維度,使模型能學習到更多樣的模式與變化,進一步提升預測能力。
________________________________________
📌 5️⃣ 選擇適當的多項式次數(Degree)
如果次數太高(如 10 次),模型可能會過擬合(Overfitting),學習到噪音而非真正的模式。
📌 建議
• Degree = 2~3:通常可以解決大多數非線性問題
• Degree > 5:可能會過擬合,需要謹慎使用
• 使用交叉驗證(Cross-Validation) 找到最佳次數
________________________________________
🎯 結論
✅ 線性回歸無法擬合非線性數據,多項式回歸能解決這個問題!
✅ 二次或三次多項式回歸通常足夠,不建議使用過高次數!
✅ 多項式回歸適合小型數據集,在大數據上可能不如神經網絡有效!
🚀 下一步:探索「決策樹回歸」來處理更複雜的數據! 🌲