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