为什么通过输出离散化将回归模型简化为分类模型会改进模型?

机器算法验证 回归 分类 分类数据 连续数据
2022-03-09 15:56:30

在回归问题中,如果将输出离散化为 bin/categories/clusters 并用作标签,则模型会简化为分类模型。

我的问题是:做这种减少背后的理论或应用动机是什么?在我从文本预测位置的特定实验中,当我将问题建模为分类而不是回归时,我经常看到改进。

在我的特殊情况下,输出是 2d 但我正在寻找更一般的解释。

更新: 假设输入是 BoW 文本,输出是坐标(例如,在地理标记的 Twitter 数据中)。在回归中,任务是使用平方误差损失来预测给定文本的纬度/经度。如果我们对训练 lat/lon 点进行聚类并假设每个聚类是一个类,那么我们可以通过优化分类模型中的交叉熵损失来预测一个类。

评估:

对于回归,预测位置和黄金位置之间的平均距离。

对于分类,预测集群中的中值训练点与黄金位置之间的平均距离。

1个回答

让我们看一下分类预测的误差来源,与线性预测的误差来源进行比较。如果你分类,你有两个错误来源:

  1. 分类到错误的 bin 时出错
  2. 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 大小,那么您应该不会对它的性能优于线性模型感到惊讶。毕竟,你实际上是在增加更多的自由度,如果你不小心(交叉验证!),你最终会过度拟合垃圾箱。