让我们看一下分类预测的误差来源,与线性预测的误差来源进行比较。如果你分类,你有两个错误来源:
- 分类到错误的 bin 时出错
- bin 中位数与目标值(“黄金位置”)之间的差异产生的误差
如果您的数据具有低噪声,那么您通常会分类到正确的 bin 中。如果您也有很多垃圾箱,那么第二个错误来源将很低。相反,如果您有高噪声数据,那么您可能经常将错误分类到错误的 bin 中,这可能会主导整个错误 - 即使您有许多小 bin,所以如果您分类正确,第二个错误源很小。再说一次,如果你的 bin 很少,那么你会更经常地正确分类,但你的 bin 内错误会更大。
最后,它可能归结为噪声和 bin 大小之间的相互作用。
这是一个小玩具示例,我运行了 200 次模拟。与噪声的简单线性关系,只有两个 bin:

现在,让我们以低噪音或高噪音运行它。(上面的训练集有很高的噪声。)在每种情况下,我们都记录了来自线性模型和分类模型的 MSE:
nn.sample <- 100
stdev <- 1
nn.runs <- 200
results <- matrix(NA,nrow=nn.runs,ncol=2,dimnames=list(NULL,c("MSE.OLS","MSE.Classification")))
for ( ii in 1:nn.runs ) {
set.seed(ii)
xx.train <- runif(nn.sample,-1,1)
yy.train <- xx.train+rnorm(nn.sample,0,stdev)
discrete.train <- yy.train>0
bin.medians <- structure(by(yy.train,discrete.train,median),.Names=c("FALSE","TRUE"))
# plot(xx.train,yy.train,pch=19,col=discrete.train+1,main="Training")
model.ols <- lm(yy.train~xx.train)
model.log <- glm(discrete.train~xx.train,"binomial")
xx.test <- runif(nn.sample,-1,1)
yy.test <- xx.test+rnorm(nn.sample,0,0.1)
results[ii,1] <- mean((yy.test-predict(model.ols,newdata=data.frame(xx.test)))^2)
results[ii,2] <- mean((yy.test-bin.medians[as.character(predict(model.log,newdata=data.frame(xx.test))>0)])^2)
}
plot(results,xlim=range(results),ylim=range(results),main=paste("Standard Deviation of Noise:",stdev))
abline(a=0,b=1)
colMeans(results)
t.test(x=results[,1],y=results[,2],paired=TRUE)

正如我们所看到的,分类是否能提高准确性归结为这个例子中的噪声水平。
您可以使用模拟数据或不同的 bin 大小进行一些操作。
最后,请注意,如果您尝试不同的 bin 大小并保留性能最佳的 bin 大小,那么您应该不会对它的性能优于线性模型感到惊讶。毕竟,你实际上是在增加更多的自由度,如果你不小心(交叉验证!),你最终会过度拟合垃圾箱。