Python 線性回歸練習:配適、預測與評估
這些練習把線性回歸縮小到可以手工檢查的程度。你會配適直線、用基線比較誤差,並判斷一個預測是否超出了證據範圍。
練習:把直線變成預測
先寫出預測規則。斜率控制輸入每增加一個單位時預測值的變化,截距決定起點高度。配適之前先測試一個輸入。
def predict(x, slope, intercept):
return slope * x + intercept
print(predict(4, 1.5, 2.0))先寫出可測試的規則
練習:用中心化求和配適
分別把 x 和 y 減去平均值,成對相乘偏差,再除以 x 的平方偏差和。這就是單輸入的最小平方法斜率。
xs = [1, 2, 3]
ys = [3, 5, 7]
mean_x = sum(xs) / len(xs)
mean_y = sum(ys) / len(ys)
slope = sum((x - mean_x) * (y - mean_y) for x, y in zip(xs, ys)) / sum((x - mean_x) ** 2 for x in xs)
intercept = mean_y - slope * mean_x
print(slope, intercept)手工完成配適
練習:與基線比較誤差
模型至少要勝過簡單基線。對每個輸入都預測訓練平均值,計算它的 MSE,再與配適直線的 MSE 比較。如果直線沒有更好,額外複雜度就沒有帶來價值。
xs = [1, 2, 3]
ys = [2, 4, 5]
mean_y = sum(ys) / len(ys)
baseline_mse = sum((y - mean_y) ** 2 for y in ys) / len(ys)
slope = 1.5
intercept = 2 / 3
model_mse = sum((y - (slope * x + intercept)) ** 2 for x, y in zip(xs, ys)) / len(xs)
print(round(baseline_mse, 2), round(model_mse, 2))先勝過平均值基線
練習:讓預測留在證據範圍內
範圍保護是模型介面的一部分。輸入超出訓練範圍時回傳明確結果,而不是悄悄外推。
def safe_predict(x, xs, slope, intercept):
if not min(xs) <= x <= max(xs):
return None
return slope * x + intercept
print(safe_predict(3, [1, 2, 3], 2.0, 0.0))
print(safe_predict(4, [1, 2, 3], 2.0, 0.0))超出範圍就明確回傳空值
練習:報告正確的單位
MSE 的單位是輸出單位的平方。均方根誤差回到原始單位,更容易解釋。把兩者都算一次,關係就清楚了。
import math
mse = 4.0
print(math.sqrt(mse))回到原始單位
你的練習清單
- 配適前先寫出預測規則。
- 檢查斜率的分母是否為零。
- 把配適模型與平均值基線比較。
- 在未參與配適的資料上報告誤差。
- 拒絕或標記超出訓練範圍的預測。
常見問題
線性回歸總是一條直線嗎?
單輸入的簡單線性回歸是一條直線。多輸入回歸配適平面或超平面,但最小平方法思想相同。
為什麼斜率會是負數?
配適出的關係可以為負:x 增大時預測 y 減小。符號是結果的一部分,不是錯誤。
可以跨資料集比較 MSE 嗎?
只有在輸出單位相同、評估資料可比時才可以。否則應比較 RMSE 或相對指標。
練習配適一條直線
12 道題,覆蓋斜率、截距、預測、MSE、基線與外推。
繼續閱讀: