3. 风控特征分类体系:基础身份特征、行为特征、交易特征、设备指纹特征、外部征信特征

在风控建模中,特征的质量与分类直接决定模型的上限。本章将风控特征划分为五大类:基础身份特征、行为特征、交易特征、设备指纹特征和外部征信特征。每一类特征在刻画用户风险画像时承担不同角色,且其数据源、计算方式、更新频率与Spark处理策略均有显著差异。

核心原则:特征分类不仅是标签管理的基础,更是Spark分层存储(ODS/DWD/DWS/ADS)与样本抽样策略的前置决策依据。不同类别的特征在时效性、稀疏度、稳定性上差异巨大,必须采用差异化的ETL与存储方案。

3.1 五类特征全景图

下表从数据来源、典型字段、更新频率、Spark处理模式四个维度对比五类特征,帮助你在实际项目中快速定位特征归属。

特征类别 数据来源 典型字段示例 更新频率 Spark处理模式
基础身份特征 用户注册信息、实名认证 年龄、性别、职业、学历、注册时长 低频(月/季度) 宽表Join,缓慢变化维(SCD)
行为特征 App/Web埋点日志 登录频次、页面停留时长、点击路径 高频(分钟/小时) 窗口聚合(Structured Streaming)
交易特征 交易流水、支付系统 交易金额、频次、对手方、时段分布 实时/准实时 微批处理 + 状态管理
设备指纹特征 SDK采集、设备信息 IMEI、MAC、IP、设备型号、Root状态 事件触发 MapOnly + 去重合并
外部征信特征 第三方征信机构、黑名单 征信分、逾期记录、多头借贷数 按需/日级 外部API调用 + 缓存回填
实战提示:在Spark分层架构中,基础身份特征通常存储在DWD层(维度退化),行为与交易特征在DWS层做轻度聚合,设备指纹特征在ODS层做原始去重,外部征信特征则通过UDF或外部数据源接口在ADS层实时拼接。

3.2 特征分类体系结构图

下图展示了五类特征在风控体系中的层级关系与数据流向。基础身份特征作为静态锚点,行为与交易特征构成动态行为画像,设备指纹特征提供环境可信度,外部征信特征补充第三方视角。

风控特征分类体系结构图 风控特征体系 基础身份特征 行为特征 交易特征 设备指纹特征 外部征信特征 特征分类与Spark分层映射: • 基础身份特征 → DWD层(维度表,缓慢变化维处理) • 行为特征 / 交易特征 → DWS层(轻度聚合,窗口计算) • 设备指纹特征 → ODS层(原始去重,MapOnly) • 外部征信特征 → ADS层(API回填,缓存加速)

3.3 各类特征详解与Spark处理要点

3.3.1 基础身份特征

基础身份特征是用户最稳定的属性,通常来自注册信息或实名认证。这类特征变化频率极低,但缺失率可能较高。在Spark中建议采用缓慢变化维(SCD Type 2)策略,保留历史版本。

  • 典型字段:年龄、性别、职业、学历、注册渠道、注册时间
  • Spark处理:使用DataFrame.join()与用户宽表关联,配合mergeSchema处理新增维度
  • 风险价值:识别身份冒用、年龄异常、职业与收入不匹配
// Spark Scala示例:基础身份特征宽表构建
val userBaseDF = spark.read.parquet("dwd/user_base_info")
val userRegDF = spark.read.parquet("dwd/user_registration")
val userIdentityDF = userBaseDF.join(userRegDF, Seq("user_id"), "left")
  .select("user_id", "age", "gender", "occupation", "reg_channel", "reg_time")
userIdentityDF.write.mode("overwrite").parquet("dws/user_identity_features")

3.3.2 行为特征

行为特征反映用户在产品内的交互模式,是识别异常行为的重要信号。由于数据量巨大且实时性要求高,Spark通常采用Structured Streaming进行滑动窗口聚合。

  • 典型字段:登录频次(1h/24h)、页面停留时长、点击转化率、功能使用深度
  • Spark处理:窗口函数 + groupBy(window, userId),输出到Kafka或HBase
  • 风险价值:检测爬虫、薅羊毛、账户共享等异常行为模式
// Spark Structured Streaming示例:实时行为特征聚合
val behaviorStream = spark.readStream
  .format("kafka")
  .option("subscribe", "user_behavior")
  .load()

val behaviorAgg = behaviorStream
  .selectExpr("CAST(value AS STRING) as json")
  .select(from_json($"json", schema).as("data"))
  .groupBy(window($"data.timestamp", "1 hour", "10 minutes"), $"data.user_id")
  .agg(count("*").as("login_count_1h"))

behaviorAgg.writeStream
  .outputMode("update")
  .format("console")
  .start()

3.3.3 交易特征

交易特征是风控模型最核心的输入之一,直接反映资金流动风险。交易数据具有高维度、高稀疏、强时序性的特点,Spark需要处理状态管理与复杂事件处理(CEP)。

  • 典型字段:交易金额、交易频次、对手方数量、交易时段、首笔交易时间
  • Spark处理:使用mapGroupsWithState维护用户交易状态,或使用flatMapGroupsWithState实现自定义聚合
  • 风险价值:识别洗钱、盗刷、套现、异常大额交易
注意:交易特征在Spark中容易产生数据倾斜(如大额交易用户),建议对user_id进行加盐处理或使用广播变量优化Join操作。

3.3.4 设备指纹特征

设备指纹特征用于识别用户使用的设备环境,是反欺诈的重要防线。设备信息通常由SDK采集,数据格式多样,Spark处理重点在于去重与关联。

  • 典型字段:IMEI、IDFA、MAC地址、IP、设备型号、操作系统版本、Root/越狱状态
  • Spark处理:MapOnly作业,使用dropDuplicates("device_id")去重,关联IP地理信息库
  • 风险价值:检测设备农场、模拟器、IP代理、设备篡改
// Spark Scala示例:设备指纹去重与IP解析
val deviceRawDF = spark.read.json("ods/device_fingerprint")
val deviceCleanDF = deviceRawDF
  .dropDuplicates("device_id")
  .withColumn("ip_geo", ipToGeoUDF($"ip"))
deviceCleanDF.write.mode("overwrite").parquet("dwd/device_fingerprint_clean")

3.3.5 外部征信特征

外部征信特征来自第三方数据源,如央行征信、百行征信、黑名单库等。这类特征通常需要API调用或离线文件导入,Spark处理时需注意缓存策略与数据一致性。

  • 典型字段:征信评分、逾期次数、多头借贷数、黑名单命中标记
  • Spark处理:使用mapPartitions批量调用外部API,配合Redis或本地缓存减少重复请求
  • 风险价值:补充用户信用画像,识别多头借贷、老赖、欺诈团伙
// Spark Scala示例:外部征信API批量调用(mapPartitions)
val userListDF = spark.read.parquet("dws/user_base_features")
val creditDF = userListDF.mapPartitions { iter =>
  val apiClient = new CreditApiClient()
  iter.map { row =>
    val userId = row.getAs[String]("user_id")
    val creditScore = apiClient.getCreditScore(userId)
    (userId, creditScore)
  }
}.toDF("user_id", "credit_score")
creditDF.write.mode("overwrite").parquet("ads/user_external_credit")

3.4 特征分类在Spark分层中的落地策略

将五类特征映射到Spark分层架构(ODS/DWD/DWS/ADS)中,可以最大化计算效率与存储性价比。下表给出推荐映射关系:

分层 存储特征类别 存储格式 分区策略 生命周期
ODS 设备指纹原始日志、行为原始日志 Parquet + Snappy 按天/小时分区 7天
DWD 基础身份特征、设备指纹清洗后特征 Parquet + Zstd 按天分区 30天
DWS 行为聚合特征、交易聚合特征 Parquet + Zstd 按天 + 用户哈希 90天
ADS 外部征信特征、模型宽表 Parquet + 无压缩 按天 + 用户ID 180天
最佳实践:在Spark中为不同特征类别设置独立的存储策略。例如,行为特征使用高频分区(小时级)配合TTL自动清理;基础身份特征使用SCD2保留历史版本;外部征信特征使用Redis缓存层减少API调用次数。

3.5 特征分类对样本抽样的影响

特征分类直接影响样本抽样的策略选择。不同类别的特征在时间窗口、正负样本比例、特征稳定性上存在差异,抽样时必须考虑:

  • 基础身份特征:适合分层抽样(Stratified Sampling),按年龄、性别等维度保持样本分布
  • 行为特征:适合时间序列抽样(Time-based Sampling),避免数据泄露
  • 交易特征:适合过采样/欠采样(SMOTE/随机采样),处理类别不平衡
  • 设备指纹特征:适合聚类抽样(Cluster Sampling),按设备ID分组
  • 外部征信特征:适合权重抽样(Weighted Sampling),根据征信分赋予不同权重