风控系统之指标回溯,历史数据重跑

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


回顾

默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法。

其中已经介绍了如何利用rediszset结构完成指标计算,为了方便这篇文章的介绍,还是在正式开始本篇之前回顾一下。

时间窗口

zsetredis中的一种数据结构,表示有序集合,正因此我们可以利用其做时间窗口来计算指标,value为事件标识,score为事件时间戳。

如下图表示次数、关联、求和类型各两条指标在时间窗口下随着时间分布,其中的黑点也就是事件,散列且线性的分布在时间窗口中。

image

指标字段

关于指标我们需要哪些配置?

来看指标字段有哪些:

  • type:指标类型,有次数计算、关联次数、最大值、最小值、求和等等
  • calcField:计算字段,必须为数值类字段,而且仅用于计算类指标,如次数统计类指标计算的就是事件本身,不需要设置计算字段
  • winSize:窗口大小,与其讲是窗口大小不如说是窗口单位,取值有M/d/H/m/s,表示月/天/时/分/秒
  • timeSlice:时间片,与窗口大小对应,单位为秒
  • winCount:窗口数量,与窗口大小组合起来是整个指标计算的窗口大小
  • winType:窗口类型,目前取值只有last/cur,表示最近或是当前
  • masterField:主字段,如:计算某客户登录次数,主字段就是客户唯一标识
  • salveFields:从字段们,可以是多个,如:计算客户在某设备的登录次数,主字段是客户唯一标识,从字段是设备唯一标识
  • sceneType:场景类型
  • scenes:场景,与场景类型组合起来用于隔离的指标

计算流程

1、对于未知的输入,根据指标配置计算。

如下图,未知的事件经过指标计算在指标时间窗口上记录。

image

2、时间窗口记录事件,并设置过期时间。

如下图,横轴表示时间,黑色的点是已有事件记录,竖线表示当前时间,红色是当前这笔事件的记录。

因为Redis只能给整个key设置过期时间,所以要整体上要设置过期时间。如果前面配置的窗口类型winTypelast,表示最近,那么设置的过期时间就是timeSlice*winCount;如果设置的是cur,标识当前,那么设置的过期时间就是timeSlice

image

3、窗口移动并计算结果。

如下图,竖线表示当前时间,红框表示窗口,根据指标类型计算窗口内事件的值就好。

image

问题

已知指标都是随事件的发生实时计算而来的,指标的一些字段是一次创建后不可更改的,如上梳理的type:指标类型、calcField:计算字段、winSize:窗口大小、timeSlice:时间片、winCount:窗口数量、winType:窗口类型、masterField:主字段、salveFields:从字段们、sceneType:场景类型、scenes:场景,都是一次创建不可更改的,因为一旦修改了其中的字段数据相对就不准确了。

由此会产生一个严重的问题,两种场景下都会出现很大问题。

1、新创建的指标并不能及时使用

因为新创建的指标并没有任何数据,这时并不能用。什么意思?如我需要设置一个规则“最近90天没有登录的账号要进行一次短信验证”,那么我设置的一个指标是“最近90天账号登录次数统计”,设置规则为“最近90天账号登录次数统计”为空则决策结果为“短信验证”。这个新的指标并没有跑已有数据,那么这就是不准确的,直接上线指标那么全部账号都将会多一次短信验证,短信产生的费用不讲,用户带来的体验也是很差的。

2、修改已有指标会错误

对于已有的指标通常都会设置不允许更改的字段,如上,这个并不需要过多解释了。那么如果已有的指标设置错了,但又不可更改,那么这个问题又回到上面了👆

所以,总结问题的解决方案就是:对于新增和修改的指标能支持对已有数据的重跑。

正向计算

正向计算就是和普通的流式实时动态计算没有差别,虽然将是这么讲,但是其实涉及到的是整体数据存储的设计考验。前面很多篇文章也讲了,风控数据最终会通过Kafka存储在ElasticSearch中,所以数据是有的,关键是怎么取,在何时跑数据。

另外的问题随之产生了,如何避免对生产数据的影响并保证指标的准确性。

如:刚刚创建的指标“最近90天账号登录次数统计”想要对历史数据重跑。

如下,指标创建时间触发了历史数据重跑,那么就是对于历史90天的数据进行重跑计算指标,开始时间和结束时间就是[T-90day,T]需要注意此时指标状态要保证不参与生产任务,不然数据会更乱。

生产任务不会因为你重跑而停止啊!假如在指标重跑完成也就是图中T+x的时候,其实生产已经跑到了T+n,那么指标数据还是少了n的这段时间,怎么办?

image

其实我上面埋了一个小坑。

就是这句话“需要注意此时指标状态要保证不参与生产任务,不然数据会更乱”,其实这句话并不是没有道理,很合理。但是其实是可以放开的,啊?为啥呀?

如下,重跑任务和上面一样其实也只是蓝色的部分,但是如果放开了指标产于生产任务,那么指标就和生产任务步调一致,不会有差别。已有数据只是迁移,本身就和生产有时间差,而且记得我们的计算方法吗?RedisZset啊,Set啊!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

反向查询

本来我还以为这是一条可行的路,但是细致思考后,好像确认了,这是一条不可行的路。

上面的图我用一下,可以知道生产数据是未知的,不管是指标还是后面的Kafkaes存储,都是为了结构化数据,其实感觉编程的本质都是这样🤤

那么既然对已有结构化数据的查询会不会对于历史数据重跑意义更大,而且更简单呢?

image

还是这个指标“最近90天账号登录次数统计”,我直接按照指标配置的条件查历史数据将数据塞到指标里不是更简单?

的确如此,查询要比生产任务跑出来的指标更直观且简单。

关键的问题在于问题的关键!😂

还是那句话数据是未知的!如果已经指标需要计算的账号,那么查询历史数据就好,但是问题根本就不知道要计算的账号和条件。如果要通过查询的方式,那就必须对要计算的目标先搞清楚,但是本身指标就是多变的不确定的东西就更难搞了。

也许讲的有些抽象,具体一点吧。“最近90天账号登录次数统计”中账号就是未知的${账号},如果要计算那么就要先从历史数据确定90天内有记录的账号,然后才是查询历史数据这些账号有多少次登录,塞进指标里。

注意这还只是因为“最近90天账号登录次数统计”指标设置的比较简单,要是遇到计算字段、主字段+从字段、还有很多变量的,很难有一套统一的方法计算的。

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端基础面试题·第三篇——JavaScript(其一)

1.JavaScript数据类型与运算符 数据类型 原始数据类型: 1.Number 2.String 3.Boolean 4.undefined 5.null 6.Symbol 7.bigint 复杂数据类型: 1.Function 2.非函数: Array: 数组 Object: 对象 Date: 日期 RegExp: 正则 Map: 映射 Set: 集合 …

word中怎么快速选中光标之前或之后的全部内容?

在Word中,快速选中光标之后的全部内容的快捷键:Ctrl Shift End; 在Word中,快速选中光标之前的全部内容的快捷键:Ctrl Shift Home。 在Word中,选取的快捷键如下。 一、选定整个文本: 1&#…

Cozer必备!一站式解锁扣子全网最全插件集锦(五)

俗话说,工欲善其事必先利其器! 用过Coze的朋友都知道,插件在Coze里的重要性。插件库就相当于武器库,一个好的插件,就相当于一件趁手的兵器,可以让你事半功倍! 程哥精心整理了Coze最常用和好用…

spring cloud openFeign

1:Intellij 新建 项目 order-service 2:pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&q…

golang学习笔记02——gin框架及基本原理

目录 1.前言2.必要的知识3.路由注册流程3.1 核心数据结构3.2 执行流程3.3 创建并初始化gin.Engine3.4 注册middleware3.5 注册路由及处理函数&#xff08;1&#xff09;拼接完整的路径参数&#xff08;2&#xff09;组合处理函数链&#xff08;3&#xff09;注册完成路径及处理…

精通Java微服务

第1章 微服务是在面向服务架构SOA的基础上进一步发展而来的&#xff0c;它比SOA做得更加彻底&#xff0c;其单体服务被更加彻底地划分&#xff0c;最大限度地实现了服务的单一职责。 1.1.2互联网 即计算机网络&#xff0c;连接了世界上数以万计的计算机设备&#xff08;可联…

15、Django Admin添加自定义字段功能

修改模型类HeroAdmin admin.register(Hero) class HeroAdmin(admin.ModelAdmin):change_list_template "entities/heroes_changelist.html"... # 此处原代码不动&#xff0c;只增加此前后代码def get_urls(self):urls super().get_urls()my_urls [path(immort…

最新版 | SpringBoot3如何自定义starter(面试常考)

文章目录 一、自定义starter介绍二、自定义Starter的好处及优势三、自定义starter应用场景四、自定义starter1、创建autoconfigure的maven工程2、创建starter的maven工程3、在autoconfigure的pom文件中引入MyBatis的所需依赖4、编写自动配置类MyBatisAutoConfiguration5、编写i…

pdf文件编辑器有哪些?分享适合新手用的5个PDF编辑器(解锁教程)

pdf是一种通用文件格式&#xff0c;也是一种夸操作系统平台的文件格式。 好用的PDF文件编辑器可以让您更改和添加文本、编辑图像、添加图形、签署签名、填写表单数据等。下面整理了关于pdf文件编辑方法介绍&#xff0c;以及一些好用的pdf编辑器&#xff0c;有需要的可以了解下…

JavaScript初级——Navigatior

1、Navigator 代表当前浏览器的信息&#xff0c;通过该对象可以来识别不同的浏览器。 2、由于历史原因&#xff0c;Navigator 对象中的大部分属性已经不能帮助我们是被浏览器了。 3、一般使用 userAgent 来判断浏览器的信息。 4、 userAgent 是一个字符串&#xff0c;包含有用来…

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中&#xff0c;如果我们不需要使用默认边框设计自己个性化的窗体&#xff08;FromBorderStylenone时&#…

LEAN 类型理论之注解(Annotations of LEAN Type Theory)-- 商类型(Quotient Type)

商类型&#xff08;Quotient Type&#xff09;&#xff0c;也称划分类型&#xff0c;通过给定义一个定义在某一类型 α 上的关系R&#xff1a;α → α→ ℙ&#xff0c;将类型α 中&#xff0c;满足关系R的元素摘出来&#xff0c;组成该商类型&#xff08;Quotient&#xff09…

2024国赛数学建模C题完整论文:农作物的种植策略

农作物种植策略优化的数学建模研究&#xff08;完整论文&#xff0c;持续更新&#xff0c;大家持续关注&#xff0c;更新见文末名片 &#xff09; 摘要 在本文中&#xff0c;建立了基于整数规划、动态规划、马尔科夫决策过程、不确定性建模、多目标优化、相关性分析、蒙特卡洛…

20:HAL--RNG

一&#xff1a;RNG 伪随机数就是rand函数产生的数。 F1系列的没有RNG,使用本次说的都是F407的&#xff0c;我使用的是STM32F407VET6 B&#xff1a;框架 C&#xff1a;寄存器 /*RNG_SR寄存器的DRDY位*/ while ((__HAL_RNG_GET_FLAG(&rng_handle, RNG_FLAG_DRDY) RESET) …

Oracle start with connect BY 死循环

解决办法 检查start with前有没有where条件&#xff0c; 如果有的话&#xff0c;套一层select&#xff0c;再 Oracle start with connect BY

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说&#xff0c;类似于 calcHist&#xff0c;在每个位置 (x, y)…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr&#xff08;Replication Manager&#xff09;是一个专为 PostgreSQL 设计的开源工具&#xff0c;用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序&#xff0c;简化了 PostgreSQL 复制集群的配置、维护和故障…

CSS解析:定位和层叠上下文

许多开发人员对定位的理解很粗略&#xff0c;如果不完全了解定位&#xff0c;就很容易给自己挖坑。有时候可能会把错误的元素放在其他元素前面&#xff0c;要解决这个问题却没有那么简单。 一般的布局方法是用各种操作来控制文档流的行为。定位则不同&#xff1a;它将元素彻底…

虚幻地形高度图生成及测试

虚幻地形高度图生成及测试 虚幻引擎地形系统将高度数据存储在高度图中&#xff0c;这是一个灰阶图像&#xff0c;使用黑白色值来存储地貌高程。在高度图中&#xff0c;纯黑色值表示最低点&#xff0c;纯白色值表示最高点。支持16位灰阶PNG、8位灰阶r8及16位灰阶r16格式。 本文…

华为 HCIP-Datacom H12-821 题库 (8)

有需要题库的可以看主页置顶 1.在 DHCP 运行过程中&#xff0c;如果客户端 IP 地址在相约过去 87.5%还没有完成续约的话&#xff0c;客户将发送什么报文进行再次续约&#xff1f; A、DHCP discover 广播报文 B、DHCP release 单播报文 C、DHCP request 广播报文 D、DHCP reques…