返回文章列表

迴歸模型進階診斷與非線性處理技術

本文探討迴歸模型的進階診斷技術,包含異常值與影響力分析、異質變異數、非正態分佈誤差及相關誤差等,並以美國西雅圖King County房價資料為例,使用 R 與 Python 程式碼示範如何識別與處理這些問題。此外,文章也介紹了處理非線性關係的技巧,如多項式迴歸和樣條迴歸,並提供程式碼範例說明如何應用這些方法。

機器學習 資料分析

在資料科學中,建立準確的迴歸模型至關重要,但模型的可靠性不僅取決於預測準確度,也需要透過診斷技術來驗證模型假設的穩健性。常見的診斷導向包含異常值偵測、影響力分析,以及檢查殘差的異質變異數、非正態分佈和相關性。這些診斷步驟有助於發現模型潛在問題,例如遺漏重要變數或非線性關係。針對非線性資料,多項式迴歸和樣條迴歸是兩種有效的處理方法,可以更精確地捕捉資料的非線性模式。理解並應用這些技術,能有效提升迴歸模型的解釋力和預測能力,在實際應用中發揮更大的價值。

互動作用與主效應

統計學家喜歡區分主效應(即獨立變數)和主效應之間的互動作用。主效應通常是指迴歸方程中的預測變數。僅使用主效應的模型的一個隱含假設是,預測變數與回應變數之間的關係獨立於其他預測變數。但這種情況往往並非如此。

例如,在「混雜變數」一節中對King County Housing Data進行模型擬合時,包含了多個主效應變數,包括ZipCode。在房地產中,位置是最重要的因素,因此可以自然地假設房屋大小與銷售價格之間的關係取決於位置。在低租金地區建造的大房子不會保留與在昂貴地區建造的大房子相同的價值。在R中,可以使用*運算子來包含變數之間的互動作用。對於King County資料,以下程式碼擬合了SqFtTotLivingZipGroup之間的互動作用:

lm(formula = AdjSalePrice ~ SqFtTotLiving * ZipGroup + SqFtLot +
Bathrooms + Bedrooms + BldgGrade + PropertyType, data = house,
na.action = na.omit)

內容解密:

  • lm() 函式是用於線性迴歸的 R 語言函式。
  • formula 指定了迴歸模型的公式,包括互動作用項 SqFtTotLiving * ZipGroup
  • data = house 指定了資料來源。
  • na.action = na.omit 表示省略含有缺失值的觀測。

在Python中,我們需要使用statsmodels套件來訓練具有互動作用的線性迴歸模型。該套件的設計與R類別似,允許使用公式介面定義模型:

model = smf.ols(formula='AdjSalePrice ~ SqFtTotLiving*ZipGroup + SqFtLot + ' +
'Bathrooms + Bedrooms + BldgGrade + PropertyType', data=house)
results = model.fit()
results.summary()

內容解密:

  • smf.ols() 函式是用於普通最小二乘迴歸的 Python statsmodels 函式。
  • formula 指定了迴歸模型的公式,與 R 語法相似。
  • data=house 指定了資料來源。
  • results.summary() 用於輸出迴歸結果的摘要。

地點和房屋大小似乎具有強烈的互動作用。對於最低ZipGroup的房屋,斜率與主效應SqFtTotLiving的斜率相同,即每平方英尺118美元(這是因為R使用參考編碼作為因子變數;參見「迴歸中的因子變數」一節)。對於最高ZipGroup的房屋,斜率是主效應加上SqFtTotLiving:ZipGroup5,即118美元 + 227美元 = 345美元每平方英尺。換句話說,在最昂貴的郵政編碼組中增加一平方英尺會使預測銷售價格提高近三倍,與平均增加一平方英尺所帶來的提升相比。

具有互動作用項的模型選擇

在涉及多個變數的問題中,很難決定哪些互動作用項應該包含在模型中。通常採用以下幾種方法:

  • 在某些問題中,先前的知識和直覺可以指導選擇哪些互動作用項納入模型。
  • 逐步選擇(參見「模型選擇和逐步迴歸」一節)可用於篩選各種模型。
  • 正則化迴歸可以自動擬合大量可能的互動作用項。
  • 也許最常見的方法是使用樹模型,以及它們的後代隨機森林和梯度提升樹。這類別模型自動搜尋最佳互動作用項;參見「樹模型」一節。

主要觀念

  • 由於預測變數之間的相關性,在解釋多元線性迴歸中的係數時必須小心。
  • 多重共線性可能導致擬合迴歸方程時的數值不穩定性。
  • 混雜變數是被省略的重要預測變數,可能導致迴歸方程具有虛假關係。
  • 當變數與回應變數之間的關係相互依賴時,需要兩個變數之間的互動作用項。

迴歸診斷

在解釋性建模(即研究背景下),除了前面提到的指標(參見「評估模型」一節)之外,還會採取多種步驟來評估模型與資料的擬合程度;大多數步驟根據對殘差的分析。這些步驟並不直接涉及預測準確性,但在預測環境中可以提供有用的見解。

迴歸診斷的關鍵術語

標準化殘差:殘差除以殘差的標準誤差。 異常值:遠離其他資料(或預測結果)的記錄(或結果值)。 影響值:其存在或不存在對迴歸方程產生重大影響的值或記錄。 槓桿率:單個記錄對迴歸方程的影響程度。 同義詞:hat-value 非正態殘差:非正態分佈的殘差可能會使迴歸的一些技術要求無效,但在資料科學中通常不是問題。 異方差性:當某些結果範圍內的殘差具有較高的方差時(可能表明方程中缺少預測變數)。 部分殘差圖:用於闡明結果變數與單個預測變數之間關係的診斷圖。 同義詞:新增變數圖

迴歸診斷流程圖

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 迴歸模型進階診斷與非線性處理技術

package "迴歸診斷系統" {
    package "異常值分析" {
        component [標準化殘差] as sresid
        component [槓桿值 Hat] as hat
        component [Cook's 距離] as cook
    }

    package "殘差診斷" {
        component [異質變異數] as hetero
        component [非正態分佈] as nonnormal
        component [相關誤差] as corr
    }

    package "非線性處理" {
        component [偏殘差圖] as partial
        component [多項式迴歸] as poly
        component [樣條迴歸] as spline
    }
}

sresid --> hat : 影響力評估
hat --> cook : 綜合指標
cook --> hetero : 殘差檢查
hetero --> nonnormal : 分佈檢驗
nonnormal --> corr : 自相關
corr --> partial : 關係視覺化
partial --> poly : 曲線擬合
poly --> spline : 分段平滑

note right of cook
  影響力指標:
  - rstandard()
  - hatvalues()
  - cooks.distance()
end note

note right of partial
  非線性方法:
  - PolynomialFeatures
  - 結點 Knots
  - loess 平滑
end note

@enduml

此圖示闡述了迴歸診斷的基本步驟,從檢查殘差開始,到檢查部分殘差圖結束。

迴歸診斷:異常值與影響力分析

在迴歸分析中,異常值(Outliers)和影響力資料點(Influential Observations)是兩個需要特別關注的概念。異常值是指實際值與預測值之間存在顯著差異的資料點,而影響力資料點則是指其存在與否會對迴歸方程產生重大影響的資料點。

異常值檢測

異常值可能會對迴歸模型的估計產生不利影響。檢測異常值的一種常見方法是檢查標準化殘差(Standardized Residuals),即殘差除以殘差的標準誤差。

範例:King County 房價資料

以下範例使用 R 和 Python 對 King County 的房價資料進行迴歸分析,並檢測異常值:

R 程式碼
house_98105 <- house[house$ZipCode == 98105,]
lm_98105 <- lm(AdjSalePrice ~ SqFtTotLiving + SqFtLot + Bathrooms + Bedrooms + BldgGrade, data=house_98105)
sresid <- rstandard(lm_98105)
idx <- order(sresid)
sresid[idx[1]]
Python 程式碼
house_98105 = house.loc[house['ZipCode'] == 98105, ]
predictors = ['SqFtTotLiving', 'SqFtLot', 'Bathrooms', 'Bedrooms', 'BldgGrade']
outcome = 'AdjSalePrice'
house_outlier = sm.OLS(house_98105[outcome], house_98105[predictors].assign(const=1))
result_98105 = house_outlier.fit()
influence = OLSInfluence(result_98105)
sresiduals = influence.resid_studentized_internal
sresiduals.idxmin(), sresiduals.min()

結果分析

透過上述程式碼,我們可以找出標準化殘差最小的資料點。在這個範例中,該資料點對應的實際售價遠低於預測值,進一步檢查發現該交易涉及部分產權,因此屬於異常值。

影響力分析

影響力資料點是指其存在會對迴歸方程產生重大影響的資料點。影響力可以透過槓桿值(Hat-Value)和函式庫克距離(Cook’s Distance)來衡量。

槓桿值與函式庫克距離

  • 槓桿值:衡量資料點對迴歸方程的影響程度,高槓桿值表示該資料點對迴歸方程有較大的影響。
  • 函式庫克距離:結合了槓桿值和殘差大小,衡量資料點對迴歸係數的影響程度。

範例:King County 房價資料的影響力分析

R 程式碼
std_resid <- rstandard(lm_98105)
cooks_D <- cooks.distance(lm_98105)
hat_values <- hatvalues(lm_98105)
plot(subset(hat_values, cooks_D > 0.08), subset(std_resid, cooks_D > 0.08),
     xlab='hat_values', ylab='std_resid',
     cex=10*sqrt(subset(cooks_D, cooks_D > 0.08)), pch=16, col='lightgrey')
points(hat_values, std_resid, cex=10*sqrt(cooks_D))
abline(h=c(-2.5, 2.5), lty=2)
Python 程式碼
influence = OLSInfluence(result_98105)
fig, ax = plt.subplots(figsize=(5, 5))
ax.axhline(-2.5, linestyle='--', color='C1')
ax.axhline(2.5, linestyle='--', color='C1')
ax.scatter(influence.hat_matrix_diag, influence.resid_studentized_internal,
           s=1000 * np.sqrt(influence.cooks_distance[0]),
           alpha=0.5)
ax.set_xlabel('hat values')
ax.set_ylabel('studentized residuals')

結果解讀

透過影響力圖(Influence Plot),我們可以直觀地看到哪些資料點具有較高的槓桿值和函式庫克距離,從而判斷其對迴歸方程的影響程度。

內容解密:
  1. 異常值的定義:在迴歸分析中,異常值是指實際觀測值與模型預測值之間存在顯著差異的資料點。
  2. 檢測異常值的方法:使用標準化殘差來檢測異常值,標準化殘差是殘差除以殘差的標準誤差。
  3. 範例分析:King County 房價資料中,透過R和Python程式碼實作了對特定郵政編碼區域內房價資料的迴歸分析,並檢測出了異常值。
  4. 結果解讀:檢測出的異常值可能是由於資料錯誤、特殊交易情況(如部分產權交易)等原因導致的,需要進一步檢查和處理。
  5. 影響力資料點的定義:影響力資料點是指其存在與否會對迴歸方程產生重大影響的資料點,不一定是異常值。
  6. 衡量影響力的指標:使用槓桿值(Hat-Value)和函式庫克距離(Cook’s Distance)來衡量資料點的影響力。
  7. 範例分析:透過R和Python程式碼實作了對King County房價資料的影響力分析,並繪製了影響力圖。
  8. 結果解讀:影響力圖直觀地展示了資料點的槓桿值和標準化殘差之間的關係,有助於識別具有高影響力的資料點。

程式邏輯與設計考量:

  1. 資料篩選:首先根據郵政編碼篩選出特定區域內的房價資料。
  2. 迴歸模型建立:使用篩選出的資料建立迴歸模型,考慮多個變數對房價的影響。
  3. 異常值檢測:計算標準化殘差,並找出殘差最大的資料點進行檢查。
  4. 影響力分析:計算槓桿值和函式庫克距離,評估資料點對迴歸模型的影響程度。
  5. 視覺化呈現:透過散點圖直觀展示資料點的影響力,有助於進一步分析和處理。

技術原理與應用:

  1. 迴歸分析基礎:理解迴歸分析的基本原理,包括模型建立、引數估計和假設檢驗。
  2. 診斷技術:掌握異常值檢測和影響力分析的技術,包括標準化殘差、槓桿值和函式庫克距離的計算和解釋。
  3. 視覺化工具:利用視覺化工具(如散點圖)呈現資料和分析結果,提高資料洞察能力。

潛在改進與擴充套件:

  1. 多模型比較:比較不同迴歸模型的表現,選擇最優模型。
  2. 更全面的診斷:除了異常值和影響力分析,還可以進行其他診斷,如多重共線性檢驗等。
  3. 機器學習方法:考慮使用機器學習方法(如整合學習)來提高預測準確性。

迴歸診斷的重要性與實務應用

在迴歸分析中,診斷模型的正確性和預測能力是至關重要的。迴歸模型不僅需要能夠準確預測結果,還需要確保模型的假設條件得到滿足。本章節將探討迴歸診斷的關鍵要素,包括異常值、影響點、異質變異數、非正態分佈誤差和相關誤差,並透過具體的例項和程式碼來說明這些概念。

異常值與影響點

在迴歸分析中,異常值(Outliers)是指那些遠離其他觀察值的資料點。這些資料點可能會對迴歸模型的估計結果產生重大影響。影響點(Influential Observations)則是指那些對迴歸係數估計有顯著影響的資料點。

以美國西雅圖地區的房價資料為例,透過迴歸分析可以發現,部分資料點對模型的影響過大。圖 4-6 展示瞭如何識別具有高影響力的觀察值,這些資料點的 Cook’s 距離大於 0.08。

程式碼範例:R 語言

# 載入必要的程式函式庫
library(ggplot2)

# 建立資料框架
df <- data.frame(resid = residuals(lm_98105), pred = predict(lm_98105))

# 繪製殘差與預測值的關係圖
ggplot(df, aes(pred, abs(resid))) + 
  geom_point() + 
  geom_smooth()

程式碼範例:Python 語言

# 載入必要的程式函式庫
import matplotlib.pyplot as plt
import seaborn as sns

# 繪製殘差與預測值的關係圖
fig, ax = plt.subplots(figsize=(5, 5))
sns.regplot(result_98105.fittedvalues, np.abs(result_98105.resid),
            scatter_kws={'alpha': 0.25}, line_kws={'color': 'C1'},
            lowess=True, ax=ax)

ax.set_xlabel('predicted')
ax.set_ylabel('abs(residual)')

內容解密:

  1. 異常值識別:利用 Cook’s 距離來識別對模型影響較大的資料點。
  2. 資料清理:移除或修正這些異常值,以提高模型的穩定性和準確性。
  3. 模型比較:比較清理前後模型的迴歸係數,觀察 Bathrooms 變數係數的變化。
  4. 程式碼作用:R 和 Python 程式碼均用於視覺化殘差與預測值之間的關係,以檢查異質變異數的存在。

異質變異數、非正態分佈誤差和相關誤差

異質變異數(Heteroskedasticity)是指殘差的變異數在不同預測值範圍內不一致。非正態分佈誤差則是指殘差不符合正態分佈的假設。相關誤差(Correlated Errors)通常出現在時間序列或空間資料中,表示誤差項之間存在相關性。

圖 4-7 和圖 4-8 分別展示了絕對殘差與預測值的關係,以及標準化殘差的直方圖。這些圖表表明,該模型的殘差存在異質變異數和非正態分佈的特性。

為何關心迴歸診斷?

雖然迴歸模型的預測準確性是首要關注點,但迴歸診斷仍然非常重要。透過檢查模型的假設條件是否得到滿足,可以發現模型中可能存在的問題,並進一步改進模型。例如,異質變異數可能表明模型遺漏了某些重要的解釋變數。

多項式迴歸與樣條迴歸

在評估迴歸模型時,使用散點圖平滑器(scatterplot smoother)可以視覺化地突出兩個變數之間的關係。舉例來說,在圖 4-7 中,對絕對殘差和預測值之間的關係進行平滑處理後,發現殘差的變異數取決於殘差的值。在這種情況下,使用了 loess 函式;loess 的工作原理是反覆擬合一系列區域性迴歸到連續的子集,以得到一個平滑的曲線。雖然 loess 可能是最常用的平滑器,但 R 中還有其他的散點圖平滑器,如 supsmuksmooth。在 Python 中,我們可以在 scipywienersav)和 statsmodelskernel_regression)中找到額外的平滑器。為了評估迴歸模型,通常無需擔心這些散點圖平滑的細節。

偏殘差圖與非線性

偏殘差圖(Partial Residual Plots)是一種用於視覺化評估估計擬合如何解釋預測變數與結果之間關係的方法。偏殘差圖的基本思想是隔離預測變數與回應之間的關係,同時考慮所有其他預測變數。偏殘差可以被視為一個「合成結果」值,將根據單個預測變數的預測與完整迴歸方程的實際殘差相結合。對於預測變數 $X_i$,偏殘差是普通殘差加上與 $X_i$ 相關的迴歸項: [ \text{Partial residual} = \text{Residual} + b_i X_i ] 其中 $b_i$ 是估計的迴歸係數。

R 語言實作

在 R 中,predict 函式有一個選項可以傳回個別迴歸項 $b_i X_i$:

terms <- predict(lm_98105, type='terms')
partial_resid <- resid(lm_98105) + terms
df <- data.frame(SqFtTotLiving = house_98105[, 'SqFtTotLiving'],
                 Terms = terms[, 'SqFtTotLiving'],
                 PartialResid = partial_resid[, 'SqFtTotLiving'])
ggplot(df, aes(SqFtTotLiving, PartialResid)) +
  geom_point(shape=1) + scale_shape(solid = FALSE) +
  geom_smooth(linetype=2) +
  geom_line(aes(SqFtTotLiving, Terms))

Python 語言實作

在 Python 中,statsmodels 套件有一個方法 sm.graphics.plot_ccpr 可以建立類別似的偏殘差圖:

sm.graphics.plot_ccpr(result_98105, 'SqFtTotLiving')

圖示解讀

R 和 Python 的圖形相差一個常數偏移。在 R 中,增加了一個常數,使得項的平均值為零。圖 4-9 所示的偏殘差圖是對 $SqFtTotLiving$ 對銷售價格貢獻的估計。$SqFtTotLiving$ 與銷售價格之間的關係顯然是非線性的(虛線)。迴歸線(實線)低估了小於 1,000 平方英尺的房屋價格,而高估了 2,000 至 3,000 平方英尺之間的房屋價格。

多項式迴歸與樣條迴歸

回應和預測變數之間的關係不一定是線性的。藥物劑量的回應通常是非線性的;將劑量加倍通常不會導致回應加倍。產品需求不是行銷費用的線性函式;在某個時候,需求可能會達到飽和。有許多方法可以擴充套件迴歸以捕捉這些非線性效應。

關鍵概念

  • 多項式迴歸:在迴歸中新增多項式項(平方、立方等)。
  • 樣條迴歸:擬合具有多個多項式段的平滑曲線。
  • 結點:分隔樣條段的值。
  • 廣義加法模型:具有自動選擇結點的樣條模型。

程式碼範例與解析

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 生成模擬資料
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(0, 0.5, 100)

# 多項式迴歸範例
x = x[:, np.newaxis]
poly_features = PolynomialFeatures(degree=3)
x_poly = poly_features.fit_transform(x)
model = LinearRegression()
model.fit(x_poly, y)

# 繪製結果
plt.scatter(x, y, label='原始資料')
plt.plot(x, model.predict(x_poly), label='多項式迴歸', color='red')
plt.legend()
plt.show()

內容解密:

  1. 匯入必要的函式庫:使用 numpy 處理陣列運算,matplotlib.pyplot 用於繪圖,sklearn.preprocessing 中的 PolynomialFeatures 用於生成多項式特徵,以及 sklearn.linear_model 中的 LinearRegression 用於線性迴歸分析。
  2. 生成模擬資料:建立一個從 0 到 10 的等差數列 x,並計算對應的 $y$ 值,這裡使用正弦函式並新增一些隨機噪聲來模擬真實資料。
  3. 多項式迴歸實作:首先將 x 轉換為適合 PolynomialFeatures 處理的格式,然後使用 PolynomialFeaturesx 轉換為包含多項式項的新特徵矩陣 x_poly。接著,使用 LinearRegressionx_polyy 進行線性迴歸分析。
  4. 結果視覺化:繪製原始資料點和多項式迴歸的預測曲線,用於比較原始資料和模型的擬合效果。