sklearn LinearRegression + statsmodels OLS 語法哪些正確?
考慮資料集已經補填遺漏值,參考下圖執行結果,下列何者正確? from sklearn.linear_model import LinearRegression import statsmodels.api as sm X = df[['youtube', 'facebook', 'newspaper']] y = df['sales'] reg = 空格1 print(reg.coef_) X2 = sm.add_constant(X) model_sm = 空格2 print(model_sm.summary()) (OLS 結果:R-squared 0.898、Adj. R-squared 0.896、F-statistic 573.0、No. Observations 200、Df Residuals 196、Df Model 3;coef: const 3.5561、youtube 0.0455、facebook 0.1891、newspaper -0.0006;P>|t|: const 0.000、youtube 0.000、facebook 0.000、newspaper 0.914) A:空格 1 完整語法 reg = LinearRegression().fit(y, X) B:空格 1 完整語法 reg = LinearRegression().fit(X, y) C:print(reg.coef_) 結果為包括截距項等 4 個係數值 D:空格 2 完整語法 sm.OLS(X2, y).fit() E:model_sm 迴歸模型的所有迴歸係數在 α=0.05 之下具有顯著的解釋力 F:截距項係數值為 3.5561
題目給出 sklearn LinearRegression 和 statsmodels OLS 的迴歸分析程式碼框架,以及實際執行後的 OLS 摘要結果。六個敘述(A 到 F)各描述程式碼語法或統計結果是否正確,題目把它們打包成 4 個組合選項,要你找出哪些敘述是正確的。
問你:針對 LinearRegression.fit() 的參數順序、coef_ 的係數個數、sm.OLS 的參數順序、係數顯著性以及截距項數值,哪些描述是正確的?
一句話總結
正確答案是總選項 B(敘述 B 和 F):B(fit 參數順序 X 在前 y 在後)正確,F(截距項 const = 3.5561)正確。C 錯因為 sklearn 的 coef_ 不含截距(只有 3 個係數),E 錯因為 newspaper 的 p-value=0.914 不顯著。
先感受問題:兩個函式庫的語法長得不一樣
行銷資料分析師小嘉要用廣告費用(youtube、facebook、newspaper)預測銷售量(sales),同時用 sklearn 和 statsmodels 兩個函式庫建立線性迴歸模型:
statsmodels 的特色:OLS(y, X2),y 在前 X 在後,統計結果詳細(含 p-value、R²、信賴區間)
兩者參數順序相反,這是最常見的錯誤來源。
六個敘述分別考:fit() 的 X/y 順序(A vs B)、coef_ 的係數個數(C)、sm.OLS() 的 y/X 順序(D)、係數顯著性(E)、截距值(F)。
逐一驗證六個敘述是否正確
- 敘述 A:fit(y, X) → 錯。sklearn 的 LinearRegression().fit() 參數順序是 fit(X, y),X 是特徵矩陣在前,y 是目標向量在後。fit(y, X) 參數反了,會把銷售量當特徵、把廣告費用當預測目標,結果完全錯誤。
- 敘述 B:fit(X, y) → 正確。sklearn 所有的 estimator 都遵循 fit(X, y) 的慣例,X 是 feature matrix(形狀 n×p),y 是 target vector(形狀 n)。reg = LinearRegression().fit(X, y) 是正確語法。
- 敘述 C:coef_ 有 4 個係數(含截距)→ 錯。sklearn 的 reg.coef_ 只包含 3 個係數(youtube、facebook、newspaper 各一個),截距項存放在 reg.intercept_ 而非 coef_ 裡。coef_ 的形狀是 (3,) 或 (1,3),不是 4 個。
- 敘述 D:sm.OLS(X2, y) → 錯。statsmodels 的 OLS 參數順序是 OLS(y, X),y 在前,X 在後,與 sklearn 相反。OLS(X2, y) 把 X 和 y 放反了,統計結果會完全錯誤(用廣告費用預測廣告費用)。
- 敘述 E:所有係數在 α=0.05 下顯著 → 錯。OLS 摘要顯示 newspaper 的 P>|t| = 0.914,遠大於 0.05(顯著水準),代表 newspaper 係數不顯著(無法拒絕係數為 0 的虛無假設)。只有 const、youtube、facebook 的 p-value < 0.001 是顯著的。
- 敘述 F:截距項係數 = 3.5561 → 正確。OLS 摘要的 const 那行,coef = 3.5561,這就是截距項(常數項)的估計值。sm.add_constant(X) 加入了常數欄,對應 OLS 輸出的 const = 3.5561。
只有 B 和 F 正確,選總選項 B
小嘉確認:
敘述 B:fit(X, y) → sklearn 的正確語法 ✓
敘述 C:coef_ 含截距共 4 個 → sklearn coef_ 只有 3 個,截距在 intercept_ ✗
敘述 D:sm.OLS(X2, y) → statsmodels 參數反了(應是 OLS(y, X2))✗
敘述 E:所有係數顯著 → newspaper p=0.914 不顯著 ✗
敘述 F:截距 = 3.5561 → OLS 摘要 const coef = 3.5561 ✓
只有 B 和 F 正確。四個總選項中,「B、F」對應總選項 B。這就是總選項 B 講的:B、F。
技術版:sklearn vs statsmodels 線性迴歸 API 精讀
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
兩家建築公司蓋同一棟樓:sklearn 說「先給我設計圖(X),再告訴我你要幾層樓(y)」;statsmodels 說「先告訴我你要幾層樓(y),再給我設計圖(X)」。兩家公司蓋出來的樓一樣高,但遞資料的順序完全相反。另外 sklearn 把截距藏在另一個抽屜(intercept_),主要抽屜(coef_)只放牆和柱子的比例係數(3 個)。
| 操作 | sklearn 寫法 | statsmodels 寫法 |
|---|---|---|
| 建立並訓練模型 | LinearRegression().fit(X, y) | sm.OLS(y, X2).fit() |
| 特徵係數(β₁β₂β₃) | reg.coef_(3 個,不含截距) | model.params(含截距,4 個) |
| 截距(β₀) | reg.intercept_(單獨屬性) | model.params['const'](在 params 裡) |
| 加截距欄 | fit_intercept=True(預設) | sm.add_constant(X) 手動加 |
| p-value(係數顯著性) | 不提供(sklearn 重點是預測) | model.summary() 中的 P>|t| |
- coef_(sklearn)
- 特徵係數陣列,形狀 (n_features,),不含截距項。3 個特徵 → coef_ 有 3 個值。
- intercept_(sklearn)
- 截距項(β₀),單獨儲存,不在 coef_ 裡。
- sm.add_constant(X)
- 在 X 的第一欄加入全為 1 的常數欄,讓 statsmodels 能估計截距項(常數項 const)。
- sm.OLS(y, X)
- statsmodels 的最小二乘法,y 在前 X 在後(與 sklearn 相反)。
- P>|t|(p-value)
- t 檢定的 p-value,若 < 0.05 代表該係數在 α=0.05 下顯著(可以拒絕「係數為 0」的虛無假設)。
| 意義 | 公式 |
|---|---|
| 線性迴歸模型 | ŷ = β₀ + β₁·youtube + β₂·facebook + β₃·newspaper |
| 本題 OLS 估計結果 | ŷ = 3.5561 + 0.0455·youtube + 0.1891·facebook + (-0.0006)·newspaper |
| R² 解讀 | R² = 0.898:約 89.8% 的 sales 變異可由三個廣告管道解釋 |
| p-value 判斷(α=0.05) | p < 0.05 → 顯著;p ≥ 0.05 → 不顯著(newspaper p=0.914) |
- sklearn 的 fit(X, y) 和 statsmodels 的 OLS(y, X) 為什麼順序相反?
- sklearn 的 coef_ 和 intercept_ 各存什麼?合起來幾個係數?
- sm.add_constant 是做什麼的?如果不加會怎樣?
- newspaper 的 p-value = 0.914,在 α=0.05 下代表什麼?應該保留還是移除這個特徵?
- R² = 0.898 是什麼意思?是越高越好嗎?過高可能代表什麼問題?
為什麼其他總選項是錯的
字面在說什麼:fit(X,y) 正確、coef_ 有 4 個係數、截距 = 3.5561 這三個都對。
為什麼不對:B 和 F 確實正確,但 C 不對。sklearn 的 reg.coef_ 只包含特徵係數(3 個),截距項(intercept)存放在 reg.intercept_ 這個獨立屬性中,不在 coef_ 裡。coef_ 的形狀是 (3,),print(reg.coef_) 只輸出 3 個值。
誰會選錯:以為 sklearn 和 statsmodels 一樣,把截距放在係數陣列裡的人。或者記得 statsmodels 的 params 包含 4 個值(const + 3 個特徵),誤以為 sklearn 的 coef_ 也是這樣。
字面在說什麼:fit(y,X)、coef_ 4 個、sm.OLS(X2,y)、截距 3.5561 這四個都對。
為什麼不對:A(參數反了)、C(coef_ 只有 3 個)、D(OLS 參數反了)全都錯,只有 F 是對的。這個選項把三個錯誤的敘述都選進去了。
誰會選錯:搞混 sklearn 和 statsmodels 參數順序的人:誤以為 sklearn fit(y,X)(與 statsmodels 一樣 y 在前)、誤以為 statsmodels OLS(X,y)(與 sklearn 一樣 X 在前)。
字面在說什麼:fit(X,y) 正確、所有係數都顯著,這兩個都對。
為什麼不對:B 正確,但 E 不正確。OLS 摘要中 newspaper 的 P>|t| = 0.914,超過 α=0.05 的顯著水準,代表 newspaper 的迴歸係數不顯著(不能排除它等於 0 的可能性)。並非所有三個預測變數都顯著,選 E 是讀錯了 p-value 欄位的結果。而且選 D 漏掉了 F(截距 3.5561 正確),答案不完整。
誰會選錯:只看了 const/youtube/facebook 的 p-value(都是 0.000,非常顯著),忽略了 newspaper 的 p-value = 0.914,誤以為全部顯著。
同個考點下次怎麼變形
直覺:newspaper 不顯著(p=0.914),應該把它從模型中移除嗎?
答案:從統計顯著性的角度,應該考慮移除,因為 newspaper 不能提供對銷售的顯著解釋力(係數估計接近 0,且不確定)。但移除前要考慮:(1) 業務邏輯(實務上可能仍需追蹤 newspaper 廣告效果);(2) 模型比較(用 AIC/BIC 比較含 newspaper 和不含 newspaper 的模型);(3) 多重共線性(newspaper 可能和其他變數有相關性,移除後係數可能改變)。單純看 p-value 就刪是過於簡化的做法。
直覺:如果把 fit(y, X) 這個錯誤語法執行了,會發生什麼事?
答案:sklearn 不會立刻報錯,因為 y(200 個 sales 值)和 X(200×3 矩陣)在形狀上 fit() 能接受。但模型會用 1 個 "特徵"(sales)來預測 3 個 "目標"(youtube、facebook、newspaper),這完全顛倒了模型目的。coef_ 的形狀會變成 (3, 1) 而非 (3,),後續的 predict() 也會出錯。這種靜默錯誤(silent error)非常危險,因為不報錯但結果完全無意義。
直覺:R² = 0.898 和 Adj. R² = 0.896 的差別是什麼?
答案:Adjusted R²(校正 R²)在 R² 的基礎上懲罰「不顯著的特徵數量」。每加入一個特徵,R² 必然不減(因為更多自由度),但 Adj. R² 只在新特徵真的有貢獻時才增加。本題三個特徵有一個(newspaper)不顯著,所以 Adj. R² 略低於 R²(0.896 vs 0.898)。比較模型時,Adj. R² 比 R² 更可靠,不會因為「加入無意義特徵」就顯得模型更好。
直覺:sklearn 和 statsmodels 各自的使用場景是什麼?什麼時候用哪個?
答案:sklearn 優點:一致的 fit/predict/transform API,與整個 sklearn 生態(pipeline、cross-validation、GridSearchCV)無縫整合,適合機器學習工作流程中的預測任務。statsmodels 優點:完整的統計推論輸出(p-value、信賴區間、殘差檢定、AIC/BIC),適合統計分析和需要解釋係數意義的場景(例如論文、業務決策)。做預測用 sklearn,做推論(解釋)用 statsmodels。
直覺:如何在 sklearn 取出截距項和特徵係數並解讀?
答案:reg.intercept_ 是截距(β₀),reg.coef_ 是特徵係數陣列(β₁、β₂、β₃)。本題:reg.intercept_ ≈ 3.5561(和 statsmodels 的 const 一致);reg.coef_ ≈ [0.0455, 0.1891, -0.0006](對應 youtube、facebook、newspaper)。解讀 facebook 係數 0.1891:每增加 1000 元 facebook 廣告費,預期銷售額增加 0.1891 百萬元(約 18 萬 9 千元)。youtube 的 0.0455 同理,facebook 的廣告效益大約是 youtube 的 4 倍。
想再往下看,這 5 個
- 線性迴歸(Linear Regression)本題核心考點,包含 sklearn 預測導向 API 和 statsmodels 統計推論 API 的差異,以及 coef_、p-value、R² 的解讀。
- 判定係數(R-squared)OLS 摘要的 R² = 0.898,衡量模型解釋力,但需搭配 Adj. R² 和 p-value 才能做完整的模型評估。
- 假設檢定(Hypothesis Testing)係數的 p-value 是 t 檢定的結果,newspaper p=0.914 代表無法拒絕「係數為 0」的虛無假設。
- 特徵選擇(Feature Selection)newspaper 不顯著是移除特徵的統計依據之一,特徵選擇方法如 backward elimination 就是逐步移除 p-value 最高的特徵。
- 相關係數(Correlation)建立迴歸模型前,通常先看特徵與目標的相關係數,youtube/facebook 和 sales 的相關性高,是它們係數顯著的基礎。