我可以(合理地)仅根据先前模型预测不佳的观察结果训练第二个模型吗?

机器算法验证 预测模型 集成学习 火车 偏差-方差-权衡 加权数据
2022-02-17 07:51:24

假设我在构建预测模型时犯了以下罪行:

  1. 我将我的数据集分成四个子集:三个用于训练
    (Train_A、Train_B 和 Train_C),一个用于验证。

  2. 我在 Train_A 上训练了一个初始模型 (Model_A)。因为目标是最大化样本外预测的准确性,所以我使用了诸如交叉验证之类的偏差方差平衡技术。

  3. 我在 Train_B 上从 Model_A 生成预测并记录预测错误。

  4. 接下来,我在 Train_B 上训练第二个模型 (Model_B),但我根据来自 Model_A 的预测误差的大小来权衡观察结果。换句话说,Model_B 被告知要最专注于学习预测 Model_A 非常不擅长预测的观察结果。同样,目标是样本外的准确性,因此使用了交叉验证等技术。

  5. 我从 Train_C 上的 Model_A 和 Model_B 生成预测。这些用于探索结合来自两个模型的预测(例如,加权平均)以(希望)提高样本外预测准确性的最佳方式。

  6. 在确定了权衡来自 Model_A 和 Model_B 的预测的最佳方法之后,我使用验证集估计了样本外的准确度。

主要问题:我该死吗?这种方法是否天生且不可恢复地容易过度拟合?或者,有没有办法使用 Model_A 的错误来告知 Model_B 如何以 Model_B 的优势解决 Model_A 的弱点的方式进行训练?

次要问题:在从这种方法中提取价值方面是否有更好/更差的特定技术或算法?例如,如果有一些 NN 技术天生就可以做这种事情,因此我不会感到惊讶,因此,它们根本不会从这种方法中受益,而相比之下不太灵活的东西(如正则化回归)可能会受益匪浅. 对于希望采用这种方法的人,您还会提供哪些其他想法或建议?

谢谢!

[编辑:我觉得我走进了一家 McMenamins 并向调酒师提出了微型酿酒厂的想法,哈哈!感谢大家非常友好和有益的评论!]

2个回答

正如评论中所注意到的,您重新发现了boosting这种方法没有错,但通常使用已经实现并由其他人经过实战测试的方法比从头开始更容易、更安全。如果您真的想使用您的方法,我鼓励您首先使用一些开箱即用的 boosting 实现(AdaBoost、XGBoost、CatBoost 等)将其用作基准。

正如评论中提到的,这种从以前的模型错误中迭代学习的想法是 Adaboost 或梯度提升等提升方法的核心。

正如你所推测的那样,这个想法很容易在某些模型(如树)中过度拟合,但它实际上正则化了这样一个线性回归的模型(尽管我通常只会像 l2 那样做标准正则化)。就在这方面做得很好的算法而言,通常是树(xgboost 或 lightgbm 是数据科学社区中锤子的首选)或某种划分数据的方法。这是因为每次您重新拟合模型时,您都会获得新的拆分,并且树可以学习新事物,而在线性回归中,它只是更新您的系数,因此您实际上并没有增加任何复杂性或任何东西。添加两个回归模型只是平均系数,但添加两个树模型会给你一棵新树。

这类似于 bagging 预测器,bagging 线性模型将收敛到适合整个集合,而 bagging 树实际上在偏差-方差权衡方面有利于您。

在神经网络方面,我相信有一些理论将梯度提升与残差网络联系起来,类似的架构可以看到这个问题

我的建议是使用 lightgbm 或 xgboost!