我是机器学习领域的新手。根据我的定义,
偏差:它仅表示您的模型参数与基础总体的真实参数之间的距离。
其中是我们的估计器,而是基础分布的真实参数。
方差:表示它对来自同一群体的新实例的泛化程度。
当我说我的模型具有低偏差时,这意味着模型参数与生成总体的真实基础参数非常相似。所以它也应该很好地推广到来自同一群体的新实例。那么它怎么会有高方差呢?
我是机器学习领域的新手。根据我的定义,
偏差:它仅表示您的模型参数与基础总体的真实参数之间的距离。
其中是我们的估计器,而是基础分布的真实参数。
方差:表示它对来自同一群体的新实例的泛化程度。
当我说我的模型具有低偏差时,这意味着模型参数与生成总体的真实基础参数非常相似。所以它也应该很好地推广到来自同一群体的新实例。那么它怎么会有高方差呢?
关键是参数估计是随机变量。如果您从总体中多次抽样并每次都拟合一个模型,那么您会得到不同的参数估计值。因此,讨论这些参数估计的期望和方差是有意义的。
如果他们的期望等于他们的真实值,你的参数估计是“无偏的” 。但它们仍然可以有低或高的方差。这与拟合特定样本的模型的参数估计值是否接近真实值不同!
例如,您可以假设预测变量均匀分布在某个区间上,例如和。我们现在可以拟合不同的模型,我们来看四个:
以下是 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)
非正式地
偏差是您的估算器与真实值的平均距离。“平均”隐藏了一点,即在实践中您只会做出一个估计,即使偏差很小,这也可能与真实值相差很远。您的模型参数与真实参数的距离不是对此的合理描述,因为它错过了平均点
方差是估计量与其平均值的离散度(平方)的量度。这再次隐藏了您将进行单一估计的要点。它还忽略了来自高偏差的错误。因此,您将它推广到新实例的程度也不是对此的合理描述,因为它错过了衡量与错误数字的离散度的点
您不希望其中任何一个或两者都很高,因为这可能会对任何估计的价值产生怀疑。您可以将它们结合起来:方差加上偏差的平方给出了预期的均方误差,因此取该总和的平方根可以衡量单次使用估计器的潜在误差的规模。价值。
假设有一台切割木板的机器。
目标是让每块木板长 4 米。
假设一台机器至少切割一打这样的木板。
您现在测量木板的长度。
“机器偏斜度高”是指板子总是太长或总是太短。
如果木材切割机“偏斜度低”意味着板子一半时间剪得太长,太短了很长的一半时间。
如果木板的长度几乎从不相同,则木材切割机具有“高差异”。其中一块板长3.2米,另一块板长5.14米。如果木板通常与其他木板长度相同,则
木材切割机具有“低差异度”。
低方差 | 高方差 | |
---|---|---|
低偏差 | 董事会几乎是完美的 | 板子的尺寸都不同,但平均板子长度是正确的 |
高偏压 | 所有的板子都正好是 6 米长,而不是想要的 4 米 | 板子的大小都不同,平均长度也不接近 4 米 |
[偏差] 仅表示您的模型参数与基础总体的真实参数之间的距离。
这是不正确的,而且写得很糟糕。
偏差是参数的真实值与参数估计值的平均值之间的差异。
表示它对来自同一群体的新实例的泛化效果如何。
那更糟。方差是估计量与估计量平均值之差的平方的平均值。