戰(zhàn):從共線性診斷到模型落地)
簡介面向統(tǒng)計(jì)學(xué)入門者、數(shù)據(jù)分析人員和研究者的MATLAB多元線性回歸分析資源演示從建模、評估到預(yù)測的完整流程。壓縮包共2個文件、大小僅5KB含一個.m腳本和一個.xls數(shù)據(jù)表前者為可運(yùn)行的回歸分析代碼后者提供某省1970—1987年工農(nóng)業(yè)產(chǎn)值與運(yùn)輸業(yè)產(chǎn)值的實(shí)際數(shù)據(jù)便于對照練習(xí)目前已有2364人學(xué)習(xí)下載。內(nèi)容從回歸基本原理出發(fā)先介紹多元線性方程中模型參數(shù)與隨機(jī)誤差項(xiàng)的含義再講解利用fitlm函數(shù)建立模型、查看系數(shù)與R-squared評估指標(biāo)通過殘差圖、Q-Q圖檢驗(yàn)線性、獨(dú)立、正態(tài)、方差齊性等假設(shè)并查看系數(shù)顯著性檢驗(yàn)結(jié)果判斷各自變量的影響程度最后演示使用predict函數(shù)對新數(shù)據(jù)進(jìn)行預(yù)測。還涉及多重共線性問題的處理思路如逐步回歸、嶺回歸與套索回歸的適用場景。代碼結(jié)構(gòu)清晰讀者可直接替換數(shù)據(jù)運(yùn)行快速掌握多元線性回歸在科研與業(yè)務(wù)分析中的實(shí)際應(yīng)用。1. 多元線性回歸分析不只是跑個 fit 就完事拿到一份包含十幾個特征、一個連續(xù)目標(biāo)變量的數(shù)據(jù)集老板讓你解釋“哪些因素真正影響了結(jié)果影響有多大”——這時(shí)候第一個想到的、也最容易被用錯的方法就是多元線性回歸分析。它做兩件事一是預(yù)測給一組新輸入估算出因變量的值二是解釋每個自變量的回歸系數(shù)告訴你它在其他變量不變時(shí)每變化一個單位因變量平均變化多少。適合的場景很廣銷售額預(yù)測、廣告投放效果評估、定價(jià)模型、風(fēng)險(xiǎn)評估只要因變量是連續(xù)數(shù)值都可以先用多元線性回歸打底。但有個反直覺的結(jié)論你早晚會遇到R2 高不等于模型能用把十幾個高相關(guān)的變量一起塞進(jìn)模型系數(shù)會變得極不穩(wěn)定正負(fù)號都可能反掉。2. 建模前三步相關(guān)性初篩、共線性摸底與預(yù)處理2.1 用相關(guān)系數(shù)矩陣篩掉明顯重復(fù)的變量很多人拿到數(shù)據(jù)直接model.fit(X, y)結(jié)果系數(shù)一團(tuán)糟才開始排查。我一般先看相關(guān)系數(shù)矩陣這一步能省掉后面大半的返工。當(dāng)兩個自變量的 Pearson 相關(guān)系數(shù)超過 0.8回歸系數(shù)估計(jì)值的標(biāo)準(zhǔn)誤會快速膨脹等于讓模型在“搶功勞”到底是誰在影響因變量模型自己也分不清。import pandas as pd import numpy as np df pd.read_csv(your_data.csv) # 換成你自己的數(shù)據(jù)文件 features [temperature, traffic, price, promotion] X df[features] y df[sales] # 計(jì)算相關(guān)系數(shù)矩陣 corr X.corr() print(corr) # 找出相關(guān)系數(shù)絕對值大于 0.8 的變量對 pairs [] for i in range(len(features)): for j in range(i 1, len(features)): if abs(corr.iloc[i, j]) 0.8: pairs.append((features[i], features[j], round(corr.iloc[i, j], 3))) print(highly correlated pairs:, pairs)這段代碼的核心是X.corr()生成相關(guān)系數(shù)矩陣然后遍歷上三角找出超過閾值的變量對。0.8 是常用閾值業(yè)務(wù)上如果樣本量小或變量本身波動大我會放寬到 0.7。篩出來的變量對要人工判斷去留留下業(yè)務(wù)上更可解釋、不容易出錯的哪一個而不是機(jī)械地刪后者。比如“門店面積”和“店員人數(shù)”相關(guān)性高如果業(yè)務(wù)口徑上面積更穩(wěn)定、采集成本更低就保留面積。2.2 用 VIF 找出多重共線性計(jì)算與閾值選擇相關(guān)系數(shù)矩陣只能發(fā)現(xiàn)“兩兩之間”的共線性但三個變量互相之間雖然沒有一個超過 0.8組合起來卻可能高度共線。這時(shí)候需要 VIF方差膨脹因子。VIF 的計(jì)算邏輯是把第 j 個特征作為因變量用其余特征對它做一次線性回歸得到 R2然后 VIF 1 / (1 - R2)。VIF 等于 1 表示該特征和其余特征毫無線性關(guān)系超過 10 說明共線性已經(jīng)嚴(yán)重到系數(shù)不可信。from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant # VIF 計(jì)算必須加常數(shù)項(xiàng)否則結(jié)果沒有截距基準(zhǔn) X_with_const add_constant(X) vif_data pd.DataFrame({ feature: X_with_const.columns, VIF: [variance_inflation_factor(X_with_const.values, i) for i in range(X_with_const.shape[1])] }) print(vif_data)注意add_constant這一步不能省variance_inflation_factor的計(jì)算依賴截距項(xiàng)。輸出里“const”那行的 VIF 不用管只看實(shí)際特征。判斷標(biāo)準(zhǔn)VIF 5 安全510 需要留意 10 必須處理。處理方式有兩種先刪掉 VIF 最大的那個特征然后重新算一遍因?yàn)?VIF 是相對的刪掉一個其他都會跟著變或者對這個特征做中心化/標(biāo)準(zhǔn)化再檢查雖然標(biāo)準(zhǔn)化不改變 VIF 的理論值但在交互項(xiàng)場景里能緩解問題。2.3 連續(xù)變量標(biāo)準(zhǔn)化和類別變量啞變量處理預(yù)處理里最容易翻車的是類別變量。直接把“華南/華北/華東”編碼成 1、2、3等于強(qiáng)行給類別排序——模型會認(rèn)為華東是華南的三倍。正確做法是生成啞變量。連續(xù)變量的標(biāo)準(zhǔn)化則取決于你是否關(guān)心系數(shù)的可比性不標(biāo)準(zhǔn)化系數(shù)解釋是“其他變量不變時(shí)x 每變化 1 個單位y 平均變化多少”標(biāo)準(zhǔn)化之后解釋變成“x 每變化 1 個標(biāo)準(zhǔn)差y 平均變化多少”方便比較不同量綱特征的重要性。from sklearn.preprocessing import StandardScaler num_features [temperature, traffic, price] cat_features [region] # 類別變量轉(zhuǎn)啞變量drop_firstTrue 避免啞變量陷阱 df_dummy pd.get_dummies(df[cat_features], drop_firstTrue) # 連續(xù)變量標(biāo)準(zhǔn)化 scaler StandardScaler() X_num_scaled scaler.fit_transform(df[num_features]) X_num_scaled pd.DataFrame(X_num_scaled, columnsnum_features) # 拼接成最終建模特征 X_final pd.concat([X_num_scaled, df_dummy], axis1) print(X_final.head())drop_firstTrue是啞變量處理里最關(guān)鍵的參數(shù)。對 k 個類別只生成 k-1 個啞變量第一個類別作為參照組。如果不丟第一列模型里會存在一列等于其他所有啞變量之和的線性關(guān)系和截距項(xiàng)形成完全共線性這就是經(jīng)典的“啞變量陷阱”。我在實(shí)際項(xiàng)目里見過不下三次因?yàn)闆]丟第一列導(dǎo)致系數(shù)無法收斂的情況。標(biāo)準(zhǔn)化這邊f(xié)it_transform在訓(xùn)練階段做一次驗(yàn)證或上線時(shí)只做transform后面避坑章再展開說原因。3. 用 statsmodels 跑 OLS最小命令與回歸結(jié)果逐項(xiàng)拆解3.1 為什么建模用 statsmodels 而不是 sklearn做多元線性回歸分析我?guī)缀醪挥?sklearn 的LinearRegression做最終結(jié)論輸出原因很簡單sklearn 只給你系數(shù)和預(yù)測值不給你 p 值、置信區(qū)間、F 檢驗(yàn)這些統(tǒng)計(jì)推斷必需的指標(biāo)。如果建模的目的只是預(yù)測sklearn 沒問題但只要你需要回答“哪個變量顯著”“這個系數(shù)靠不靠譜”就必須用 statsmodels。statsmodels 是專門做統(tǒng)計(jì)推斷的庫OLS自帶一整套回歸診斷工具擬合一次就能輸出十幾個檢驗(yàn)指標(biāo)。另一個差別是常數(shù)項(xiàng)sklearn 的LinearRegression默認(rèn)自動擬合截距statsmodels 的OLS默認(rèn)不加截距忘記add_constant是新手最常見的報(bào)錯源頭。3.2 最小可復(fù)現(xiàn)的 OLS 擬合代碼承接上一章處理好特征之后擬合本身只需要三行。但三行和一整套可復(fù)現(xiàn)的建模流程之間差著對設(shè)計(jì)矩陣的理解。import statsmodels.api as sm # X_final 已包含標(biāo)準(zhǔn)化后的連續(xù)變量和啞變量 X_design sm.add_constant(X_final) # 擬合 OLS 模型 model sm.OLS(y, X_design).fit() # 輸出完整回歸報(bào)告 print(model.summary())這段代碼的邏輯sm.add_constant在特征矩陣最左邊插入一列全 1對應(yīng)截距項(xiàng) β?。sm.OLS(y, X_design)里第一個參數(shù)是因變量第二個是設(shè)計(jì)矩陣順序不能反。.fit()執(zhí)行最小二乘估計(jì)本質(zhì)是解正規(guī)方程 β (X?X)?1X?y。如果特征之間高度共線(X?X)?1 會不穩(wěn)定這也是前面查 VIF 的原因。數(shù)據(jù)量不大時(shí)OLS 的求解是精確解沒有迭代、沒有學(xué)習(xí)率——這也是它作為基線模型的最大優(yōu)勢你不需要調(diào)任何優(yōu)化器參數(shù)結(jié)果白盒可見。3.3 回歸結(jié)果表逐項(xiàng)拆解系數(shù)、p 值、R2、F 檢驗(yàn)model.summary()輸出的表很長我只看下面這幾欄按重要性排序輸出項(xiàng)含義判斷標(biāo)準(zhǔn)Pt每個系數(shù)對應(yīng)的 p 值coef回歸系數(shù)估計(jì)值正負(fù)號代表影響方向結(jié)合業(yè)務(wù)邏輯判斷是否合理R2 / Adj. R2自變量對因變量變異的解釋比例Adj. R2 用于比較不同變量數(shù)的模型F-statistic / Prob (F-statistic)整體模型顯著性Prob 0.05 說明至少有一個系數(shù)不為零Durbin-Watson殘差自相關(guān)檢驗(yàn)接近 2 正常遠(yuǎn)小于 2 說明存在正自相關(guān)AIC / BIC模型復(fù)雜度與擬合度的權(quán)衡用于模型間比較越小越好解讀時(shí)最容易犯的錯是只看 R2。R2 0.95 的模型可能因?yàn)楣簿€性導(dǎo)致每個系數(shù)的 p 值都大于 0.05整個模型沒有一塊磚是實(shí)的。另一個常見誤讀是“系數(shù)越大影響越大”——如果變量沒有標(biāo)準(zhǔn)化量綱差異會讓系數(shù)不可比所以我在上一章才做了標(biāo)準(zhǔn)化。還有一個細(xì)節(jié)model.summary()底部還有 Omnibus 和 Jarque-Bera 檢驗(yàn)這兩個是殘差正態(tài)性的快速診斷下一章里會展開。# 如果檢測到異方差可以用穩(wěn)健標(biāo)準(zhǔn)誤重新擬合 model_robust sm.OLS(y, X_design).fit(cov_typeHC1) print(model_robust.summary())cov_typeHC1是異方差穩(wěn)健標(biāo)準(zhǔn)誤的常用選項(xiàng)它的作用是修正系數(shù)標(biāo)準(zhǔn)誤的估計(jì)不改變系數(shù)值本身。實(shí)際經(jīng)驗(yàn)p 值在 0.04-0.06 邊緣的變量換 HC1 之后經(jīng)常越過 0.05 門檻而 p 值在 0.2 以上的變量換什么標(biāo)準(zhǔn)誤都不會顯著不用抱僥幸心理。處理異方差的順序我一般是先看殘差圖確認(rèn)形態(tài)再決定要不要用 HC1——直接無腦用穩(wěn)健標(biāo)準(zhǔn)誤雖然不會錯但會掩蓋數(shù)據(jù)本身的問題。4. 回歸診斷四個假設(shè)驗(yàn)證與修正路徑4.1 線性關(guān)系與殘差圖怎么看、怎么修OLS 的第一個假設(shè)是自變量與因變量之間存在線性關(guān)系。檢驗(yàn)方法很簡單畫殘差對擬合值的散點(diǎn)圖。殘差是每個樣本的真實(shí)值減預(yù)測值如果模型正確殘差應(yīng)該隨機(jī)散布在零線兩側(cè)沒有明顯形狀。import matplotlib.pyplot as plt fitted model.fittedvalues resid model.resid plt.scatter(fitted, resid, alpha0.5) plt.axhline(0, colorred, linestyle--) plt.xlabel(Fitted values) plt.ylabel(Residuals) plt.show()如果圖上殘差點(diǎn)呈現(xiàn)“喇叭形”——擬合值越大殘差波動越寬說明存在異方差這往往伴隨 Y 的分布偏態(tài)。一種常見修法是給因變量取對數(shù)把乘法關(guān)系變成加法關(guān)系另一種是對自變量加平方項(xiàng)或交互項(xiàng)解決“遺漏非線性項(xiàng)”導(dǎo)致的結(jié)構(gòu)性殘差。判斷殘差圖有沒有問題標(biāo)準(zhǔn)不是“點(diǎn)是否落在零線上”而是“散布寬度是否隨擬合值變化”。如果殘差在左側(cè)密集、右側(cè)散開即使所有點(diǎn)貼近零線模型也是病態(tài)的。4.2 殘差正態(tài)性Q-Q 圖與 Shapiro 檢驗(yàn)正態(tài)性假設(shè)影響的是系數(shù)置信區(qū)間和 p 值的準(zhǔn)確性。樣本量足夠大時(shí)比如 n 200中心極限定理讓系數(shù)估計(jì)量近似正態(tài)這時(shí)對殘差正態(tài)性的要求可以適當(dāng)放寬。但小樣本下殘差嚴(yán)重偏態(tài)會直接影響 p 值的可信度需要專門檢驗(yàn)。import scipy.stats as stats # Q-Q 圖點(diǎn)越貼近對角線越符合正態(tài)分布 stats.probplot(resid, distnorm, plotplt) plt.show() # Shapiro-Wilk 正態(tài)性檢驗(yàn) shapiro_stat, shapiro_p stats.shapiro(resid) print(Shapiro-Wilk p-value:, shapiro_p)Q-Q 圖我習(xí)慣叫“對線圖”樣本分位數(shù)對理論分位數(shù)點(diǎn)如果排成一條直線就符合正態(tài)。Shapiro 檢驗(yàn)的 p 值大于 0.05 時(shí)不能拒絕正態(tài)性假設(shè)結(jié)論是“殘差近似正態(tài)”。但你實(shí)際用的時(shí)候會發(fā)現(xiàn)一個尷尬樣本量一大Shapiro 對微小的偏離也極其敏感p 值永遠(yuǎn)小于 0.05。這時(shí)候以 Q-Q 圖為主只要點(diǎn)沒有系統(tǒng)性彎曲比如 S 形或兩端翹起就當(dāng)成可接受。4.3 異方差檢驗(yàn)Breusch-Pagan 與穩(wěn)健標(biāo)準(zhǔn)誤異方差的危害是低估標(biāo)準(zhǔn)誤導(dǎo)致 t 統(tǒng)計(jì)量虛高、p 值偏小把不顯著的變量判成顯著。這和上面相關(guān)系數(shù)膨脹正好反著來——一個是系數(shù)亂跳一個是顯著性假象。用 Breusch-Pagan 檢驗(yàn)做定量判斷from statsmodels.stats.diagnostic import het_breuschpagan bp_test het_breuschpagan(resid, X_design) labels [LM stat, LM p-value, F stat, F p-value] print(dict(zip(labels, bp_test)))het_breuschpagan的第二個參數(shù)要傳完整的設(shè)計(jì)矩陣含截距不是原始特征。輸出里看 LM p-value小于 0.05 判定存在異方差。處理路徑兩條一是對 y 做 Box-Cox 變換或用 log(y)從數(shù)據(jù)形態(tài)上消除異方差二是保留原模型用cov_typeHC1重新擬合得到穩(wěn)健標(biāo)準(zhǔn)誤。我的一般做法是先試 log(y)如果業(yè)務(wù)解釋能接受“每增加 10% 的曝光轉(zhuǎn)化率平均增加 0.3 個百分點(diǎn)”就用變換后的模型如果 log 后業(yè)務(wù)解釋太繞回到原模型配 HC1。4.4 自相關(guān)檢驗(yàn)Durbin-Watson 與時(shí)間序列數(shù)據(jù)注意多元線性回歸分析里自相關(guān)檢驗(yàn)經(jīng)常被忽視。原因是經(jīng)典 OLS 假設(shè)樣本獨(dú)立但你的數(shù)據(jù)如果帶時(shí)間屬性——比如按周統(tǒng)計(jì)的銷售數(shù)據(jù)、按月統(tǒng)計(jì)的用戶增長——相鄰兩周的殘差天然相關(guān)。model.summary()底部已經(jīng)給了 Durbin-Watson 值不需要額外代碼。判斷標(biāo)準(zhǔn)DW ≈ 2 無自相關(guān)顯著小于 2比如 1.2存在正自相關(guān)系數(shù)標(biāo)準(zhǔn)誤會被低估顯著大于 2 存在負(fù)自相關(guān)少見但也要警惕。# 自相關(guān)存在時(shí)改用 Newey-West 標(biāo)準(zhǔn)誤 model_nw sm.OLS(y, X_design).fit(cov_typeHAC, cov_kwds{maxlags: 1}) print(model_nw.summary())cov_typeHAC配合maxlags1是處理一階自相關(guān)的常見做法Newey-West 估計(jì)量同時(shí)修正異方差和自相關(guān)。但這里有個坑加了 HAC 標(biāo)準(zhǔn)誤只是修正了推斷如果你的目標(biāo)是用模型做預(yù)測自相關(guān)意味著預(yù)測誤差會連續(xù)幾天同方向偏移模型給出的預(yù)測區(qū)間會嚴(yán)重失真。更徹底的做法是加入滯后因變量作為特征把時(shí)間依賴顯式建模。我自己的經(jīng)驗(yàn)只要數(shù)據(jù)帶時(shí)間標(biāo)簽先畫殘差對時(shí)間的散點(diǎn)圖比直接看 DW 值更直觀——如果殘差隨時(shí)間呈現(xiàn)“波浪形”一定有問題。5. 多元線性回歸最常踩的 5 個坑現(xiàn)象、原因、對策5.1 R2 高得驚人但所有系數(shù)都不顯著現(xiàn)象模型摘要里 R2 0.95F 檢驗(yàn)顯著但每個自變量的 P 值都大于 0.1沒有一個“能打”的。原因多重共線性。多個變量高度相關(guān)時(shí)模型整體能解釋因變量的大部分方差但無法把貢獻(xiàn)拆到具體變量上系數(shù)估計(jì)值的方差被同步放大t 統(tǒng)計(jì)量失去說服力。解決回到第 2 章做 VIF 排查刪除 VIF 10 的變量組合中的重復(fù)項(xiàng)。如果 VIF 都正常再檢查是不是樣本量太小——變量數(shù)和樣本量的經(jīng)驗(yàn)比例至少 1:10少于這個數(shù)字顯著性檢驗(yàn)的把握度不夠。5.2 把類別變量直接編碼成 1、2、3現(xiàn)象模型擬合沒有報(bào)錯結(jié)果里某個“地區(qū)”變量的系數(shù)是負(fù)數(shù)業(yè)務(wù)上完全無法解釋——“難道華南地區(qū)比華北差這么多”原因你給了模型錯誤的先驗(yàn)知識告訴它類別之間有等差關(guān)系。地區(qū)編碼成 1/2/3 后模型只能學(xué)到“每升一級因變量線性變化一個固定量”而真實(shí)關(guān)系大概率不是這樣。解決用pd.get_dummies(drop_firstTrue)生成啞變量。這個坑幾乎每個做過回歸分析的人都踩過我最早做房價(jià)模型時(shí)也干過后來在特征工程階段就把類別變量排查作為固定檢查項(xiàng)。5.3 標(biāo)準(zhǔn)化時(shí)對整個數(shù)據(jù)集 fit造成數(shù)據(jù)泄露現(xiàn)象訓(xùn)練集上模型 R2 0.85驗(yàn)證集上一塌糊涂RMSE 翻了三倍整個團(tuán)隊(duì)?wèi)岩蓴?shù)據(jù)對不上。原因你在建模前置處理里用了scaler.fit_transform(df)其中fit用到了全量數(shù)據(jù)的均值和標(biāo)準(zhǔn)差驗(yàn)證集的信息已經(jīng)滲入訓(xùn)練階段。解決訓(xùn)練和驗(yàn)證必須嚴(yán)格分離標(biāo)準(zhǔn)化的均值和標(biāo)準(zhǔn)差只在訓(xùn)練集上計(jì)算驗(yàn)證集和上線環(huán)境用同一個 scaler 做純轉(zhuǎn)換。from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val train_test_split( X_final, y, test_size0.2, random_state42 ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) # 只 fit 訓(xùn)練集 X_val_scaled scaler.transform(X_val) # 只 transform這塊“后悔藥”唯一的作用是讓你記住凡是涉及全局統(tǒng)計(jì)量的預(yù)處理標(biāo)準(zhǔn)化、PCA、缺失值均值填充都必須在訓(xùn)練集內(nèi)完成 fit然后應(yīng)用到所有后續(xù)數(shù)據(jù)。5.4 刪除離群值后關(guān)鍵系數(shù)符號反轉(zhuǎn)現(xiàn)象建模時(shí)發(fā)現(xiàn)有兩個樣本的殘差特別大刪掉之后模型的 R2 明顯提升但某個關(guān)鍵變量的系數(shù)從正數(shù)變成了負(fù)數(shù)你開始懷疑人生。原因離群值同時(shí)是杠桿點(diǎn)——它們對回歸線的牽制遠(yuǎn)大于普通點(diǎn)。刪除離群值這個動作本身沒有錯但要注意你是在“調(diào)整數(shù)據(jù)以得到想要的結(jié)論”還是在“修正數(shù)據(jù)質(zhì)量問題”。解決先確認(rèn)離群值的來源是錄入錯誤、儀器故障還是真實(shí)業(yè)務(wù)極端情況。錄入錯誤刪除沒毛病真實(shí)極端值建議保留或者用 Huber 回歸這類穩(wěn)健方法做交叉驗(yàn)證看系數(shù)是否真的穩(wěn)定。我現(xiàn)在的習(xí)慣是離群值占比小于 1% 且來源明確是采集錯誤才刪除其他情況一律穩(wěn)健方法處理。5.5 把“相關(guān)”當(dāng)“因果”模型結(jié)論被業(yè)務(wù)挑戰(zhàn)現(xiàn)象模型算出“推廣費(fèi)用每增加 1 萬元銷售額增加 8 萬元”市場部拿著結(jié)果去申請預(yù)算實(shí)際投放后效果遠(yuǎn)不如預(yù)期。原因回歸分析只證明了相關(guān)關(guān)系不證明因果關(guān)系。推廣費(fèi)用高的月份往往也是旺季、競品活動少、產(chǎn)品新版本上線——這些遺漏變量同時(shí)影響推廣費(fèi)用和銷售額造成了虛假的相關(guān)。解決在輸出結(jié)論前自查三個問題第一有沒有同時(shí)影響自變量和因變量的第三個變量第二自變量和因變量之間有沒有反向因果銷售額高反而追加推廣預(yù)算第三樣本范圍是否有選擇性偏差如果三個問題里有一個回答“可能有”結(jié)論就必須加限定詞“在控制其他變量不變的前提下”而不是“如果多投 X 就能多賺 Y”。多元線性回歸分析的價(jià)值在于找到值得進(jìn)一步驗(yàn)證的相關(guān)性而因果推斷需要實(shí)驗(yàn)設(shè)計(jì)或工具變量法那是另一個方向的工程。6. 落地技巧交叉驗(yàn)證、穩(wěn)健標(biāo)準(zhǔn)誤與變量篩選的實(shí)戰(zhàn)配合模型診斷做完、坑也排完最后一步是把模型真正落地成決策依據(jù)。我做多元線性回歸分析收尾時(shí)一定會加三個動作交叉驗(yàn)證看預(yù)測穩(wěn)定性、穩(wěn)健標(biāo)準(zhǔn)誤確認(rèn)顯著性結(jié)論不依賴假設(shè)、AIC/BIC 對比確認(rèn)變量組合沒有冗余。先說交叉驗(yàn)證。統(tǒng)計(jì)推斷的 p 值和 R2 是樣本內(nèi)的結(jié)論業(yè)務(wù)方真正關(guān)心的是“下個月用這個模型準(zhǔn)不準(zhǔn)”。用 K 折交叉驗(yàn)證計(jì)算 RMSE能直接回答這個問題from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_val_score lr LinearRegression() # 5 折交叉驗(yàn)證用負(fù)均方誤差打分 scores cross_val_score(lr, X_final, y, cv5, scoringneg_mean_squared_error) rmse_scores (-scores) ** 0.5 print(每折 RMSE:, rmse_scores) print(平均 RMSE:, rmse_scores.mean())如果交叉驗(yàn)證的平均 RMSE 比訓(xùn)練集 RMSE 高出 30% 以上說明模型過擬合變量刪少了或者交互項(xiàng)加多了。反過來如果每折之間的 RMSE 差距巨大說明數(shù)據(jù)分布不穩(wěn)定做預(yù)測要格外謹(jǐn)慎。關(guān)于變量篩選我的習(xí)慣是不用盲目逐步回歸——逐刪變量再重新擬合會讓 p 值失效你是在同一份數(shù)據(jù)上反復(fù)試最后選出的模型對“這一次的數(shù)據(jù)”是好的但換一批數(shù)據(jù)就原形畢露。更穩(wěn)妥的做法是設(shè)定幾個有業(yè)務(wù)含義的候選變量組合用 AIC/BIC 做對比import itertools best_aic float(inf) best_combo None for k in range(1, len(features) 1): for combo in itertools.combinations(features, k): X_sub sm.add_constant(X_final[list(combo)]) m sm.OLS(y, X_sub).fit() if m.aic best_aic: best_aic m.aic best_combo combo print(AIC 最低的變量組合:, best_combo, AIC:, round(best_aic, 2))這個窮舉只適合特征數(shù)少于 10 的場景特征多了計(jì)算量爆炸。AIC 的含義是“在擬合優(yōu)度和模型復(fù)雜度之間取平衡”它不關(guān)心 p 值只關(guān)心這個變量組合在新數(shù)據(jù)上的期望表現(xiàn)。最后一個習(xí)慣和教訓(xùn)我會把模型摘要保存成 HTML 或 CSV 存檔連同變量說明、處理步驟一起放進(jìn)項(xiàng)目目錄里防止三個月后回頭重構(gòu)模型時(shí)忘了當(dāng)時(shí)為什么刪掉某個變量。多元線性回歸分析最大的優(yōu)勢是透明、可解釋但這份優(yōu)勢如果只留在交互式 notebook 里就等于沒有。數(shù)據(jù)科學(xué)里最貴的不是建模是讓別人能復(fù)現(xiàn)你的建模。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取