Machine-Learning

模型的低偏差和高方差是什麼意思?

  • May 5, 2021

我是機器學習領域的新手。根據我的定義,

偏差:它僅表示您的模型參數與基礎總體的真實參數之間的距離。

$$ Bias(\hat{\theta}_m) = E(\hat{\theta}_m) − θ $$

在哪裡 $ \hat{\theta}_m $ 是我們的估計器和 $ \theta $ 是基礎分佈的真實參數。

方差:表示它對來自同一群體的新實例的泛化程度。

當我說我的模型具有低偏差時,這意味著模型參數與生成總體的真實基礎參數非常相似。所以它也應該很好地推廣到來自同一群體的新實例。那麼它怎麼會有高方差呢?

關鍵是參數估計是隨機變量。如果您從總體中多次抽樣並每次都擬合一個模型,那麼您會得到不同的參數估計值。因此,討論這些參數估計的期望和方差是有意義的。

如果他們的期望等於他們的真實值,你的參數估計是“無偏的” 。但它們仍然可以有低或高的方差。這與擬合特定樣本的模型的參數估計值是否接近真實值不同!

例如,您可以假設一個預測器 $ x $ 在某個間隔上均勻分佈,比如說 $ [0,1] $ , 和 $ y=x^2+\epsilon $ . 我們現在可以擬合不同的模型,我們來看四個:

  • 如果我們倒退 $ y $ 在 $ x $ , 那麼參數就會有偏差,因為它的參數會有一個大於零的期望值。(當然,我們沒有參數 $ x^2 $ 項,所以這個不存在的參數可以說是一個常數零,這也不同於 $ 1 $ .)
  • 如果我們倒退 $ y $ 在 $ x^2 $ 單獨而言,我們的模型是真正的數據生成過程(DGP)。我們的參數估計將是無偏的並且具有最小的方差。
  • 如果我們倒退 $ y $ 在 $ x $ 和 $ x^2 $ ,那麼我們就有了真正的 DGP,但我們也有一個多餘的預測器 $ x $ . 我們的參數估計將是無偏的(期望 $ 0 $ 對於攔截和 $ x $ 係數, $ 1 $ 為了 $ x^2 $ 一),但它們會有更高的方差。
  • 最後,如果我們回歸 $ y $ 在 $ x $ , $ x^2 $ 和 $ x^3 $ ,同樣成立:我們有無偏的參數估計,但方差更大。

以下是 1000 次模擬的參數估計值(底部的 R 代碼)。請注意點云如何圍繞真實值聚集(或不聚集),以及它們的分佈程度。

偏差方差

概念上的問題是我們通常看不到這些隨機變量。我們所看到的只是我們人口中的一個樣本,一個模型,以及我們參數估計的單一實現。這將是情節中的一個點。要記住的關鍵是,如果我們的模型指定錯誤,那麼方差會更大。當然,如果我們有很大的方差,那麼我們的模型很容易與真實的 DGP 相距甚遠,並且無論我們進行推理還是預測,都會產生很大的誤導。

代碼:

n_sims <- 1e3
n_sample <- 20

param_estimates <- list()
param_estimates[[1]] <- matrix(nrow=n_sims,ncol=2)
param_estimates[[2]] <- matrix(nrow=n_sims,ncol=2)
param_estimates[[3]] <- matrix(nrow=n_sims,ncol=3)
param_estimates[[4]] <- matrix(nrow=n_sims,ncol=4)

for ( ii in 1:n_sims ) {
   set.seed(ii)    # for reproducibility
   xx <- runif(n_sample,0,1)
   yy <- xx^2+rnorm(n_sample)
   param_estimates[[1]][ii,] <- summary(lm(yy~xx))$coefficients[,1]
param_estimates[[2]][ii,] <- summary(lm(yy~I(xx^2)))$coefficients[,1]
   param_estimates[[3]][ii,] <- summary(lm(yy~xx+I(xx^2)))$coefficients[,1]
param_estimates[[4]][ii,] <- summary(lm(yy~xx+I(xx^2)+I(xx^3)))$coefficients[,1]
}

beeswarm_matrix <- function(MM, amount=0.3, add.boxplot=FALSE, add.beanplot=FALSE, names=NULL, pt.col=NULL, ...) {  
   # beeswarm plots of matrix columns
   plot(c(1-2*amount,ncol(MM)+2*amount),range(MM,na.rm=TRUE),xaxt="n",type="n",...)
   axis(1,at=1:ncol(MM),labels=if(is.null(names)){colnames(MM)}else{names},...)
   if ( add.boxplot ) boxplot(MM, add=TRUE, xaxt="n", outline=FALSE, border="grey", ...)
   if ( add.beanplot ) {
       require(beanplot)
       sapply(1:ncol(MM),function(xx)beanplot(MM[,xx],add=TRUE,what=c(0,1,1,0),xaxt="n",
           col=c(rep("lightgray",3),"lightgray"),border=NA, at=xx,...))
   }
   pt.col.mat <- matrix(if(is.null(pt.col)){"black"}else{pt.col},nrow=nrow(MM),ncol=ncol(MM),byrow=TRUE)
   points(jitter(matrix(1:ncol(MM),nrow=nrow(MM),ncol=ncol(MM),byrow=TRUE),amount=amount),MM,col=pt.col.mat,...)
}

opar <- par(las=1,mfrow=c(2,2),mai=c(.5,.5,.1,.1),pch=19)
   beeswarm_matrix(param_estimates[[1]],add.beanplot=TRUE,xlab="",ylab="",cex=0.5,
       names=c("Intercept",expression(x)))
   beeswarm_matrix(param_estimates[[2]],add.beanplot=TRUE,xlab="",ylab="",cex=0.5,
       names=c("Intercept",expression(x^2)))
   beeswarm_matrix(param_estimates[[3]],add.beanplot=TRUE,xlab="",ylab="",cex=0.5,
       names=c("Intercept",expression(x),expression(x^2)))
   beeswarm_matrix(param_estimates[[4]],add.beanplot=TRUE,xlab="",ylab="",cex=0.5,
       names=c("Intercept",expression(x),expression(x^2),expression(x^3)))
par(opar)

引用自:https://stats.stackexchange.com/questions/522829

comments powered by Disqus