穿過雜亂的一條線
到目前為止,本階教會了你去估計一個數字、去檢驗一個論斷。但精算師真正靠它領薪水去回答的問題,幾乎從來不是一次只來一個變數。它們聽起來像這樣:隨著一位車主年齡漸長,給他承保的成本會怎麼變?吸菸真的會推高醫療成本嗎,又推高多少?迴歸正是為這類問題而生的工具——它是一門用其他一項或多項事物(預測變數)來解釋某一件事(結果變數)的學問。
想像一張散點圖。每一位投保人都是一個點:橫軸是他的年齡,縱軸是他每年的成本。這團點明顯地朝右上方飄移——年紀越大、成本越高——但它是一團雲,而不是一條曲線。沒有哪一條線能穿過每一個點。簡單線性迴歸下了一個謙遜卻有力的賭注:在這片散亂之下,存在一種直線式的趨勢,成本大致等於一個起始金額,再加上隨年齡每增一歲就穩定上升的一份量,剩下的不過是一個個生命各自的雜訊。我們把它寫成 成本 = a + b·年齡 + 誤差,而整場遊戲就是去挑出那條線——也就是 a 和 b 這兩個數——使它最貼合這團雲。
我們怎麼判斷哪條線最好?對任何一條候選線來說,每個點都會落在它的上方或下方一點點。那段豎直的間隔——實際發生的值減去這條線預測的值——就是這條線在那個點上的誤差。最小平方法就是這樣一條規則:它挑出能讓所有這些間隔(先各自平方)之總和儘可能小的那一條線。我們之所以要把間隔平方,理由和當初建構變異數時把偏差平方的誠實理由一模一樣:偏高和偏低都應算作誤差、而不應相互抵消,並且大的偏離要比小的偏離受罰更重。贏得這場比賽的那條線,就是迴歸線。
讀懂斜率與截距
一旦最小平方法把那條獲勝的線交到你手上,它找出的這兩個數就講出了一個你能脫口而出的故事。斜率 b 是變化率:預測變數每往前走一個單位,結果會移動多少。截距 a 是當預測變數取零時這條線給出的預測值——也就是這條線穿過成本軸的那一點。假設我們為醫療成本擬合出的線是 成本 = 400 + 70·年齡。斜率 70 說的是:年齡每多一歲,每年成本大約多出 70。截距 400 則是這條線在年齡為零處給出的預測。
這裡有一條漂亮的線索把我們帶回上一條主線。迴歸線的斜率,與預測變數和結果之間的共變異數密切相連:它正是這兩者的共變異數,除以預測變數的變異數。所以迴歸並不是從外面硬裝上來的全新想法——它就是你已經見過的那種共同變動,被重新塑造成一種可用的預測。正相關把線向上傾斜;相關越強,這團雲就越緊地裹在線的周圍。迴歸所做的,不過是把「這兩者傾向於一起動」翻譯成「給我一個年齡,我就還你一個預測的成本」。
殘差:模型坦白之處
我們靠把平方間隔最小化找到了那條線——可一旦線畫好了,這些間隔並不會就此消失。每一段剩下的間隔,對照最終擬合出的那條線算出來,都有一個名字:殘差。對每一個資料點,殘差 = 實際發生的值 減去 模型預測的值。一位 52 歲、花費 4,200 的投保人,對照一條預測為 400 + 70·52 = 4,040 的線,殘差就是 +160:模型對他低估了 160。殘差不是需要道歉的失誤。它們是模型對自己解釋不了的一切,所做的誠實坦白。
而這份坦白,正是真正的診斷力量所在。如果你的線真的抓住了規律,那麼留下的殘差就應當看起來像一片沒有特徵的隨機雜訊——均勻地散布在零的上下,毫無形狀。所以你把殘差畫出來,然後去搜尋形狀,因為任何形狀都是模型在告訴你它漏掉了什麼。一團彎成微笑狀的殘差雲,意味著真實關係從來就不是一條直線。一片隨著預測值增大而張開的殘差扇形,意味著離散程度並非恆定。少數幾個孤零零地遠離其餘的殘差,則是離群點——也許是幾筆巨災理賠,正悄悄地把整條線拉向它們自己。
當一個預測變數不夠用時
真實的結果很少只倚靠單一原因。醫療成本會隨年齡上升,沒錯——但它也隨吸菸、隨地區、隨慢性病而上升。多元迴歸讓每一個預測變數都在同一個方程裡同時發揮作用:成本 = a + b1·年齡 + b2·吸菸 + b3·地區 + 誤差。最小平方法照樣在幹活,只是現在它要同時挑出好幾個係數,使所有這些項加在一起時的平方殘差儘可能小。那條線變成了多維空間裡一張傾斜的平面,但想法沒變:找出那張被資料貼得最緊的曲面。
這就解鎖了那個讓這門技術如此寶貴的問題。多元迴歸裡的每一個係數,都是在把其餘所有變數都固定住的前提下、它對應那個預測變數的效應。仔細讀 成本 = 400 + 70·年齡 + 1,200·吸菸:這裡的 70,如今是在已經計入吸菸狀態之後、年齡每增一歲的成本;而 1,200,則是在已經計入年齡之後、身為吸菸者的成本。若沒有這一點,年齡和吸菸就會纏在一起——如果你樣本裡上了年紀的人恰好抽菸更多,單變數模型就會把吸菸造成的損害記在年齡頭上。多元迴歸正是那台把彼此交疊的影響一一拆解開來的機器。
隨著預測變數增多,有兩條誠實的告誡會變得更尖銳。第一,當兩個預測變數本身就高度相關時——這叫多重共線性——模型就難以判斷該把效應記到哪一個頭上,於是它們各自的係數變得不穩定、難以解讀,哪怕整體預測仍然不錯。第二,不斷往裡塞更多變數,總會把樣本內的擬合往上推一點,這就誘發了過度擬合:一個過分熱心的模型,開始去背誦這份資料集裡隨機的怪癖,而不是去學真正的信號。這正是為什麼像調整後 R 平方、AIC 和 BIC 這些誠實的指標,只有在為每多加一個旋鈕收取一份罰分之後,才會因模型擬合得好而給它獎勵。
從直線到精算師的主力工具
普通線性迴歸所做的假設,恰恰被保險資料爽快地一一違反。它期望結果可以是直線上的任意數、且離散程度恆定——可理賠次數是非負的整數,理賠金額為正且嚴重右偏,而機率必須待在 0 和 1 之間。廣義線性模型(GLM)就是那個優雅的修補。它保留了「把加權後的預測變數相加」這套熟悉的機器,卻允許結果服從一個更合身的分布——次數用卜瓦松、偏斜的金額用伽瑪——並透過一個連結函數把預測變數與結果連起來,最常用的是對數連結,好讓各因子相乘而非相加。
現代保險公司給個人險種定價,走的正是這條路。一個卜瓦松GLM為「你多久理賠一次」建模;一個伽瑪 GLM 為「每次理賠花多少錢」建模;兩者相乘,你就從基礎那條主線把純保費重新搭了出來。各個費率變數——年齡、車輛、地區、既往理賠——都各自作為一個乘法相對係數進入模型,把一個基準費率往上或往下縮放。這些係數不再用最小平方法去擬合,而是用最大概似估計——也就是本階前面那條估計原則:選出能讓你真正觀測到的資料出現的機率儘可能大的那組參數。監理者之所以接受 GLM,恰恰是因為它的每一個係數都有一份樸素而站得住腳的含義。
Fitted multiple regression: cost = 400 + 70*age + 1200*smoker A 52-year-old smoker: predicted = 400 + 70*52 + 1200*1 = 5240 if actual cost was 5500 -> residual = 5500 - 5240 = +260 GLM (auto pricing), log link makes factors MULTIPLY: premium = base * f(age) * f(territory) * f(vehicle) e.g. = 300 * 1.40 * 0.90 * 1.15 = 435
這個領域最常重複的告誡
現在,把這個領域最愛的告誡落到實處:相關不是因果。 一個迴歸係數度量的是關聯——也就是兩樣東西一起動——而絕不是「一個導致了另一個」的證明。一年之中,冰淇淋的銷量和溺水死亡數會一同上升,斜率為正、漂漂亮亮,可兩者誰也不是對方的起因;是夏日的炎熱同時驅動了二者。把氣溫也放進模型裡,冰淇淋與悲劇之間那條虛假的聯繫便會轟然瓦解。迴歸嗅不出潛伏的第三個變數;你餵給它什麼樣的共同變動,它就忠實地把那個變動擬合出來,再配上一個看著信心十足的係數報告給你。
與它成對出現的告誡同樣重要:擬合得好不等於模型為真。 一個把你的歷史資料貼得嚴絲合縫的模型,學到的可能是雜訊、而非這個世界;把過去擬合得最好的那個模型,幾乎從來不是把未來預測得最好的那個——這正是過度擬合教給我們的一課。唯一誠實的裁決,來自模型從未見過的資料:一份留出樣本,或者交叉驗證——用一部分去擬合,用其餘去衡量誤差。每個模型還都悄悄地把自己的假設烤了進去——正確的分布、正確的變數、一種在它所選標度上確實是線性的關係——而且只有當你親手把預測變數之間的交互項放進去時,它才會去捕捉那個交互。
這一切都不會讓迴歸變得不那麼有力——它只會讓一個用迴歸的人變得值得信賴。同樣的告誡一路延伸進機器學習:在那裡,隨機森林、提升樹和神經網路預測得更銳利,卻仍舊只能找到相關、永遠找不到因果,而且會悄悄學會拿一個郵遞區號去當某樣它絕不能據以定價之物的替身。精算師的角色,正從親手搭建每一個模型,轉向去驗證它、治理它、為它背書。無論用的是什麼工具,所遵循的紀律都和整條這一階始終在教的那一條一樣:誠實地估計、誠實地檢驗,永遠不要把一個擬合得好的數字,錯當成關於這個世界的一條真相。