這段 Python 計算的是哪個迴歸評估指標?
附圖程式碼所計算的是哪一類型的評估指標?def metric(y_true, y_pred):
return sum((y_true - y_pred) ** 2) / len(y_true)
這段 Python 函數接收真實值(y_true)和預測值(y_pred),做了:「算每個差值的平方,加總,再除以樣本數」。
問你:這個計算對應的是哪一個迴歸評估指標的公式?
一句話總結
這段程式碼計算的是 MSE(均方誤差):把每個樣本的預測誤差平方起來,加總後除以樣本數,公式是 Σ(yᵢ − ŷᵢ)² / n。
先感受問題:程式碼在算什麼?逐行讀懂它
「數據智能」公司的工程師張薇在評估一個房價預測模型,她寫了一個自定義的評估函數,想確認自己有沒有寫對。
她的程式碼做了三件事:
→ 算每筆資料的「預測誤差」(真實房價 − 預測房價)
步驟 2:(y_true - y_pred) ** 2
→ 把每個誤差「平方」(讓正負誤差都變成正數,且大誤差懲罰更重)
步驟 3:sum(...) / len(y_true)
→ 「加總」所有平方誤差,再「除以樣本數 n」→ 取平均
這三個步驟就是「均方誤差(MSE, Mean Squared Error)」的定義:誤差平方的平均值。
四個迴歸指標的公式有什麼不同?
- MAE(平均絕對誤差):取誤差的「絕對值」再平均,公式是 Σ|yᵢ − ŷᵢ| / n。和 MSE 的差異:MAE 用絕對值,MSE 用平方。程式碼中是 ** 2(平方)不是 abs()(絕對值),所以不是 MAE。
- MSE(均方誤差):取誤差的「平方」再平均,公式是 Σ(yᵢ − ŷᵢ)² / n。程式碼完全對應這個公式。
- RMSE(均方根誤差):MSE 再開根號,公式是 √[Σ(yᵢ − ŷᵢ)² / n]。程式碼沒有開根號(沒有 np.sqrt 或 ** 0.5),所以不是 RMSE。
- R²(決定係數):衡量模型解釋了多少資料變異量,公式複雜,涉及 SS_res / SS_tot 的比較,和「差的平方除以 n」完全不同的結構。
- 辨識關鍵:MSE vs RMSE 的差別只有一個開根號:這是最容易混淆的地方。MSE = Σ差² / n;RMSE = √(MSE)。看到程式碼裡有沒有 sqrt 或 ** 0.5,是分辨兩者的關鍵。
逐行對照程式碼和 MSE 公式
張薇逐行確認她的函數:
程式碼:
(y_true - y_pred) ** 2 → (yᵢ − ŷᵢ)² ✓(每個樣本的平方誤差)
sum(...) → Σ ✓(加總所有樣本)
/ len(y_true) → / n ✓(除以樣本數,取平均)
完整對應:sum((y_true - y_pred) ** 2) / len(y_true) = (1/n) × Σ(yᵢ − ŷᵢ)² = MSE ✓
確認:沒有 abs()(所以不是 MAE),沒有 sqrt(所以不是 RMSE),沒有和 SS_tot 比較(所以不是 R²)。
這就是選項 B 講的:MSE。
技術版:四個迴歸評估指標的公式與 Python 實作
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
你預測了 5 天的氣溫,預測值和真實值有誤差。MAE:把每天的誤差取絕對值(不管正負)再平均,「平均差了幾度」。MSE:把每天的誤差先平方(放大大誤差的懲罰),再平均,「平均平方誤差是多少」。RMSE:把 MSE 開根號,讓單位回到「度」,方便和實際溫度比較大小。R²:模型解釋了多少變異量,範圍 0 到 1,越接近 1 越好。
| 指標 | 公式 | Python 實作 |
|---|---|---|
| MAE | Σ|yᵢ−ŷᵢ| / n | sum(abs(y_true - y_pred)) / len(y_true) |
| MSE | Σ(yᵢ−ŷᵢ)² / n | sum((y_true - y_pred)**2) / len(y_true) |
| RMSE | √[Σ(yᵢ−ŷᵢ)² / n] | np.sqrt(sum((y_true - y_pred)**2) / len(y_true)) |
| R² | 1 − SS_res/SS_tot | 1 - sum((y_true-y_pred)**2) / sum((y_true-y_true.mean())**2) |
- yᵢ(y_true)
- 第 i 個樣本的真實值
- ŷᵢ(y_pred)
- 第 i 個樣本的模型預測值
- (yᵢ − ŷᵢ)²
- 第 i 個樣本的平方誤差,平方讓正負誤差都變正,且放大大誤差的影響
- n(len(y_true))
- 樣本數量,除以 n 取平均
- SS_res
- 殘差平方和:Σ(yᵢ − ŷᵢ)²,R² 用到
- SS_tot
- 總平方和:Σ(yᵢ − ȳ)²,R² 用到
房價預測(萬元): y_true = [200, 350, 180, 420] y_pred = [210, 330, 175, 440] 誤差 = y_true - y_pred = [-10, 20, 5, -20] 平方誤差 = [100, 400, 25, 400] sum = 100 + 400 + 25 + 400 = 925 MSE = 925 / 4 = 231.25 RMSE = √231.25 ≈ 15.2(萬元) MAE = (10 + 20 + 5 + 20) / 4 = 13.75(萬元) → RMSE 和 MAE 的單位和 y 一樣(萬元),較直觀 → MSE 的單位是「萬元²」,較難直觀解讀,但常作為損失函數
- MSE 和 MAE 相比,哪個對「極端大誤差」更敏感?為什麼?
- RMSE 和 MSE 哪個更適合和真實值直接比較大小?
- 如果要在 Python 中計算 RMSE,要在 MSE 的基礎上加什麼?
- R² = 0.85 代表什麼意思?R² 可以是負數嗎?
- 在深度學習中,MSE 常被直接當作損失函數(Loss Function),為什麼不用 MAE?
為什麼其他選項是錯的
字面在說什麼:這段程式碼計算的是平均絕對誤差。
為什麼不對:MAE 的公式是 Σ|yᵢ − ŷᵢ| / n,關鍵操作是「取絕對值」(abs)。程式碼中是 ** 2(平方),不是 abs()(絕對值)。平方和絕對值的差異決定了 MSE 和 MAE 的不同:平方讓大誤差懲罰更重,絕對值對每個誤差的懲罰是線性的。
誰會選錯:看到「誤差的某種平均」就猜 MAE,沒有仔細看是「平方」還是「絕對值」的人。
字面在說什麼:這段程式碼計算的是均方根誤差。
為什麼不對:RMSE = √MSE,是在 MSE 的基礎上多加一個開根號(np.sqrt 或 ** 0.5)。程式碼中沒有任何開根號的操作,所以這是 MSE 而非 RMSE。RMSE 和 MSE 長得非常像,唯一差別就是最外層是否有 sqrt,這是最常見的混淆點。
誰會選錯:RMSE 是「更常被使用」的評估指標(因為和原始資料同單位),很多人腦中存的是 RMSE 而非 MSE,看到「差的平方然後平均」直接聯想到 RMSE,忘了 RMSE 還需要開根號。
字面在說什麼:這段程式碼計算的是 R²(R-squared)。
為什麼不對:R² 的公式是 1 − (SS_res / SS_tot) = 1 − [Σ(yᵢ − ŷᵢ)² / Σ(yᵢ − ȳ)²],需要用到「真實值的平均值 ȳ」和「總平方和 SS_tot」。程式碼只用了 y_true 和 y_pred,沒有計算 ȳ 或 SS_tot,結構完全不符。R² 的輸出在 0 到 1 之間(完美預測為 1),而 MSE 的輸出是誤差的量級,沒有固定範圍。
誰會選錯:看到「(真實值 − 預測值)² 的某種操作」就以為是 R² 的人,沒有記住 R² 公式的完整結構。
同個考點下次怎麼變形
直覺:RMSE 的程式碼和本題有什麼差?只改一行就行嗎?
答案:RMSE 只比 MSE 多一個開根號:import numpy as np; return np.sqrt(sum((y_true - y_pred)**2) / len(y_true)),或在最外面包上 ** 0.5。考試時看到「差²,加總,除以 n」有開根號就是 RMSE,沒有就是 MSE。這是最常見的一字之差陷阱。
直覺:MSE 和 MAE,對資料中的離群值(Outliers)誰更敏感?
答案:MSE 更敏感。因為 MSE 對誤差平方,一個極端大的誤差(如真實值 100,預測值 1,誤差 99,平方後 9801)會對 MSE 造成巨大影響。MAE 只取絕對值(|99| = 99),影響是線性的。如果資料中有離群值且不想讓它們主導評估,應選 MAE;如果想嚴厲懲罰大誤差,選 MSE 或 RMSE。
直覺:為什麼深度學習常用 MSE 作為損失函數,而不用 MAE?
答案:MSE 對所有點都可微分(導數是 2(yᵢ − ŷᵢ),處處存在且連續),梯度下降可以順利收斂。MAE 在誤差為 0 的點不可微(導數不連續),梯度下降在接近最優解時會「震盪」。數學上的可微性讓 MSE 成為標準損失函數選擇。
直覺:MSE 用在分類問題上合適嗎?
答案:不適合。分類問題的真實值是離散類別(0 或 1),不是連續數值,計算「預測機率和真實標籤的差的平方」在數學上可行,但意義不直觀,且對極端預測(如預測 0.01 但真實是 1)的懲罰不夠強。分類問題通常用交叉熵(Cross-Entropy Loss):log(p) 的形式,對確信但錯誤的預測給予極大懲罰。
直覺:R² = 0 和 R² < 0 分別代表什麼?
答案:R² = 0:模型的預測效果等同於「總用真實值的平均值預測」,模型學到了什麼,但和用均值預測一樣爛。R² < 0:模型比「永遠預測均值」還差,代表模型有嚴重問題(可能訓練或資料有 bug)。R² 越接近 1 越好,但 R² 高不代表預測誤差小,只代表模型解釋了大部分的變異。
想再往下看,這 5 個
- 均方誤差(MSE)本題核心:迴歸任務中最常用的損失函數與評估指標,誤差平方的平均,對大誤差懲罰更重。
- 均方根誤差(RMSE)MSE 的開根號版本,單位和原始資料相同,更直觀,也是最容易和 MSE 混淆的指標。
- 損失函數(Loss Function)MSE 在深度學習中常作為迴歸任務的損失函數,因為它處處可微,適合梯度下降優化。
- 梯度下降(Gradient Descent)訓練過程中最小化 MSE 等損失函數的標準優化方法,MSE 的可微性讓梯度下降順利收斂。
- 過擬合(Overfitting)訓練集 MSE 遠低於驗證集 MSE 是過擬合的典型症狀,兩者差距越大代表泛化能力越差。