machine-learning - 使用不同的数据集训练随机森林会给出完全不同的结果!为什么?

标签 machine-learning random-forest

我正在使用一个数据集,其中包含 12 个属性(包括时间戳)和一个作为输出的属性。它还有大约 4000 行。此外,记录中没有重复的内容。我正在尝试训练随机森林来预测输出。为此,我创建了两个不同的数据集:

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

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

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

如果有人能帮助我了解,我非常感激

  1. 为什么我会有如此巨大的差异。
  2. 我还需要具有最新时间戳的测试数据集(与第二个实验中的数据集相同)。无论如何,是否可以从数据集中的其余部分中选择数据进行训练以改进 培训。

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

最佳答案

首先,尚不清楚您的测试到底是如何的。其次,无论哪种方式,你的测试都是错误的

RESULT: I am getting totally different result for these two datasets. For the first one AUC(Area under the curve) is 85%-90% (I did the experiment several times) and for the second one is 45%-50%.

这是用于训练集还是测试集?如果测试集,那就意味着你的泛化能力很差。

你做错了,因为你不被允许调整你的模型,使其在相同的测试集上表现良好,因为它可能会导致你得到一个可以做到这一点的模型,但概括性很差。

您应该执行以下两件事之一:

<强>1。训练-验证-测试分割

随机方式保留 60% 的数据用于训练,20% 用于验证,20% 用于测试。训练您的模型,使其在使用训练集的验证集上表现良好。确保你没有过度拟合:训练集上的性能应该接近验证集上的性能,如果相差很远,则说明你的训练集过度拟合了。 现阶段根本不要使用测试集

一旦您满意,就可以在训练集+验证集上训练您选择的模型,并在您提供的测试集上对其进行测试。您应该获得可接受的性能。你不能根据你在这个测试集上得到的结果进一步调整你的模型,如果你不满意,你必须从头开始。

<强>2。使用cross validation

一种流行的形式是 10 倍交叉验证:打乱数据并将其分成大小相等或几乎相等的 10 组。对于 10 组中的每一组,对其他 9 组进行训练,并对剩余一组进行测试。平均测试组的结果。

您可以对模型进行更改以提高平均分数,只需在每次更改后再次运行交叉验证(确保重新洗牌)。

我个人更喜欢交叉验证。

我猜发生的情况是,通过基于时间戳进行排序,你的算法泛化能力很差。也许您保留用于测试的 20% 在某种程度上存在显着差异,而您的算法没有机会捕获这种差异?一般来说,您的数据应该随机排序以避免此类问题。

当然,您的实现也可能有错误。

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

关于machine-learning - 使用不同的数据集训练随机森林会给出完全不同的结果!为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333113/

相关文章:

python - 创建模型后清除Python循环中的内存

python - 在单个特征数据框中查找质心和点之间的距离 - KMeans

python - Tensorflow 数据集 - 给定生成器输出 1 个标签的 X 个输入,如何构建批处理?

r - 将组合()与 R 包 randomForest 一起使用

python - 如何在随机森林中设置自己的概率阈值?

python - 无法弄清楚如何定义我的 y_test

machine-learning - 带有随机森林的 AdaBoostClassifier 用于多标签分类 (sklearn)

apache-spark - 如何处理 Spark 最新随机森林中的分类特征?

python - 如何在没有交叉验证的情况下检查机器学习的准确性

r - 了解 'randomForest' R 包中每个类的变量重要性