学习
实践
活动
工具
TVP
写文章

数据挖掘之

 常常听说数据预处理,后处理相对少见,本篇来说说何时需要后处理,以及后处理的一些简单方法。

 数据挖掘的流程一般是:输入数据->特征工程->模型训练/预测->导出结果。后处理是将模型预测的结果进一步处理后,再导出。

 先看一个例子:比如我们网购小包装的咖啡,一般的购买习惯是,在少量购买时,需要多少买多少:一包,两包,三包;买的较多的时候,可能是六包,八包,十包;买得更多的情况下,可能是十包,十五包,二十包;再往上是三十包,四十包,五十包,一百包……以此类推。

 也就是说:数量大的时候,我们可能更倾向于取整,双数,五的倍数,十的倍数等等。如果不是针对人数买的话,一般不会出现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上移或者下移即可实现后处理。方法很多,这里只是抛砖引玉吧,如果各位有更好的方法,欢迎给我留言。

搜索添加公众号:算法学习分享

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180602G0ZZLG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券