常常听说数据预处理,后处理相对少见,本篇来说说何时需要后处理,以及后处理的一些简单方法。
数据挖掘的流程一般是:输入数据->特征工程->模型训练/预测->导出结果。后处理是将模型预测的结果进一步处理后,再导出。
先看一个例子:比如我们网购小包装的咖啡,一般的购买习惯是,在少量购买时,需要多少买多少:一包,两包,三包;买的较多的时候,可能是六包,八包,十包;买得更多的情况下,可能是十包,十五包,二十包;再往上是三十包,四十包,五十包,一百包……以此类推。
也就是说:数量大的时候,我们可能更倾向于取整,双数,五的倍数,十的倍数等等。如果不是针对人数买的话,一般不会出现7, 19, 113这样的购买数量。如下图示意:横轴代表购买数量,纵轴代表该数量出现的次数。蓝色为实际购买数据,橙色为预测数据。注意本图是结果y的分布图。
想在模型和预测处理中优化比较困难,因为对于测试集,并不知道预测的结果是多少,于是也无法将它是否靠近2,5,10的倍数作为特征代入模型。
此时可使用后处理,让橙线靠近蓝线,最简单的方法是手写判断语句,例如:如果大于12.5则预测为15等等。但相对比较麻烦,很多边界值需要手动调节,换了数据之后,还需要重新调节。
我想到一种自动处理的方法,还算简单有效,在此分享一下。假设我们预测出购买量是13.5红色点(因为是回归,有可能是非整数)。一般情况下我们会四取五入,得到结果14。下面来看看怎么用算法优化。
先找到它前后的两个点13和14,确定它在图中的位置,即红色的点,然后再从该点到它前后的距离N以内的高点连线(黄色区域限定距离),取其中斜率最大的线所对应的高点,这样兼顾了高度和距离。用此方法,我们将12.5取15。
有时候,我们还要考虑给红点左右的线段分配不同的权重,比如说:如果一共37个人,人手一个,可能会考虑破损,意外,留出余量买到40个,而不会故意少买成35个,导致不够分。在此情况下,只要比较斜率时给右侧线多乘一些权重即可。
还有一种常见情况:有时候做回归,预测不出很大或很少值,所有数值都集中在中部区域,比如之前糖尿病预测的初赛,大家都使用GBDT类模型,很多人都预测不出血糖大于10的,几乎所有结果都在5-8之间。这是由于这种迭代模型,追求的是整体误差最小化,为了保证绝大多数预测正确,就牺牲了人少但血糖高的部分。但实际场景中,如果不能预测高血糖,模型就没用了。后来也有人用了一些后处理方法,即把偏离正常范围值的乘一个系数,手动拉宽预测范围。其实也可以使用类似上述方法的思路解决。
在二分类问题中,一般能得到的是0-1之间的概率值,此时把界限从0.5上移或者下移即可实现后处理。方法很多,这里只是抛砖引玉吧,如果各位有更好的方法,欢迎给我留言。
网友评论