[特征工程][特征设计]注意时间因素对样本带来的影响
时间对样本的的影响
背景
数据挖掘方面不同于CV算法,产生的原始数据量非常大,有很多表都是以di结尾的增量表,每天都会更新,这就导致了数据“产生的时间点”,以及模型”预测的时间点“,样本”标签指定的时间“都即为重要,如果不注意就会出现很多问题,由于这段时间工作上遇到了时间相关的问题,所以写一些记录。
模型目标
明确我们要模型学的是什么?
是预测样本今天的状态?
还是预测未来的状态?
对于不同的目标,在构建特征和模型训练都需要注意
样本定义
训练时需要给样本打标签,那么,标签该怎么打?
若标记A样本为正样本,A样本一直是正样本么?A会不会在第二天状态就改变了呢?
如果状态可能发生改变,那么A样本就只能在确定A样本是正样本的那个时间点是正样本,其他不能确定的时间里,只能当作灰样本。
举例
目标:预测输入账号今天是否是其他用户的小号
样本定义1:我们要预测A样本是否是其他用户小号,在不考虑”大号注销“情况下,那么,如果确定A是小号,那么对于A样本而言,这个账号注册以后就定了,要么是大号,要么是小号。
样本定义2:在考虑”大号注销“情况下,只有A确定是某个账号的小号时,我们才能认为这个账号是正样本,否则,就不能认为这个账号是其他账号的小号,因为”大号可能会注销“。
对于样本定义的补充说明:
-
如果我们确认A是某账号的小号了,那么今天的A通过特征构建,作为样本1,明天的A通过特征构建,作为样本2
在训练过程中,样本1和样本2是取最新状态?还是当作不同的样本?还是取注册后的第一次特征构建出的样本?都是需要考虑的问题,我现在的观点是,如果,特征是近X天的统计特征,或者只使用当天的特征的话,这两个样本作为不同的样本参与训练。(如果日后遇到问题,或者有人指出这样有问题的话,我会回来修正这个观点)
特征构建
题外话——问题复现
目前我主要处于这个状态(刚入门,基本每天都在重复踩坑 分析 修正 的问题)
由于我在写HQL的时候没有考虑”标签时间“的影响,导致我得到的样本已经和我的本意相差甚远了。
我利用HQL 先拉出了所有满足条件的用户行为,构成了下面这个表sup_tab
id label_time action_timestamp action_time
之后我需要统计近30天内用户的行为得到下面这个表
id f1_cnt f2_cnt f3_cnt
我的逻辑是
select sum(action_timestamp)
from sup_tab
where action_time between date_sub(label_time,30) and label_time
group by id
如果觉得上面这个没问题,那说明咱们水平差不多
应该修正 group by id 为 group by id , label_time
最后获得的表也应该有 id - label_time - 特征 因为在这个场景中,用户账号是和标签时间捆绑在一起的。
问题剖析
正如我上文提到的,一个用户可能有多个标签时间,统计特征的时候,不仅需要以用户来分组,还需要以标签时间来分组,最后得到的样本是不同的,且均用于训练。
模型训练
数据穿越问题
表现:模型结果非常好,但是验证集上效果较差
原因:训练集,测试集存在交集,训练集
举例:预测X天后的结果,1~N天的样本做训练,N~M天的样本做预测,这导致N~N+X天的样本被偷看,出现问题
(注:这是工作周会分享时同事提到的,并非本人实测,若之后本人遇到此问题,会结合实例,做细节分析。)
模型验证
暂无,目前不是我这个level需要考虑的问题
扩充——方法论
关于问题分析模式
- 拆解法
将问题划分成一些小问题或者拆解成多个阶段,然后从不同的方面(维度)来回答这个问题,然后再进行组合,也是这次博客针对”时间在数据挖掘问题中的影响“问题进行的分析方法。