第一赛季接近尾声,很多稳进第二赛季的队伍已经没有了压力,但对500名左右的队伍来说却痛苦不堪。这些队伍肯定想了解提升性能的捷径,有的用扫雷、排除法,有的在仔细琢磨学习模型,有的在苦思规则。在我看来这些都是合理的做法,毕竟没进前500,之前一个多月的努力都白费了,尽管学习了一些有用或者无用的方法。
我写这个帖子不是为了告诉大家我采用了什么具体方法,我是如何去过拟合线上数据的。我只想跟大家来分享一下我本地做评测的方式,跟大家探讨一下,抛砖引玉,说不定也能对各位有一点点启发,7%以上的队伍可以绕道。最直接的目的是想帮助大家来合理使用每一次提交的机会。另外,我不会说自己用的模型以及代码,还请谅解。我主要针对使用分类或者回归模型的本地评测方法发表个人看法。
建立本地测试协议。这类模型本地都要有测试数据集合以及训练数据集合。我在构建的时候非常注意以下几点:1) 每一种集合的特征与标签(连续是回归,离散是分类)的获得,都不能采用时间上有交集的数据。2)测试集合的标签来源数据,一定是在训练集合以及测试集合特征没有用到的时间段里。3)两个集合要做到时间长度的相近。如果在本地能做到这样的协议,已经完成了防止过拟合的第一步。
(这里所说的过拟合是指本地测试明显好于线上测试,稍微专业点就是训练误差明显小于测试误差,再进一步讲就是模型的泛化能力很差。)
接着说,如果我们能提取自己设计的特征和标签,用于学习某个分类或者回归模型,也在本地测试集合上获得了所有测试样本的分值,那么又为本地的评测做了进一步的准备。下一步要做的就是如何在本地根据真实的测试标签评测,这里,又要做到以下几点(不好意思,有点麻烦):1)请不要过滤标签中出现而特征中没有出现过的数据,这样做是为了模拟线上环境中有未知〈用户,品牌〉对存在的情况。2)在特征设计好的前提下,请坚持在一种模型上调优(如果你已有6%以上性能,更要坚持;这里我有点偏执,总想把某个模型做到最好)。
重点。我采用的评价方式无外乎两种,PR曲线和F值曲线。讲评测之前你需要知道的是,所有的分类或回归模型都是可以对结果打分的,这个不仅可以用于排序,也可以用于样本选择(这个不展开,可以去参考的资料很多)。1)PR曲线。这个是最基础的评价模型好坏的方式,简单的说这个曲线越往右上角越好;你也可以根据这个曲线来获得高精度的样本,与其他结果复合。2)F值曲线。这个曲线很重要,它是通过本地截断阈值获得不同购买数而产生的,即横坐标是购买数,纵坐标是F值。相信有很多队伍都是在本地测试时固定一个购买数(或自适应购买数),然后看这次的F值是不是比上次的好,如果好,就取一个合适的购买数目提交了;这样做很容易过拟合,因为线上的购买数目与本地的差异很大。而我在这块采用的方式与这种方法不一样。我是看这次的F值曲线是否完全在上次的上方,并且曲线是否平缓变化来判断模型好坏的。这么做的原因是要尽量做到不让F值随购买数目剧烈变化,这样的模型泛化能力才好。如果你本地的购买数刚好取在这个曲线的一个峰值上而其他曲线部分下降明显,就会导致本地结果的虚高。我也是在做了三个虚高结果(本地取1500个购买与测试集合比较,获得6.5%+,线上才5.4%)的提交以后才开始反思这个问题的。
以上所有的是本地防止过拟合的方法,在线上看模型好坏,我的方法如下。我每个模型都使用相同的提交数目,比如3000。要是模型好,自然在相同提交数目下的定量结果会好。而很多队伍是这样做的:当提交结果的精度高于召回的时候,就提升下购买数目,性能就能提升,然后就拿这个模型没办法了,感觉到上限了就立马转战另一个。的确,是可以这样的,但在没有把模型做到最好的时候,我不倾向于每次都试着去改变数目,因为这样浪费了一次提交。
如果你一开始的模型能到6.1%、6.2%,用我的方法初步尝试几种常用机器学习模型(学会快速上手也是种能力,碰到不熟悉的模型就静下心来琢磨,别管别人说它好坏,因为所有模型都有人做到6.9%+),应该能找到一个6.5%左右的模型。然后请在这个模型上发力。仔细的调试模型(学习率,正负样本惩罚,容错性,迭代次数,同一模型多次结果融合(提升稳定性,但并不一定优于单模型),正负样本采样),我相信用这些方式你一定能到6.6%-6.7%。然后呢,还是进不了前500。这时候你就可以考虑增加有用的特征,减少不重要特征(这个是个人能力,会有运气成分)。如果通过这个你做到了6.7%-6.8%,刚好在500名的线上,可能还是进不了第二赛季,怎么办?你还记得我们只交了3000个吗?个人经验是在3400左右会达到性能的峰值,这个跟线上3500个购买数有关。那么剩余还没有推荐的400个,就看自己发挥了,线上精度高,多提交些购买;精度召回差不多,再回过头来看开篇:规则,排除,扫雷三步走。
我用这个方法线上结果(单模型,提交数固定)如下:
6.5->6.7->6.8->6.9+
本地结果靠眼睛观察曲线,选择好的然后提交。基本与线上结果成正比。另外,不要每天想着提升,每天都要交结果。静下心来花一晚上遍历下参数或者跑n个模型,再选择结果更好的上交也是事半功倍的。要是引导错误请大家谅解。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。