上一種模型預測配送要花幾分鐘;現在換一個問題:這張訂單會不會延遲?
若直接用一條沒有輸出限制的直線預測「延遲機率」,可能算出−0.2或1.4,無法當成機率。羅吉斯迴歸先計算線性分數,再用sigmoid把它映射到0和1之間,建立二元事件的機率模型。
這篇要把四件事拆開:怎麼算出機率型輸出、用什麼損失學參數、怎麼把分數轉成決策,以及機率到底準不準。名字有「迴歸」,不代表它在這裡預測的是連續分鐘數;它把線性結構放在log-odds上。
第一步仍是加權和,輸出先叫z
二元羅吉斯迴歸先用特徵計算一個線性分數:
z = b + w₁x₁ + w₂x₂ + …
p = sigmoid(z) = 1 / (1 + exp(−z))
p用來表示模型估計的正類機率。你要先定義正類,例如延遲為1、準時為0;正類變了,機率的解釋也跟著變。
z可以是任何實數;sigmoid對它做非線性轉換,但不是把大於1的值直接截成1。中間附近對z的變化比較敏感,兩端則逐漸變平。
算一次:距離先影響分數,再影響機率
假設一個教學模型的截距是−3,距離係數是0.8,距離以公里輸入。這組係數是本文設定,不是從真實訂單訓練而來。
z = −3 + 0.8×距離
p = 1 / (1 + exp(−z))
| 距離 | 線性分數z | 模型延遲機率p |
|---|---|---|
| 1公里 | −2.2 | 約0.100 |
| 3公里 | −0.6 | 約0.354 |
| 5公里 | 1.0 | 約0.731 |
同樣多兩公里,機率增加量不是固定的,因為線性的是z,不是p。這個模型也沒有證明距離造成延遲;它只按目前公式,把距離轉成一個機率型預測。
係數解釋要回到odds,不能直接說機率乘幾倍
機率p與odds不同。odds是正類機率和負類機率的比值:
odds = p / (1−p)
log-odds = ln(odds) = z
若p=0.75,odds為3,表示正類對負類是3比1;不是75比1。
在其他特徵固定時,某個輸入增加一單位,log-odds增加該係數,odds則乘上係數的指數。剛才距離係數0.8,意味每公里的模型odds乘 exp(0.8)≈2.226,不是延遲機率直接乘2.226。
截距−3是所有輸入為0時的log-odds,exp(−3)才是那個位置的odds。零輸入是否有實際意義,也要回到特徵定義;模型係數的條件關係仍不能直接當成因果效果。
訓練不只看猜對沒,還看機率有多合理
同一張真正延遲的訂單,預測0.51與0.99在0.5閾值下都判延遲,但兩個機率承諾不同。只看分類正確與否,無法區分它們。
二元log loss,也叫二元交叉熵,對單筆資料的定義是:
loss(y,p) = −[y×ln(p) + (1−y)×ln(1−p)]
y=1:loss = −ln(p)
y=0:loss = −ln(1−p)
| 真實結果 | 預測p=0.1 | 預測p=0.5 | 預測p=0.9 |
|---|---|---|---|
| y=1 | 約2.303 | 約0.693 | 約0.105 |
| y=0 | 約0.105 | 約0.693 | 約2.303 |
用自然對數計算時,越有把握卻猜錯,懲罰越大。這鼓勵模型改善機率預測,而不是只把分數推過一條分類線。
多筆資料可以加總,也可以取平均。比較數值時要先確認是哪一種,不能把一張總損失圖與另一張平均損失圖當成相同尺度。計算log loss時要保留p,不能先變成0/1標籤再代入對數。
三筆數值核對:這裡先驗算前向計算
以下用剛才的三個距離,另外設定真實標籤為0、0、1。程式只做指定係數下的機率與平均損失,不會學出或更新係數。
from math import exp, log, log1p
distance = [1.0, 3.0, 5.0]
y = [0, 0, 1]
b, w = -3.0, 0.8
z = [b + w * x for x in distance]
p = [1.0 / (1.0 + exp(-score)) for score in z]
losses = [-log(q) if label == 1 else -log1p(-q) for label, q in zip(y, p)]
print("分數:", [round(v, 3) for v in z])
print("機率:", [round(v, 3) for v in p])
print("平均log loss:", round(sum(losses) / len(losses), 6))
for threshold in [0.5, 0.3]:
print("閾值與標籤:", threshold, [int(q >= threshold) for q in p])
本次用Python 3.10.12在WSL執行,分數為 [-2.2,-0.6,1.0],機率約 [0.100,0.354,0.731],平均log loss約0.285278。閾值0.5得到 [0,0,1],0.3得到 [0,1,1]。這個小範圍公式用來讀懂流程;極大或極小分數在正式系統中應採用數值穩定的實作。
最大概似是估計目標,梯度下降是求解方法
若把每筆標籤視為模型給定機率下的二元結果,最大化觀察到這組標籤的概似,等價於最小化對應的負對數概似,也就是加總log loss。固定樣本數下,改成平均不改變未正則化目標的最小值位置。
梯度下降可以用來求這個目標。它不是與最大概似互斥的另一種目標;也可以採用其他數值優化方法。
對單特徵、平均二元交叉熵,梯度可以寫得很簡單:
∂L/∂b = (1/n) Σ(pᵢ−yᵢ)
∂L/∂w = (1/n) Σ(pᵢ−yᵢ)×xᵢ
先用目前係數算p與梯度,再依學習率更新。對線性logit與log loss,目標對參數是凸的,但步長與數值條件仍重要;不代表每個任意更新都能降低損失。
資料完全可分、又沒有正則化時,係數可能越推越大,讓訓練損失趨近0,卻沒有有限的最大概似係數解。適當正則化與模型選擇,可以幫助控制這類問題;訓練分數仍要和保留資料上的表現一起看。
閾值改的是決策,不會重新學出一套機率
剛才程式只改threshold,p完全沒有變。你可以把同一組機率拿來做不同容量、誤報成本或漏報成本下的決策,但要在開發資料上選設定,再保留獨立評估。
若只有原始線性特徵,在固定閾值下,決策邊界對應一個線性分數等於常數的位置;加入非線性特徵後,原始輸入空間的邊界則可以彎曲。不要把sigmoid曲線的S形,直接當成所有二維資料上的分類邊界形狀。
排名、分類與校準,是不同的檢查
校準問的是:那些被報接近0.8的樣本,是否大約有八成實際為正類?把輸出限制在0到1,沒有自動滿足這個條件。模型設錯、正則化過強或樣本太少,都可能讓羅吉斯迴歸的機率不準。
這張圖只支持原例中的比較,不是模型家族的永久排名。校準曲線也要看各箱筆數與資料代表性;整體接近對角線,不保證每個城市、時段或子群都一樣可信。
Log loss同時反映機率預測的辨別能力與校準等因素,不能把它直接當成純校準誤差。需要校準器時,擬合與評估也要避免資料洩漏;不能拿基礎模型已看過的答案,再當成獨立證據。
什麼時候從羅吉斯迴歸開始?
當目標是明確的二元事件、你希望有容易檢查的特徵與係數結構,它常是值得建立的基準。前提是輸入可得性、類別編碼、尺度、正則化與切分都正確,並且驗證支持這種表示。
若重要關係無法由目前特徵的線性logit表達,可以比較非線性特徵、交互作用或其他模型。先問是哪種錯誤與資料條件沒有被處理,而不是因為模型名字較老就跳過它。
交付時把正類、機率型輸出、分類閾值、選擇依據與校準檢查分開交代。這樣讀者才知道一個0.8到底是一個模型分數、經驗上可信的風險估計,還是一個尚未驗證的數字。
來源與圖像授權
- Google,Sigmoid function、Loss and regularization:羅吉斯函數與訓練目標。本文按二元概似說明log loss,沒有將它簡化為只是省記憶體。
- Erin Bugbee、Jared Wilber/Amazon MLU-Explain,Logistic Regression:圖3–4依CC BY-SA 4.0使用;圖4的文字描邊與標籤調整已註明,改作圖沿用相同授權,不表示Amazon為本站背書。
- Google圖1–2、5–7依CC BY 4.0使用,逐圖保留原頁,見網站政策。
- scikit-learn,log_loss、Probability calibration:平均/加總損失、機率校準與評估限制。
- scikit-learn developers的PR原例與校準比較原例:圖8–9依BSD 3-Clause再利用,完整聲明附於下方。
配送距離、係數與標籤為本文另設教學資料;只實際執行其前向機率與損失計算,未訓練配送或天氣服務,也未重跑原圖實驗。
圖像授權聲明
以下保留scikit-learn原圖完整BSD聲明,原作者沒有為本站背書。
BSD 3-Clause License
Copyright (c) 2007-2026 The scikit-learn developers.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
封面沿用本篇 Google 原圖,僅等比縮放並加白邊保留全圖,依原圖相同 CC BY 4.0 條件使用。
手機版圖2將原圖左、右兩幅依序改為上、下排列,移除兩圖間的水平箭頭;座標、公式與資料點不變。原圖由 Google 提供,依 CC BY 4.0 改作。
留言0
登入後就能留言。
登入