2、风控数据体系:数据采集、埋点方案、第三方数据接入、数据清洗与标准化
风控系统跑起来,第一件事是什么?
不是写规则,不是搭模型。是先把数据搞进来。
数据是风控的血液。没有数据,你连用户是谁都不知道,谈什么风险控制?我见过太多团队,一上来就急着上模型,结果数据质量一塌糊涂,模型跑出来的结果根本没法用。说白了,数据体系没搭好,后面全是白费功夫。
2.1 数据采集:从哪里来,怎么来
风控数据来源,我习惯分成三类:
- 用户主动提交的数据:注册信息、身份证、银行卡、联系人等
- 用户行为数据:点击、滑动、停留时长、输入习惯等
- 第三方数据:征信报告、黑名单、设备指纹、运营商数据等
每一类数据的采集方式都不一样。用户主动提交的数据,直接在接口里收就行。行为数据需要埋点。第三方数据要对接外部API。
这里有个坑,我踩过。用户提交的数据,你以为是真的?不一定。很多用户会伪造信息。比如手机号,有人用接码平台注册。身份证号,有人用生成器乱填。所以采集的时候,一定要做基础校验。
核心原则:采集阶段就要做「防伪」设计。不要等到清洗阶段才发现数据是假的,那时候成本就高了。
2.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」。如果不做标准化,同一个手机号在系统里会变成三个不同的值。
数据清洗,我总结为四个步骤:
- 去重:同一个用户重复提交怎么办?用唯一标识(如设备ID、手机号)做去重。
- 格式标准化:手机号统一为11位数字,身份证统一为18位,日期统一为YYYY-MM-DD。
- 异常值处理:年龄填200岁?身份证校验位不对?这些要标记或剔除。
- 缺失值处理:字段为空怎么办?看情况。如果是必填字段为空,直接拒绝。如果是可选字段,可以用默认值或标记为「未知」。
// 手机号标准化示例
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个脏字段强得多。数据质量比数据数量重要一百倍。
嗯,数据体系这块就聊到这儿。记住一句话:数据进得来、存得住、洗得干净,风控系统才能跑得稳。