原文鏈接:http://tecdat.cn/?p=11387
儘管線性模型是最簡單的機器學習技術之一,但它們仍然是進行預測的強大工具。這尤其是由於線性模型特別容易解釋這一事實。在這裏,我將討論使用空氣質量數據集的普通最小二乘迴歸示例解釋線性模型時最重要的方面。
空氣質量數據集
空氣質量數據集包含對在紐約獲得的以下四個空氣質量指標的154次測量:
- 臭氧:平均臭氧水平,以十億分之一爲單位
- Solar.R:太陽輻射
- 風:平均風速,每小時英里
- 溫度:每日最高溫度,以華氏度爲單位
我們將通過刪除所有NA
並排除 Month
和Day
列來清理數據集 ,這些列和 列不應充當預測變量。
data(airquality)
ozone <- subset(na.omit(airquality),
select = c("Ozone", "Solar.R", "Wind", "Temp"))
數據探索和準備
預測任務如下:根據太陽輻射,風速和溫度,我們可以預測臭氧水平嗎?要查看線性模型的假設是否適合手頭的數據,我們將計算變量之間的相關性:
# scatterplot matrix
plot(ozone)
# pairwise variable correlations
cors <- cor(ozone)
print(cors)
## Ozone Solar.R Wind Temp
## Ozone 1.0000000 0.3483417 -0.6124966 0.6985414
## Solar.R 0.3483417 1.0000000 -0.1271835 0.2940876
## Wind -0.6124966 -0.1271835 1.0000000 -0.4971897
## Temp 0.6985414 0.2940876 -0.4971897 1.0000000
# which variables are highly correlated, exclude self-correlation
print(cor.names)
## [1] "Wind+Ozone: -0.61" "Temp+Ozone: 0.7" "Ozone+Wind: -0.61"
## [4] "Ozone+Temp: 0.7"
由於臭氧參與兩個線性相互作用,即:
- 臭氧與溫度呈正相關
- 臭氧與風負相關
這表明應該有可能使用其餘特徵來形成預測臭氧水平的線性模型。
分爲訓練和測試集
我們將抽取70%的樣本進行訓練,並抽取30%的樣本進行測試:
set.seed(123)
N.train <- ceiling(0.7 * nrow(ozone))
N.test <- nrow(ozone) - N.train
trainset <- sample(seq_len(nrow(ozone)), N.train)
testset <- setdiff(seq_len(nrow(ozone)), trainset)
研究線性模型
爲了說明解釋線性模型的最重要方面,我們將通過以下方式訓練訓練數據的普通最小二乘模型:
爲了解釋模型,我們使用以下 summary
函數:
model.summary <- summary(model)
print(model.summary)
##
## Call:
## Residuals:
## Min 1Q Median 3Q Max
## -36.135 -12.670 -2.221 9.420 65.914
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -65.76604 22.52381 -2.920 0.004638 **
## Solar.R 0.05309 0.02305 2.303 0.024099 *
## Temp 1.56320 0.25530 6.123 4.03e-08 ***
## Wind -2.61904 0.68921 -3.800 0.000295 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 18.17 on 74 degrees of freedom
## Multiple R-squared: 0.5924, Adjusted R-squared: 0.5759
## F-statistic: 35.85 on 3 and 74 DF, p-value: 2.039e-14
殘差
我們獲得的第一條信息是殘差。
殘留中值表明,該模型通常預測的臭氧值略高於觀測值。但是,最大值很大,表明某些離羣值預測也太低了。查看數字可能有點抽象,因此讓我們根據觀察值繪製模型的預測:
res <- residuals(model)
# add residuals to the plot
segments(obs, pred, obs, pred + res)
係數
現在我們瞭解了殘差,讓我們看一下係數。我們可以使用該 coefficients
函數來獲取模型的擬合係數:
## (Intercept) Solar.R Temp Wind
## -65.76603538 0.05308965 1.56320267 -2.61904128
請注意,模型的截距值非常低。這是在所有獨立值均爲零的情況下模型將預測的值。 低係數 Solar.R
表示太陽輻射對預測臭氧水平沒有重要作用,這不足爲奇,因爲在我們的探索性分析中,它與臭氧水平沒有很大的相關性。 係數 Temp
表示溫度高時臭氧水平高(因爲臭氧會更快形成)。 係數 Wind
告訴我們快風時臭氧水平會降低(因爲臭氧會被吹走)。
與係數關聯的其他值提供有關估計的統計確定性的信息。
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -65.76603538 22.52380940 -2.919845 4.638426e-03
## Solar.R 0.05308965 0.02305379 2.302860 2.409936e-02
## Temp 1.56320267 0.25530453 6.122894 4.034064e-08
## Wind -2.61904128 0.68920661 -3.800081 2.946349e-04
Std. Error
是係數估計的標準誤差t value
以標準誤差表示係數的值Pr(>|t|)
是t檢驗的p值,表示檢驗統計量的重要性
標準誤差
係數的標準誤差定義爲特徵方差的標準偏差:
在R中,可以通過以下方式計算模型估計的標準誤差:
## (Intercept) Solar.R Temp Wind
## (Intercept) 507.32198977 2.893612e-02 -5.345957524 -9.940961e+00
## Solar.R 0.02893612 5.314773e-04 -0.001667748 7.495211e-05
## Temp -5.34595752 -1.667748e-03 0.065180401 6.715467e-02
## Wind -9.94096142 7.495211e-05 0.067154670 4.750058e-01
## (Intercept) Solar.R Temp Wind
## 22.52380940 0.02305379 0.25530453 0.68920661
現在, 你可能想知道這些值的 vcov
來源。它定義爲設計矩陣的方差-協方差矩陣,該矩陣按誤差的方差標準化:
## (Intercept) Solar.R Temp Wind
## (Intercept) 507.32198977 2.893612e-02 -5.345957524 -9.940961e+00
## Solar.R 0.02893612 5.314773e-04 -0.001667748 7.495211e-05
## Temp -5.34595752 -1.667748e-03 0.065180401 6.715467e-02
## Wind -9.94096142 7.495211e-05 0.067154670 4.750058e-01
用於標準化的方差-協方差矩陣的方差是誤差的估計方差,其定義爲
cov.unscaled
參數是簡單地所有的方差-協方差矩陣 :
# include intercept as a feature via 'model.matrix'
X <- model.matrix(model) # design matrix
# solve X^T %*% X = I to find the inverse of X^T * X
unscaled.var.matrix <- solve(crossprod(X), diag(4))
print(paste("Is this the same?", isTRUE(all.equal(unscaled.var.matrix, model.summary$cov.unscaled, check.attributes = FALSE))))
## [1] "Is this the same? TRUE"
t值
t值定義爲
在R中
## (Intercept) Solar.R Temp Wind
## -2.919845 2.302860 6.122894 -3.800081
p值
在所有係數βi=0 的假設下計算p值。t值遵循t分佈
model.df <- df.residual(model)
自由程度。線性模型的自由度定義爲
其中n 是樣本數,p 是特徵數(包括inctercept)。p值表示獲得的係數估計純粹是偶然地與零不同的可能性。因此,低p值表明變量與結果之間存在顯着關聯。
進一步統計
該summary
函數提供以下附加統計信息 :多個R平方,調整後的R平方和F統計。
殘留標準誤差
顧名思義,殘留標準誤差是模型的平均RSS(MSE)的平方根:
## [1] 18.16979
殘留標準誤差僅表示模型的平均精度。在這種情況下,該值非常低,表明該模型具有良好的擬合度。
多個R平方
R平方的倍數表示確定係數。它定義爲估計值與觀察到的結果之間的相關性的平方:
## [1] 0.5924073
與[-1,1] [-1,1]中的相關性相反,R平方在[0,1] [0,1]中。
調整後的R平方
調整後的R平方值會根據模型的複雜性來調整R平方:
其中nn是觀察數,pp是特徵數。因此,調整後的R平方可以像這樣計算:
n <- length(trainset) # number of samples
print(r.squared.adj)
## [1] 0.5758832
如果R平方和調整後的R平方之間存在相當大的差異,則表明可以考慮減少特徵空間。
F統計
F統計量定義爲已解釋方差與無法解釋方差的比率。爲了進行迴歸,F統計量始終指示兩個模型之間的差異,其中模型1(p1p1)由模型2(p2p2)的特徵子集定義:
F統計量描述模型2的預測性能(就RSS而言)優於模型1的程度。報告的默認F統計量是指訓練後的模型與僅截距模型之間的差異:
##
## Call:
##
## Coefficients:
## (Intercept)
## 36.76
因此,測試的零假設是唯一的截距-模型的擬合和指定的模型是相等的。如果可以拒絕原假設,則意味着指定模型比原模型具有更好的擬合度。
讓我們通過手工計算得出這個想法:
rss <- function(model) {
return(sum(model$residuals^2))
}
# compare the intercept-only model and the model with 3 features
f.statistic(null.model, model)
## [1] 35.85126
在這種情況下,F統計量具有較大的值,這表明我們訓練的模型明顯優於僅攔截模型。
置信區間
置信區間是解釋線性模型的有用工具。默認情況下, confint
計算95%置信區間(±1.96σ^±1.96σ^):
ci <- confint(model)
## (Intercept) Solar.R
## "95% CI: [-110.65,-20.89]" "95% CI: [0.01,0.1]"
## Temp Wind
## "95% CI: [1.05,2.07]" "95% CI: [-3.99,-1.25]"
這些值表明模型對截距的估計不確定。這可能表明需要更多數據才能獲得更好的擬合度。
檢索估計值的置信度和預測間隔
通過提供自interval
變量,可以將線性模型的預測轉換爲間隔 。這些間隔給出了對預測值的置信度。間隔有兩種類型:置信間隔和預測間隔。讓我們將模型應用於測試集,使用不同的參數作爲 interval
參數,以查看兩種間隔類型之間的差異:
# compute confidence intervals (CI) for predictions:
preds.ci <- predict(model, newdata = ozone[testset,], interval = "confidence")
## fit lwr upr Method
## [1,] "-4.42397219873667" "-13.4448767773931" "4.59693237991976" "CI"
## [2,] "-22.0446990408131" "-61.0004555440645" "16.9110574624383" "PI"
置信區間是窄區間,而預測 區間是寬區間。它們的值基於level
參數指定的提供的公差/重要性水平 (默認值:0.95)。
它們的定義略有不同。給定新的觀測值xx,配置項和PI定義如下
其中tα/ 2,dftα/ 2,df是df = 2df = 2自由度且顯着性水平爲αα的t值,σerrσerr是殘差的標準誤差,σ2xσx2是獨立特徵的方差, x(x)表示特徵的平均值。