我正在处理一个包含12个属性(包括时间戳)和一个输出属性的数据集。这个数据集大约有4000行,且记录中没有重复。我试图训练一个随机森林来预测输出。为此,我创建了两个不同的数据集:
- 一:随机选择80%的数据用于训练,其余20%用于测试。
- 二:根据时间戳对数据集进行排序,然后前80%用于训练,最后20%用于测试。
然后,我从两个数据集中移除了时间戳属性,并使用其余11个属性进行训练和测试(我确定时间戳不应该作为训练的一部分)。
结果:这两个数据集的结果完全不同。对于第一个数据集,AUC(曲线下面积)为85%-90%(我做了几次实验),而对于第二个数据集,AUC为45%-50%。
如果有人能帮助我了解以下问题,我将不胜感激:
- 为什么会有这么大的差异。
- 我还需要测试数据集具有最新的时间戳(与第二个实验中的数据集相同)。有没有办法从数据集的其余部分选择数据来改进训练。
附注:我已经测试了从前80%的时间戳中随机选择,但这并没有提高性能。
回答:
首先,不清楚你具体是如何进行测试的。其次,无论哪种方式,你的测试方法是错误的。
结果:我在这两个数据集上得到了完全不同的结果。对于第一个数据集,AUC(曲线下面积)为85%-90%(我做了几次实验),而对于第二个数据集,AUC为45%-50%。
这是训练集的结果还是测试集的结果?如果是测试集的结果,这意味着你的模型泛化能力差。
你做得不对,因为你不应该调整模型以在同一个测试集上表现良好,因为这可能会导致一个在该测试集上表现良好但泛化能力差的模型。
你应该做以下两件事之一:
1. 训练-验证-测试分割
以随机方式保留60%的数据用于训练,20%用于验证,20%用于测试。使用训练集训练你的模型,使其在验证集上表现良好。确保你没有过拟合:训练集上的表现应该与验证集上的表现接近,如果差异很大,你就过拟合了训练集。在这个阶段完全不要使用测试集。
一旦你满意了,就在训练集+验证集上训练你选择的模型,并在你保留的测试集上测试。你应该能得到可接受的表现。如果你对结果不满意,你不能根据测试集的结果进一步调整模型,你必须从头开始。
2. 使用交叉验证
一种常见的形式是10折交叉验证:打乱你的数据并将其分成10个大小相等或几乎相等的组。对于这10个组中的每一个,使用其他9个组进行训练,并在剩下的一个组上进行测试。平均你的测试组结果。
你可以根据平均分数改进模型,只需在每次更改后再次运行交叉验证(确保重新打乱数据)。
我个人更喜欢交叉验证。
我猜测,通过根据时间戳排序,你使得算法的泛化能力变差。也许你保留的20%测试数据在某些方面与训练数据显著不同,而你的算法没有机会捕捉到这种差异?一般来说,为了避免这种问题,你的数据应该随机排序。
当然,你的实现也可能存在错误。
我建议你尝试交叉验证,看看你会得到什么结果。