如何最容易过拟合?

机器算法验证 过拟合
2022-03-29 05:13:51

这是一个奇怪的问题,我知道。

我只是一个菜鸟,并试图了解不同的分类器选项以及它们是如何工作的。所以我在问这个问题:

给定一个包含 n1 维和 n2 观察的数据集,其中每个观察可以分类到 n3 个桶中,哪种算法最有效(理想情况下只需一次训练迭代)会生成一个模型(分类边界),该模型可以完美地对数据集中的每个观察进行分类(完全过拟合)?

换句话说,如何最容易过拟合?

(请不要教我“不要过度拟合”。这只是为了理论教育目的。)

我怀疑答案是这样的:“好吧,如果您的维度数大于您的观察数,请使用 X 算法绘制边界,否则使用 Y 算法。”

我也怀疑答案会说:“你可以画一个平滑的边界,但这比在所有不同的分类观察之间画直线更昂贵。”

但就我的直觉而言,这就是我的指导。你能帮我吗?

我有一个手绘的例子,我认为我在用二进制分类的 2D 中谈论什么。

基本上,只是分裂差异,对吧?什么算法可以有效地处理 n 维?

基本上只是分差,对吧? 什么算法可以有效地做到这一点?

2个回答

只要所有观察结果都是唯一的,那么将 K 设置为 1 并且具有任意有效距离度量的 K 最近邻将给出一个完全适合训练集的分类器(因为训练集中每个点的最近邻都是微不足道的, 本身)。它可能是最有效的,因为根本不需要培训。

这是对边界进行编码的最有效方法吗?大概是吧?由于我们不知道数据是否完全随机,因此使用数据本身作为 KNN 算法的编码模型可能是您通常可以做的最好的事情。正确的?

它是最节省时间的,但不一定是最节省空间的。

你不能。

如果您想要与任意数据和任意维度完美匹配,至少在一般情况下不会达到您想要的程度。

例如,假设我们有n1=0预测维度(即,根本没有)和n2=2观察分类为n3=2桶。这两个观察被分为两个不同的桶,即“巧克力”和“香草”。

由于您没有任何预测变量,因此您将无法完美地对它们进行分类。


如果您至少有一个预测变量在每个观察值上采用不同的值,那么您确实可以任意过度拟合,只需对数值预测变量使用任意高的多项式阶数(如果预测变量在每个观察值上具有不同的值,则您不需要) t 甚至需要转换)。工具或模型几乎是次要的。是的,很容易过拟合。

这是一个例子。10 个观测值完全独立于单个数值预测变量。我们拟合越来越复杂的逻辑回归或预测变量的幂,并使用 0.5 的阈值进行分类(这不是好的做法)。正确拟合的点标记为绿色,错误拟合的点标记为红色。

过拟合

代码:

nn <- 10
set.seed(2)

predictor <- runif(nn)
outcome <- runif(nn)>0.5

plot(predictor,outcome,pch=19,yaxt="n",ylim=c(-0.1,1.6))
axis(2,c(0,1),c("FALSE","TRUE"))

orders <- c(1,2,3,5,7,9)
xx <- seq(min(predictor),max(predictor),0.01)

par(mfrow=c(3,2))
for ( kk in seq_along(orders) ) {
    plot(predictor,outcome,pch=19,yaxt="n",ylim=c(-0.2,1.2),main=paste("Order:",orders[kk]))
    axis(2,c(0,1),c("FALSE","TRUE"))

    model <- glm(outcome~poly(predictor,orders[kk]),family="binomial")
    fits_obs <- predict(model,type="response")
    fits <- predict(model,newdata=data.frame(predictor=xx),type="response")

    lines(xx,fits)
    correct <- (fits_obs>0.5 & outcome) | ( fits_obs<0.5 & !outcome)
    points(predictor[correct],outcome[correct],cex=1.4,col="green",pch="o")
    points(predictor[!correct],outcome[!correct],cex=1.4,col="red",pch="o")
}