[特征工程][特征设计]注意时间因素对样本带来的影响


时间对样本的的影响

背景

数据挖掘方面不同于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需要考虑的问题

扩充——方法论

关于问题分析模式

  • 拆解法

将问题划分成一些小问题或者拆解成多个阶段,然后从不同的方面(维度)来回答这个问题,然后再进行组合,也是这次博客针对”时间在数据挖掘问题中的影响“问题进行的分析方法。