專項練習 · 10 分鐘閱讀

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、基線與外推。

打開練習

繼續閱讀: