2、风控数据体系:数据采集、埋点方案、第三方数据接入、数据清洗与标准化

风控系统跑起来,第一件事是什么?

不是写规则,不是搭模型。是先把数据搞进来。

数据是风控的血液。没有数据,你连用户是谁都不知道,谈什么风险控制?我见过太多团队,一上来就急着上模型,结果数据质量一塌糊涂,模型跑出来的结果根本没法用。说白了,数据体系没搭好,后面全是白费功夫。

2.1 数据采集:从哪里来,怎么来

风控数据来源,我习惯分成三类:

  • 用户主动提交的数据:注册信息、身份证、银行卡、联系人等
  • 用户行为数据:点击、滑动、停留时长、输入习惯等
  • 第三方数据:征信报告、黑名单、设备指纹、运营商数据等

每一类数据的采集方式都不一样。用户主动提交的数据,直接在接口里收就行。行为数据需要埋点。第三方数据要对接外部API。

这里有个坑,我踩过。用户提交的数据,你以为是真的?不一定。很多用户会伪造信息。比如手机号,有人用接码平台注册。身份证号,有人用生成器乱填。所以采集的时候,一定要做基础校验。

核心原则:采集阶段就要做「防伪」设计。不要等到清洗阶段才发现数据是假的,那时候成本就高了。

2.2 埋点方案:行为数据的眼睛

埋点,说白了就是在用户操作的地方装个摄像头。

你想想看,用户注册时填了多久?输入密码时有没有复制粘贴?这些行为特征,对风控来说价值巨大。比如正常用户输入身份证号,一般是逐位输入,中间有停顿。但机器批量注册,可能瞬间粘贴进去。这就是一个很好的风险特征。

埋点方案我建议分两种:

  1. 全埋点:所有页面、所有事件都采集。优点是数据全,缺点是量大、成本高。
  2. 关键事件埋点:只采集风控相关的事件。比如注册、登录、修改密码、提现、下单等。

我个人更倾向第二种。全埋点听起来美好,但实际维护起来很痛苦。数据量太大,存储成本高,而且很多数据根本用不上。

我的经验:关键事件埋点 + 自定义属性,基本够用。比如「注册」事件,带上「注册方式」「注册耗时」「是否粘贴」等属性。这样数据量可控,特征也够丰富。

埋点数据怎么传?我建议用异步上报。不要阻塞用户操作。用户点了个按钮,你非要等数据上报成功才让下一步,那体验就太差了。

// 埋点上报示例(伪代码)
function trackEvent(eventName, properties) {
  // 异步上报,不阻塞主流程
  setTimeout(() => {
    fetch('/track', {
      method: 'POST',
      body: JSON.stringify({
        event: eventName,
        props: properties,
        timestamp: Date.now(),
        deviceId: getDeviceId()
      })
    }).catch(err => console.warn('埋点上报失败', err));
  }, 0);
}

2.3 第三方数据接入:借力打力

光靠自己的数据,很多时候不够。比如你要判断一个手机号是不是黑名单,你不可能自己维护全网的数据库。这时候就需要第三方数据。

常见的第三方数据源:

数据类型 典型供应商 用途
征信报告 央行征信、百行征信 信用评估
黑名单 同盾、白骑士 欺诈识别
设备指纹 数美、极验 设备关联分析
运营商数据 三大运营商 身份核验、在网时长

接入第三方数据,有几个要点:

  • 接口稳定性:第三方API挂了怎么办?要有降级方案。我遇到过供应商半夜宕机,导致整个风控流程卡住的情况。从那以后,我要求所有第三方调用必须有超时和熔断机制。
  • 数据延迟:有些数据不是实时的。比如征信报告,可能T+1才能更新。接入时要明确数据的时效性。
  • 成本控制:第三方数据是按次收费的。不是所有请求都要调第三方。可以先用自己的规则过滤一遍,命中高风险了再调第三方验证。

注意:第三方数据接入一定要做「数据对账」。我曾经发现某供应商返回的数据,有5%的字段是空的。如果不做对账,这些空值会悄悄污染你的模型。

2.4 数据清洗与标准化:把脏数据洗干净

数据采集进来了,但能用吗?不一定。

你想想看,用户填的手机号,有人写「138-1234-5678」,有人写「13812345678」,还有人写「+86 138 1234 5678」。如果不做标准化,同一个手机号在系统里会变成三个不同的值。

数据清洗,我总结为四个步骤:

  1. 去重:同一个用户重复提交怎么办?用唯一标识(如设备ID、手机号)做去重。
  2. 格式标准化:手机号统一为11位数字,身份证统一为18位,日期统一为YYYY-MM-DD。
  3. 异常值处理:年龄填200岁?身份证校验位不对?这些要标记或剔除。
  4. 缺失值处理:字段为空怎么办?看情况。如果是必填字段为空,直接拒绝。如果是可选字段,可以用默认值或标记为「未知」。
// 手机号标准化示例
function normalizePhone(phone) {
  // 去掉空格、横线、加号
  let cleaned = phone.replace(/[\s\-\(\)\+]/g, '');
  // 去掉国际前缀
  if (cleaned.startsWith('86') && cleaned.length > 11) {
    cleaned = cleaned.substring(2);
  }
  // 校验长度
  if (cleaned.length !== 11 || !/^1\d{10}$/.test(cleaned)) {
    return null; // 无效手机号
  }
  return cleaned;
}

标准化也很重要。不同系统对同一个字段的定义可能不一样。比如「性别」,A系统用0/1,B系统用M/F,C系统用男/女。接入风控平台时,必须统一成一种标准。

我的做法:建立一份「数据字典」,把所有字段的格式、取值范围、枚举值都定义清楚。新接入的数据源,必须按照数据字典做映射。这样后续做特征工程时,就不用反复处理格式问题了。

2.5 知识体系总览

下面这张图,是我对风控数据体系的整体理解。你可以把它当作本章的思维导图。

风控数据体系 数据采集 埋点方案 第三方数据接入 用户主动提交 · 行为数据 · 第三方 全埋点 · 关键事件埋点 · 异步上报 征信 · 黑名单 · 设备指纹 · 运营商 数据清洗与标准化 去重 → 格式标准化 → 异常值处理 → 缺失值处理 → 数据字典 高质量风控数据 数据是风控的血液,体系化建设是关键

这张图把数据体系的四个核心模块串起来了。数据采集是入口,埋点方案解决行为数据问题,第三方数据接入补充外部信息,最后统一做清洗和标准化。每一步都环环相扣。

一个小建议:刚开始做数据体系时,不要追求大而全。先把最核心的10个字段管好,比管100个脏字段强得多。数据质量比数据数量重要一百倍。

嗯,数据体系这块就聊到这儿。记住一句话:数据进得来、存得住、洗得干净,风控系统才能跑得稳。


专注资料整理