集成模型过拟合?

数据挖掘 分类
2022-02-16 16:17:42

我正在尝试一个分类项目。我已将我的数据(20000ish)拆分为训练集和测试集。在训练集上,我运行了一系列分类,包括 knn 随机森林和 gbm 。这些最多给我大约 20-30% 的准确率。对于每个样本,我生成每个类的概率并制作一个新模型

Knn proba 1, knn proba 2 .... 随机森林 proba 1 等

然后我运行一个随机森林分类器,它对测试集给出了 90% 的准确率。

太棒了!...但是当我将模型用于新数据时,准确性非常差。

在某种程度上,这感觉像是过度拟合的情况,但测试集肯定也应该很差

为什么测试数据可能这么好,而新数据却这么差……我做错了什么?

谢谢克里斯

2个回答

是的,我怀疑你过度拟合。当您构建模型的第一阶段(最近邻、随机森林、梯度提升等)时,过程是这样的吗?

random_forest.fit(train_data,target)
random_forest_probabilities = random_forest.predict_proba(train_data)
...

如果是这样,您将用于训练模型的相同数据插入到模型中以获得概率,这将导致比现实生活中预期的更好的概率,因此比第二阶段模型的预期结果要好得多(即:过度拟合)。要解决这个问题,您必须在交叉验证循环中执行所有操作,在伪代码中如下所示:

for <fold> in <crossvalidation>:
     random_forest.fit(<train_data_fold>,<target_fold>)
     <fold predictions> = random_forest.fit(<test_data_fold>)
     ...

以这种方式做事将模拟现实生活,因为您的预测将使用在训练时不包含该数据的模型收集。您可以使用所有预测变量作为输入来构建最终模型。如果您在实际执行此操作时遇到困难,请使用代码编辑您的问题或发布一个关于如何使用 CV 循环运行所有内容的新问题。

尝试对训练数据进行交叉验证,交叉验证结合(平均)拟合测量(预测误差)来纠正训练误差的乐观性质并得出更准确的模型预测性能估计(例如:k-fold),检查准确率(Precision/recall/f measure)然后在测试数据上使用这个分类器。