将初始估计值(启发式估计)整合到预测模型(机器学习)中我正在开发一个名为“混合搜索”的工具。它运行良好,但我设想对其进行改进,只是目前还不知道如何在技术上实现。
Blend Search 的功能:
>> 输入是一组组件及其属性的集合。
>> 生成成分矩阵
>> 应用启发式方法(简单模型)计算混合物的性质
>> 应用更复杂的模型,目前是提升树模型。其预测变量是启发式估计的混合物的属性,其输出也是混合物的属性。
我制作了一个 Boosted Tree 的可视化图表(见附件视频)。
其中一个预测因子(预测因子 3)已经提供了我的目标属性(预测值)的初步估计。最初的想法是,另外两个预测因子旨在完善这个初步估计。如今,该模型能够提供一致的预测结果;我们很少会偏离预测范围。
但实际上,我修正的并非初始估计值,而是训练集中 Y 值的平均值(即 Boosted Tree 的默认截距)。如果我想扩大混合搜索的规模,这种方法将不再足够稳健。
我希望能够通过修正初始估计值来进行预测。例如,我非常希望我的 Boosted Tree 模型能够拥有可变截距类型。我目前还没有找到合适的解决方案,但我相信肯定已经有一些相关的技术存在。如果您有任何想法,我非常乐意听听您的意见。
预测建模和机器学习回复:将初始估计(启发式)整合到预测模型(机器学习)中你好@RikkiTikkiTavi ,
我不太确定自己是否完全理解算法建模链,但我或许能给你一些启发。有两种方法可以提高预测精度:一种是提升算法(用于减少预测偏差),另一种是集成学习/模型平均算法(用于减少预测方差)。
- 提升方法:如果目标是通过校正偏差(预测平均响应与测量平均响应之间的偏差)来改进目标属性的预测,您可以训练一个机器学习模型,该模型能够根据原始数据和/或估计数据以及目标属性的预测值来预测该目标属性的残差(以便基于原始变量和预测值对误差进行建模)。这将得到一个能够预测提升树中误差的模型,并作为提升树的校正层(通过在提升树的预测值中添加/减去残差预测值)。
我多次使用过这种方法,性能提升非常显著。或许可以考虑使用与预测模型不同的误差建模模型(例如,在你的例子中,使用除Boosted Tree之外的其他模型)。此外,务必使用合适的验证策略(用于与Boosted Tree模型单独比较)和测试策略(用于评估模型在实际应用场景下的性能)对新模型进行全面验证,避免过拟合。为了避免数据泄露的风险,误差模型仅使用预测时可用的数据:预测变量加上目标属性的预测值。
- Bagging/模型平均方法:另一种降低预测方差的方法是并行训练一组模型(除了Boosted Tree模型之外),并取其预测结果的均值或中位数。然而,使用这种方法,实施合适的验证和测试策略至关重要。
选择哪种方法取决于初始 Boosted Tree 模型的性能以及数据中的噪声:如果 Boosted Tree 容易过拟合或数据噪声较大,建议采用 bagging 方法。如果 Boosted Tree 性能不佳且偏差较大(考虑到模型的行为,这种情况似乎不太可能发生,除非使用了特定的参数),则 Boosting 方法会更有效。由于所使用的预测模型(Boosted Tree)本身就采用了 Boosting 方法,因此我可能会优先测试 bagging 类型的集成方法。
希望这些建议能给你带来灵感。
回复:将初始估计(启发式)整合到预测模型(机器学习)中你好@Victor_G ,
我之前已经尝试预测残差(目标属性的实际值与其初始估计值之间的差值)。在训练集上取得了一些改进,但在测试集上却失败了(均方根误差翻了一番)。我的测试集代表了我预期的规模放大;它是由成分差异很大的子集组成,但这些混合物的属性几乎与训练集的属性处于同一范围内。我目前的Boosted Tree模型在测试集上的预测效果相当不错。
模型平均的想法很有意思。我需要找到误差差异足够大的模型来测试这种方法吗?我想我会先尝试 bagging。我知道我的数据噪声很大,而且我估计这种模型比 2 个、3 个、4 个……不同的模型更容易集成到我的混合搜索工具中。
非常感谢您的建议;
回复:将初始估计(启发式)整合到预测模型(机器学习)中你好@RikkiTikkiTavi ,
是的,这种方法的难点在于采用正确的验证策略来避免过拟合(在训练集上有所改进,但在验证数据集上的性能稳定甚至下降)。
根据您对测试数据的描述,我有点担心您可能会遇到领域偏移:模型在训练过程中学习到的输入输出关系可能与测试中实际存在的关系不同。是否可以混合/ 分层训练/验证/测试数据来避免这种偏移(并且测试中只包含规模化数据)?这样可以让模型也获得关于规模化的信息,或许可以通过在训练过程中使用一个新变量来表示(例如,experiment_type:研发/规模化/生产;这取决于不同阶段是否具有不同的截距,从而需要这个变量)。
关于后续流程,以下是一些意见/想法:
- 首先建立训练/验证/测试策略,如果可能的话,根据变量进行分层分割,以确保每个数据集都能涵盖整个实验空间(以确保相关的训练和良好的性能泛化)。
- 在训练提升树(或其他模型)之前,请先建立对比模型:一个基准模型(我推荐随机森林),用于在验证中优于其他模型;以及一个用于评估被测模型性能下限的模型:例如,一个仅“预测”训练集在所有其他数据集(验证集和测试集)上的平均响应值的朴素模型。如果其他模型的性能不如或与该朴素模型相当(例如,均方根误差接近或高于朴素模型),则可能表明数据中相对于信号而言噪声过大、因子信息不足,和/或响应的变异性不足。
- 我还建议测试不同的模型,例如使用模型筛选平台,仅对训练集进行交叉验证。这样就可以选择最有希望的模型并继续进行下一步。
- 根据模型的性能,可以基于训练集对模型进行重新训练,从而比较它们在验证集上的性能,以选择性能最佳的模型。同时,也可以使用模型比较平台,对已通过先前交叉验证训练的选定模型进行模型平均。模型平均的有趣之处在于,它可以根据模型的性能,将具有不同“构建类型”(归纳偏置)的模型(例如基于树的模型,如Boosted Tree、Random Forest或XGBoost)与其他模型(例如多元回归、SVM、高斯过程或小型神经网络)相结合。这些模型应具有良好的个体性能(它们必须能够捕捉到数据中的信号),并且理想情况下,它们的误差率应略有不同(有些模型会高估某些观测值,而另一些模型则会低估它们)。然后,可以使用相同的模型比较平台,通过比较验证集上的性能结果,将这个宏模型与基于训练集重新训练的各个模型进行比较。
- 一旦选定最佳方案(宏观模型或个体模型),就会在测试集上估计性能,以评估模型部署后的行为。
除了随机森林的自然 bagging 之外,还可以对机器学习模型进行bootstrap ,以提高训练中模型的鲁棒性。
希望这些建议对您有所帮助。