我们主要使用scikit-learn开发机器学习模型。像大多数现实世界的数据一样,我们的训练数据集具有大量(某种程度上)可识别的“不良行”。在这种情况下,BAD主要是由TARGET定义的,相对于功能而言,这是不合理的。但是,我们可以通过几种略有不同的方法来诊断这些难以置信的行,并且没有可用的方便功能“ is_bad_data”:-)。
我们的所有管道在进行培训之前都会进行一定程度的“错误数据过滤”。但是我们对过滤进行了修改,显然没有一个是100%正确的,并且不同的技术会产生不同的误报和误报。
当我们获得新的观察结果时,我们不希望对旧的坏目标进行预测。实际上,如果我们预测不良行中的目标,那么以直观的方式来说,这简直是糟糕的性能。
那么我们如何相互测试我们的各种模型?即应该从“原始”数据还是从“干净”数据(后者不包括初始集中的行)中提取测试集?
不同的管道使用不同的数据清除技术。我们现有的主要指标只是针对原始数据进行测试,而不是在将数据馈送到指标之前执行清除(也不会进行过度采样等)。
一位同事建议,在测试集中使用数据之前对数据进行过滤会更加公平。但是,这大大转移了我们对过滤质量的信心。
在伪代码中,我们的过程如下:
raw = read_dataset()
# Each style earnestly tries to arrive at good data
clean1 = remove_rows(raw, style1)
clean2 = remove_rows(raw, style2)
clean3 = remove_rows(raw, style3)
model0 = ModelClass0().fit(raw.data, raw.target)
model1 = ModelClass1().fit(clean1.data, clean1.target)
model2 = ModelClass2().fit(clean2.data, clean2.target)
model3 = ModelClass3().fit(clean3.data, clean3.target)
测试时间。公平吗?
models = [model0, model1, model2, model3]
# Might score against the raw data
scores0 = BogoMetric(models, raw)
# Or maybe one of the attempts at cleaning
scores1 = BogoMetric(models, clean1)
scores2 = BogoMetric(models, clean2)
scores3 = BogoMetric(models, clean3)
如果有机会根据自己的数据过滤风格进行测试,则不同的模型大概可以发挥最佳性能。这不公平。但是然后,原始数据至少有一些明显错误的行,我们不应该预测。