如何为阻塞数据训练机器学习模型

数据挖掘 分类 随机森林 机器学习模型 监督学习
2022-02-23 20:08:55

我关心以下类型数据的监督分类问题。数据包括N行(其中N不是很大——这不是大数据问题)和M列(特征),每一行都有一个我感兴趣的标签。每一行属于一个特定的块,每个块由 1-50 行组成。块的大小取决于块的持续时间(因此每个块中的行是相关的,但可以忽略不同块之间的相关性)。

目的是学习允许对新行或新块进行分类的数据的分类算法。

现在有两件重要的事情:每个块中的标签是恒定的,并且有一些特征可以识别块。

我的问题是:在这种特定类型的数据上学习模型的最佳方法可能是什么?

为了进一步说明这个问题,让我报告一下我在使用随机森林处理数据集时发现的一些问题。

假设我将一部分数据作为验证数据,其中包含整个块。如果我在训练和测试数据中随机拆分剩余的行,则学习到的随机森林的准确度在训练和测试数据上非常高,但在验证数据上却非常低。这是因为随机森林在这种情况下学习识别单个块,并且由于验证数据包含一些未知块,因此准确性下降。这也可以从特征的重要性中看出:最重要的是那些可以很容易地识别循环的特征。

将剩余的数据拆分为训练和测试数据并保留整个块会有所帮助,但并不能完全解决问题。

另一种方法是删除所有允许识别块的特征。但这很难先验,其中一些功能可能对我的问题有重要信息。

克服这些问题的一种简单方法是获取每个块中的行均值并将结果数据用于分类问题。但是,在这种情况下,您会丢失很多信息。

所以我想知道是否有更自然的方法来处理这个尊重数据块结构的分类问题。

2个回答

假设我将一部分数据作为验证数据,其中包含整个块。如果我在训练和测试数据中随机拆分剩余的行,则学习到的随机森林的准确度在训练和测试数据上非常高,但在验证数据上却非常低。这是因为随机森林在这种情况下学习识别单个块,并且由于验证数据包含一些未知块,因此准确性下降。这也可以从特征的重要性中看出:最重要的是那些可以很容易地识别循环的特征。

将剩余的数据拆分为训练和测试数据并保留整个块会有所帮助,但并不能完全解决问题。

后一种方法更好;至少您的测试集将更能代表您所需的用例,因此分数将更加相关。sklearn 有这个内置的,带有GroupKFold.

另一种方法是删除所有允许识别块的特征。但这很难先验,其中一些功能可能对我的问题有重要信息。

确实,这似乎有问题。有一个有趣的相关工作,“域自适应神经网络”,它基本上试图同时学习预测趋势,同时不学习特定于块的信息;但我不确定这在这里有多相关,或者是否有类似的非神经网络方法。

克服这些问题的一种简单方法是获取每个块中的行均值并将结果数据用于分类问题。但是,在这种情况下,您会丢失很多信息。

您可以尝试从块中提取其他相关特征。如果您有一些领域知识来指导特征工程,这可能会特别有效。

一般来说,如果每个块都与一个标签相关联(而不是每一行都有自己的标签),那么您正在处理“多实例学习”。如何处理取决于如何生成块的细节。维基百科页面,尤其是假设和算法部分,是一个很好的起点。

我认为您的方法或多或少是有效的,但是您过度拟合了模型,因为您没有很多数据。这就是我的主要观点。

原则上有很多方法可以解决这个问题,但如果你的数据很少,也许你根本不应该期待很好的结果。如果你使用平均值,你会得到更好的结果,但“问题并没有完全解决”。先验我不确定你是否有理由认为你可以做得更好。

无论如何,第一步应该是简化模型(越来越少的浅树)。您应该会发现您的测试错误恶化了,但您的验证错误有所改善,因为模型现在被迫学习有关块的信息,而不是简单地记住记录。此信息可以在模型尚未看到的记录上重复使用。

您也可以查看正则化,但它本质上是一种自动找到更简单但更好的模型的方法。此外,数据增强。是否可以通过稍微改变现有数据来生成更多数据?就像您可以通过更改您拥有的图像来生成更多图像的方式一样:通过裁剪、翻转、旋转等。

最后,确保您在训练-测试-验证集之间的拆分是随机的。我想这取决于您的数据,但似乎您不能指望模型了解训练集中根本不存在的块。如果该块仅出现在验证集中,我猜该模型在该数据上将是随机的。