我正忙于预测合同取消的监督机器学习问题。虽然是一个冗长的问题,但我确实希望有人能花时间,因为我相信它会帮助其他人(我只是找不到任何对我有帮助的解决方案)
我有以下两个数据集:
1)“建模数据集”
包含约 40 万份合同(行),具有 300 个特征和一个标签(0 =“未取消”,1 =“取消”)。
每行代表一个合同,每个合同在数据中只表示一次。有 35 万个“未取消”和 5 万个“取消”案例。
特征都是在每个合同的特定日期提取的。该日期称为“生效日期”。对于“已取消”合同,“生效日期”是取消日期。对于“未取消”合同,“生效日期”是 6 个月前的日期。这将在稍后解释。
2)“实时数据集”
包含 300k 个合同(行),具有相同的 300 个功能列表。当然,所有这些合同都是“未取消”的,因为我们想预测其中哪些将取消。这些合同被跟踪了 2 个月,然后我在这个数据中添加了一个标签,以表明它是否真的在这两个月内最终取消:0 =“未取消”,1 =“取消”
问题:
我在“建模数据集”(随机训练/测试拆分)上得到了惊人的结果(例如精度 95%,AUC 0.98),但是一旦将该模型应用于“实时数据集”,它就表现不佳(无法很好地预测哪个合同最终取消)(例如 Precision 50%,AUC 0.7)。
在建模数据集上,结果非常好,几乎与模型或数据准备无关。我测试了许多模型(例如 SkLearn 随机森林、Keras 神经网络、Microsoft GbmLight、SkLearn 递归特征消除)。即使使用默认设置,模型通常也表现良好。我已经标准化了功能。我已经对功能进行了分类,以尝试提高它的泛化程度。没有什么可以帮助它推广到“实时数据集”
我的怀疑:
在我看来,这不是一个过度训练的问题,因为我在“建模数据集”中有一个测试集,并且这些结果在测试集上非常好。这不是建模甚至超参数优化问题,因为结果已经很好了。
我还通过逐个特征地查看直方图,研究了两个数据集之间的特征配置文件是否存在显着差异。没有什么令人担忧的不同。
我怀疑问题出在“建模数据集”中标记为“未取消”的相同合同,模型训练当然识别“未取消”,基本上与“实时数据集”中的合同完全相同,除了现在已经过去了 6 个月。
我怀疑“未取消”案例的特征没有发生足够的变化,现在无法让模型将其中一些案例识别为即将“取消”。换句话说,合约在特征空间中的移动还不够。
我的问题:
首先,我的怀疑听起来正确吗?
其次,如果我已经错误地说明了要解决的问题,那么如果目的是预测合同之类的取消(当您训练的数据几乎肯定包含数据时),我将如何设置问题陈述你想预测)?
作为记录,我在这里使用的问题陈述与其他人这样做的方式相似。他们报告了很好的结果。但我不确定这些模型是否在现实生活中进行过测试。在其他情况下,要解决的问题略有不同,例如酒店预订取消,这是不同的,因为有新的传入预订流并且预订持续时间相对较短,因此建模和实时数据集之间没有共同的预订。另一方面,合同的期限很长,可以随时取消,有时甚至永远不会取消。