使用不同数据集训练随机森林得到完全不同的结果!为什么?

我正在处理一个包含12个属性(包括时间戳)和一个输出属性的数据集。这个数据集大约有4000行,且记录中没有重复。我试图训练一个随机森林来预测输出。为此,我创建了两个不同的数据集:

  1. 一:随机选择80%的数据用于训练,其余20%用于测试。
  2. 二:根据时间戳对数据集进行排序,然后前80%用于训练,最后20%用于测试。

然后,我从两个数据集中移除了时间戳属性,并使用其余11个属性进行训练和测试(我确定时间戳不应该作为训练的一部分)。

结果:这两个数据集的结果完全不同。对于第一个数据集,AUC(曲线下面积)为85%-90%(我做了几次实验),而对于第二个数据集,AUC为45%-50%。

如果有人能帮助我了解以下问题,我将不胜感激:

  1. 为什么会有这么大的差异。
  2. 我还需要测试数据集具有最新的时间戳(与第二个实验中的数据集相同)。有没有办法从数据集的其余部分选择数据来改进训练。

附注:我已经测试了从前80%的时间戳中随机选择,但这并没有提高性能。


回答:

首先,不清楚你具体是如何进行测试的。其次,无论哪种方式,你的测试方法是错误的

结果:我在这两个数据集上得到了完全不同的结果。对于第一个数据集,AUC(曲线下面积)为85%-90%(我做了几次实验),而对于第二个数据集,AUC为45%-50%。

这是训练集的结果还是测试集的结果?如果是测试集的结果,这意味着你的模型泛化能力差。

你做得不对,因为你不应该调整模型以在同一个测试集上表现良好,因为这可能会导致一个在该测试集上表现良好但泛化能力差的模型。

你应该做以下两件事之一:

1. 训练-验证-测试分割

随机方式保留60%的数据用于训练,20%用于验证,20%用于测试。使用训练集训练你的模型,使其在验证集上表现良好。确保你没有过拟合:训练集上的表现应该与验证集上的表现接近,如果差异很大,你就过拟合了训练集。在这个阶段完全不要使用测试集

一旦你满意了,就在训练集+验证集上训练你选择的模型,并在你保留的测试集上测试。你应该能得到可接受的表现。如果你对结果不满意,你不能根据测试集的结果进一步调整模型,你必须从头开始。

2. 使用交叉验证

一种常见的形式是10折交叉验证:打乱你的数据并将其分成10个大小相等或几乎相等的组。对于这10个组中的每一个,使用其他9个组进行训练,并在剩下的一个组上进行测试。平均你的测试组结果。

你可以根据平均分数改进模型,只需在每次更改后再次运行交叉验证(确保重新打乱数据)。

我个人更喜欢交叉验证。

我猜测,通过根据时间戳排序,你使得算法的泛化能力变差。也许你保留的20%测试数据在某些方面与训练数据显著不同,而你的算法没有机会捕捉到这种差异?一般来说,为了避免这种问题,你的数据应该随机排序。

当然,你的实现也可能存在错误。

我建议你尝试交叉验证,看看你会得到什么结果。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注