2. 数据源与数据采集:催收系统数据源与外部数据源

催收触达特征工程的第一步是明确数据从哪里来、怎么采、采什么。数据源的质量直接决定后续特征筛选的上限。本章将系统梳理催收场景下的两类核心数据源——催收系统内部数据与外部数据源,并给出数据采集的规范与注意事项。

2.1 催收系统数据源

催收系统内部数据是触达特征最直接、最高频的来源,主要包括通话记录、短信记录和 IVR 记录三大类。

数据源 核心字段 特征价值
通话记录 主叫号码、被叫号码、通话开始/结束时间、通话时长、挂断方、录音 ID、呼叫结果(接通/未接通/拒接/忙音) 触达频次、通话时长分布、时段偏好、接通率、失联判断
短信记录 发送号码、接收号码、发送时间、短信类型(通知/催收/验证码)、发送状态(成功/失败/退订)、短信内容摘要 触达渠道偏好、响应率、退订率、内容有效性
IVR 记录 呼叫时间、按键选择、播放节点、挂断节点、是否转人工、IVR 路径序列 自助交互行为、意图识别、转人工率、触达深度
实践提示:通话记录中的“挂断方”字段常被忽略,但它是判断债务人意愿的重要指标——债务人主动挂断 vs 催收员挂断,在特征工程中应分别编码。

2.2 外部数据源

外部数据源用于补充内部数据无法覆盖的风险画像和关联信息,是提升催收模型泛化能力的关键。

  • 征信数据:个人征信报告中的逾期历史、负债率、查询次数、信贷产品类型等。注意征信数据有严格的查询授权和时效要求,通常按 T+1 或 T+7 更新。
  • 黑名单数据:包括行业共享黑名单、法院失信被执行人名单、反欺诈名单等。黑名单匹配需支持模糊匹配(姓名+身份证号+手机号多维度交叉)。
  • 关联人数据:通过外部数据源获取的紧急联系人、通讯录关联人、同住地址关联人等,用于失联修复和触达网络构建。
  • 设备与行为数据:设备指纹、IP 地址、GPS 定位、APP 活跃度等,用于识别多头借贷、设备关联风险。
合规红线:外部数据采集必须遵守《个人信息保护法》和《征信业管理条例》。征信数据仅能用于贷后管理目的,不得用于其他商业用途;黑名单数据需确认数据来源合法,避免使用爬虫或非法交易数据。

2.3 数据采集规范与注意事项

数据采集不是简单的“把数据拿过来”,而是需要建立一套标准化的采集规范,确保数据的一致性、完整性和可回溯性。

2.3.1 采集规范清单

规范项 具体要求
字段命名 统一采用 snake_case,如 call_start_time、ivr_path_seq
时间格式 统一为 ISO 8601:YYYY-MM-DD HH:mm:ss,时区固定为 UTC+8
缺失值处理 数值型默认 -1,字符型默认 'UNKNOWN',时间型默认 '1970-01-01 00:00:00'
数据版本 每次采集需记录 batch_id 和采集时间戳,支持数据回滚
去重规则 以 (case_id, contact_phone, call_time) 为唯一键去重
敏感信息脱敏 手机号中间 4 位脱敏,身份证号只保留前 6 后 4

2.3.2 常见采集陷阱与避坑

  • 时间窗口不一致:通话记录按事件时间采集,征信数据按日更新,两者在特征拼接时容易出现时间错位。建议统一以“催收作业日期”为时间锚点。
  • 重复采集与数据膨胀:IVR 记录中同一通电话可能产生多条子记录(按键、转接、挂断),需在 ETL 阶段做聚合,避免特征维度爆炸。
  • 外部数据延迟:黑名单数据通常有 1~3 天延迟,征信数据延迟更长。在特征工程中必须加入“数据新鲜度”字段,避免使用过时数据做实时决策。
  • 采集失败处理:外部接口调用可能超时或返回空值,需设计重试机制和默认值策略,防止下游特征计算中断。
案例:某催收团队在特征筛选时发现“IVR 按键次数”特征效果极差,排查后发现是采集时只记录了最后一次按键,忽略了中间按键序列。修正为完整路径序列后,该特征 AUC 提升 0.03。

2.4 数据源架构与采集流程

下图展示了催收触达特征的数据源架构与采集流程,帮助理解数据从产生到进入特征工程的全链路。

催收触达数据源架构与采集流程 催收触达数据源架构与采集流程 催收系统内部数据 通话 / 短信 / IVR 外部数据源 征信 / 黑名单 / 关联人 设备与行为数据 设备指纹 / IP / GPS 数据采集层(ETL / API / 消息队列) 定时批量采集 + 实时流式采集 数据清洗与规范化(去重 / 脱敏 / 格式统一) 缺失值填充 / 时间对齐 / 敏感信息脱敏 数据存储(数据湖 / 数据仓库 / 特征存储) 按 batch_id 分区,支持版本回溯

2.5 数据采集代码示例(伪代码)

以下是一个简化的数据采集调度伪代码,展示如何从催收系统拉取通话记录并写入特征存储。

# 伪代码:催收通话记录采集调度
def collect_call_records(batch_date):
    """
    采集指定日期的通话记录
    :param batch_date: str, 格式 'YYYY-MM-DD'
    :return: DataFrame
    """
    # 1. 从催收系统 API 拉取数据
    raw_data = call_system_api.get_records(
        start_time=f"{batch_date} 00:00:00",
        end_time=f"{batch_date} 23:59:59",
        fields=["case_id", "agent_id", "contact_phone", 
                "call_start", "call_end", "call_result", "hangup_side"]
    )
    
    # 2. 字段重命名与格式统一
    df = raw_data.rename(columns={
        "call_start": "call_start_time",
        "call_end": "call_end_time"
    })
    df["call_start_time"] = pd.to_datetime(df["call_start_time"])
    df["call_end_time"] = pd.to_datetime(df["call_end_time"])
    
    # 3. 缺失值处理
    df["hangup_side"] = df["hangup_side"].fillna("UNKNOWN")
    df["call_result"] = df["call_result"].fillna("UNKNOWN")
    
    # 4. 敏感信息脱敏
    df["contact_phone"] = df["contact_phone"].apply(
        lambda x: x[:3] + "****" + x[7:] if len(x) == 11 else x
    )
    
    # 5. 添加批次标识
    df["batch_id"] = f"BATCH_{batch_date}"
    df["collect_timestamp"] = datetime.now()
    
    # 6. 写入特征存储
    feature_store.write(df, table="call_records", partition="batch_date")
    
    return df.shape[0]  # 返回采集记录数
工程建议:生产环境中建议使用 Apache Airflow 或 DolphinScheduler 编排采集 DAG,设置依赖检查和失败重试。对于外部数据源,建议增加“数据质量检查节点”,校验记录数、空值率、时间连续性等指标,不达标时自动告警并阻断下游特征计算。