文章

特征工程常用函数详解

特征工程常用函数详解

特征工程常用函数详解

深入理解特征工程中常用的函数(统计特征、类别特征、时间特征等),掌握每个函数的作用、含义和使用场景。从第一性原理出发,理解为什么需要这些函数,以及它们如何帮助我们提取有用信息。

目录

  1. 为什么需要特征函数?
  2. 统计特征函数
  3. 类别特征函数
  4. 时间特征函数
  5. 特征函数的组合使用
  6. 如何选择合适的特征函数?
  7. 特征函数的实际应用

1. 为什么需要特征函数?

1.1 特征函数的本质

定义

特征函数:从原始数据到特征值的转换函数。

核心问题:如何将原始数据转化为模型可理解的特征?

本质需求:从”原始数据”到”特征值”,从”多条记录”到”单个数值”。

信息压缩与模式提取

为什么需要特征函数?

原因1:信息压缩

问题:原始数据包含多条记录,模型需要一个数值。

解决:特征函数将多条记录压缩为一个数值。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
原始数据:
    样本一的活动记录:
    - 记录1:20XX-01-15
    - 记录2:20XX-02-20
    - 记录3:20XX-03-10
    - 记录4:20XX-04-05
    - 记录5:20XX-05-12
    ↓
    5条记录(多条)
    
特征函数:COUNT(活动记录)
    ↓
    特征值:5
    ↓
    1个数值(单个)

原因2:模式提取

问题:原始数据中的模式需要被提取出来。

解决:特征函数提取数据中的有用模式。

例子

1
2
3
4
5
6
7
8
9
10
原始数据:
    样本一的活动间隔天数:[36, 18, 26, 37]
    ↓
    模式隐藏在数据中
    
特征函数:MEAN(间隔天数)
    ↓
    特征值:29.25
    ↓
    提取的模式:平均约一个月一次

原因3:降低学习难度

问题:原始数据可能包含噪声和无关信息。

解决:特征函数提取有用信息,降低模型学习难度。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
原始数据:
    活动时间:[20XX-01-15, 20XX-02-20, ...]
    ↓
    包含噪声:具体的日期可能不重要
    重要的是:频率、规律性等
    
特征函数:COUNT, MEAN(DIFF(...))
    ↓
    提取有用信息:
    - COUNT = 5(频率)
    - MEAN(DIFF) = 29.25(规律性)
    ↓
    模型更容易学习 ✅

1.2 特征函数的作用

作用1:提取有用信息

目的:从原始数据中提取与目标变量相关的信息。

应用

  • 统计特征:频率、平均值、最大值等
  • 类别特征:众数、唯一值数量等
  • 时间特征:差值、趋势等

作用2:降低模型学习难度

目的:让模式更容易被模型发现。

应用

  • 将复杂的原始数据转化为简单的数值
  • 提取关键的统计信息
  • 去除噪声和无关信息

作用3:标准化特征表示

目的:统一特征的表示方式。

应用

  • 所有特征都表示为数值
  • 统一的命名规则
  • 便于特征管理和使用

2. 统计特征函数

2.1 COUNT(计数)

定义

COUNT:统计记录的数量。

公式

1
COUNT = 记录的数量

作用:反映活动频率。

为什么有效?

原理:频率可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
样本一的活动记录:
    - 记录1:20XX-01-15
    - 记录2:20XX-02-20
    - 记录3:20XX-03-10
    - 记录4:20XX-04-05
    - 记录5:20XX-05-12

COUNT(活动记录) = 5

含义:
    - 活动5次
    - 反映了活动频率
    - 频率高可能表示活动频繁
    - 可能与风险相关(频率高 = 风险高?)

适用场景

场景1:计数型特征

应用:统计记录数量。

例子

  • COUNT(活动记录) → 活动次数
  • COUNT(违规记录) → 违规次数
  • COUNT(证件记录) → 证件数量

场景2:频率分析

应用:分析活动频率。

优势:简单直观,容易理解。

2.2 SUM(总和)

定义

SUM:计算数值的总和。

公式

1
SUM = 值1 + 值2 + ... + 值n

作用:反映累计数值。

为什么有效?

原理:总量可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
样本一的交易金额:
    - 交易1:1000元
    - 交易2:2000元
    - 交易3:1500元
    - 交易4:1800元

SUM(交易金额) = 6300

含义:
    - 总交易金额6300元
    - 反映了累计规模
    - 总量大可能表示规模大
    - 可能与风险相关(总量大 = 风险高?)

适用场景

场景1:累加型特征

应用:计算数值字段的总和。

例子

  • SUM(交易金额) → 总交易金额
  • SUM(违规次数) → 总违规次数
  • SUM(间隔天数) → 总间隔天数

场景2:总量分析

应用:分析总体规模。

优势:反映总体情况。

2.3 MEAN(平均值)

定义

MEAN:计算数值的平均值。

公式

1
MEAN = (值1 + 值2 + ... + 值n) / n

作用:反映平均水平。

为什么有效?

原理:平均水平可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
样本一的活动间隔天数:
    - 间隔1:36天
    - 间隔2:18天
    - 间隔3:26天
    - 间隔4:37天

MEAN(间隔天数) = 29.25

含义:
    - 平均约29天一次
    - 反映了平均频率
    - 平均值可以代表典型情况
    - 可能与风险相关(频率高 = 风险高?)

适用场景

场景1:数值型特征

应用:计算数值字段的平均值。

例子

  • MEAN(间隔天数) → 平均间隔
  • MEAN(交易金额) → 平均交易金额
  • MEAN(违规次数) → 平均违规次数

场景2:典型行为模式分析

应用:分析典型的平均水平。

优势:反映典型情况,不受极值影响。

均值 vs 中位数

维度MEAN(均值)MEDIAN(中位数)
定义所有值的平均排序后中间位置的值
异常值影响受异常值影响大不受异常值影响
适用场景数据分布正常时数据有异常值时

选择建议

  • 数据分布正常 → 使用MEAN
  • 数据有异常值 → 使用MEDIAN

2.4 MAX/MIN(最大值/最小值)

定义

MAX:计算数值的最大值。

MIN:计算数值的最小值。

作用:反映极值、范围。

为什么有效?

原理:极值可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
样本一的活动间隔天数:
    - 间隔1:36天
    - 间隔2:18天
    - 间隔3:26天
    - 间隔4:37天

MAX(间隔天数) = 37
MIN(间隔天数) = 18

含义:
    - 最长间隔37天
    - 最短间隔18天
    - 反映了范围
    - 范围大可能表示不稳定
    - 可能与风险相关(不稳定 = 风险高?)

适用场景

场景1:数值型特征

应用:获取数值字段的极值。

例子

  • MAX(间隔天数) → 最长间隔
  • MIN(间隔天数) → 最短间隔
  • MAX(交易金额) → 最大交易金额

场景2:范围分析

应用:分析数据的范围。

优势:识别极值和异常值。

2.5 STD(标准差)

定义

STD:计算数值的标准差。

公式

1
STD = √(Σ(值i - 均值)² / n)

作用:反映离散程度、稳定性。

为什么有效?

原理:离散程度可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
样本一的活动间隔天数:
    - 间隔1:36天
    - 间隔2:18天
    - 间隔3:26天
    - 间隔4:37天

MEAN = 29.25
STD = 8.5

含义:
    - 平均约29天一次
    - 标准差8.5天(离散程度小)
    - 标准差小 → 规律性强 → 稳定性高 ✅
    - 标准差大 → 规律性弱 → 不稳定 ⚠️

可视化理解

1
2
3
4
5
6
7
8
9
10
11
规律性强(STD小):
    间隔天数:[25, 26, 27, 25, 26]
    STD = 0.8
    ↓
    几乎每天都是固定的间隔
    
不规律(STD大):
    间隔天数:[10, 50, 15, 45, 20]
    STD = 18.5
    ↓
    间隔变化很大,没有规律

适用场景

场景1:数值型特征

应用:评估数据的波动性。

例子

  • STD(间隔天数) → 间隔的规律性
  • STD(交易金额) → 交易金额的稳定性
  • STD(违规次数) → 违规频率的规律性

场景2:稳定性分析

应用:分析行为的稳定性。

优势:识别不稳定模式。

2.6 NUM_UNIQUE(唯一值数量)

定义

NUM_UNIQUE:统计不同取值的数量。

公式

1
NUM_UNIQUE = 去重后的唯一值数量

作用:反映多样性、离散程度。

为什么有效?

原理:多样性可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
样本一去过的城市:
    - A市、B市、C市、A市、A市

NUM_UNIQUE(城市) = 3

含义:
    - 去过3个不同城市
    - 反映了多样性
    - 多样性高可能表示活动范围广
    
样本二去过的城市:
    - A市、A市、A市、A市、A市

NUM_UNIQUE(城市) = 1

含义:
    - 只去过1个城市
    - 多样性低
    - 活动范围固定

适用场景

场景1:类别型特征

应用:统计类别字段的唯一值数量。

例子

  • NUM_UNIQUE(城市) → 去过的城市数量
  • NUM_UNIQUE(渠道) → 使用的渠道数量
  • NUM_UNIQUE(类型) → 活动类型的种类数

场景2:多样性分析

应用:分析行为的多样性。

优势:识别多样化模式。


3. 类别特征函数

3.1 MODE(众数)

定义

MODE:出现最频繁的值。

公式

1
MODE = 出现次数最多的值

作用:反映典型情况、最常见模式。

为什么有效?

原理:最常见的情况可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
样本一的活动类型:
    - 记录1:旅游
    - 记录2:商务
    - 记录3:旅游
    - 记录4:旅游
    - 记录5:探亲

MODE(类型) = "旅游"(出现3次,最多)

含义:
    - 最常见的类型是"旅游"
    - 反映了人员的行为模式
    - 可能与风险类型相关(旅游 vs 商务)

可视化理解

1
2
3
4
5
6
统计每个类型的出现次数:
    旅游:3次
    商务:1次
    探亲:1次
    ↓
MODE = "旅游"(出现次数最多)

适用场景

场景1:类别型特征

应用:获取类别字段的最常见值。

例子

  • MODE(类型) → 最常见的类型
  • MODE(城市) → 最常去的城市
  • MODE(渠道) → 最常使用的渠道

场景2:典型行为模式分析

应用:分析最常见的行为模式。

优势:反映典型情况。


4. 时间特征函数

4.1 DIFF(差值)

定义

DIFF:相邻时间点的差值。

公式

1
DIFF = 时间点2 - 时间点1

作用:反映变化量、趋势、稳定性。

为什么有效?

原理:时间间隔的模式可能包含重要信息。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
样本一的活动时间:
    - 20XX-01-15
    - 20XX-02-20(间隔36天)
    - 20XX-03-10(间隔18天)
    - 20XX-04-05(间隔26天)
    - 20XX-05-12(间隔37天)

DIFF特征:
    - DIFF(时间) = [36, 18, 26, 37]天
    - MEAN(DIFF) = 29.25天(平均间隔)
    - STD(DIFF) = 8.5天(标准差,反映规律性)

含义:
    - 平均约一个月一次
    - 间隔比较规律(标准差小)
    - 反映了行为模式
    - 可能与风险相关(规律性强 = 正常?)

适用场景

场景1:时间序列特征

应用:计算时间序列的差值。

例子

  • DIFF(活动时间) → 活动间隔
  • DIFF(交易时间) → 交易间隔
  • MEAN(DIFF(…)) → 平均间隔

场景2:趋势分析

应用:分析时间序列的趋势。

优势:提取时间维度信息。

4.2 TREND(趋势)

定义

TREND:时间序列的方向性(增长/下降/稳定)。

公式

1
TREND = 时间序列的变化方向

作用:反映增长/下降模式。

为什么有效?

原理:趋势可能与目标变量相关。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
样本一的每月活动次数:
    - 1月:1次
    - 2月:1次
    - 3月:1次
    - 4月:2次(增加)
    - 5月:3次(增加)

TREND = 上升趋势

含义:
    - 活动频率在增加
    - 可能反映了行为变化
    - 可能与风险相关(频率增加 = 风险增加?)

适用场景

场景1:时间序列特征

应用:计算时间序列的趋势。

例子

  • TREND(每月活动次数) → 活动趋势
  • TREND(每月交易金额) → 交易趋势

场景2:长期变化分析

应用:分析长期的趋势变化。

优势:识别增长或下降模式。


5. 特征函数的组合使用

5.1 聚合函数 + 变换函数

什么是组合使用?

定义:将多个特征函数组合使用。

例子

1
2
3
4
5
基础函数:COUNT(活动记录) = 5
    ↓
组合函数:MEAN(DIFF(COUNT(活动记录)))
    ↓
含义:基于时间序列,计算活动记录数量的平均变化量

为什么需要组合?

原因:单个函数可能无法提取完整的模式。

例子

1
2
3
4
5
6
7
8
9
单个函数:
    COUNT(活动记录) = 5
    ↓
    只能知道总数,不知道时间分布

组合函数:
    MEAN(DIFF(COUNT(活动记录)))
    ↓
    可以知道记录数量的时间变化趋势

5.2 深度特征合成(DFS)

什么是DFS?

定义:深度特征合成(Deep Feature Synthesis),自动组合多个特征函数。

原理

1
2
3
4
5
6
7
8
9
10
11
12
深度 = 1:
    COUNT(活动记录)

深度 = 2:
    MEAN(DIFF(COUNT(活动记录)))
    SUM(DIFF(COUNT(活动记录)))
    ...

深度 = 3:
    MAX(MEAN(DIFF(COUNT(活动记录))))
    MIN(SUM(DIFF(COUNT(活动记录))))
    ...

特征爆炸问题

问题:深度增加 → 特征数量指数级增长。

例子

1
2
3
depth = 1:10个特征
depth = 2:100个特征(10²)
depth = 3:1000个特征(10³)

解决方案

  1. 控制深度:通常 depth = 2 就够用了
  2. 特征选择:训练后选择重要特征
  3. 特征过滤:根据字段配置过滤不需要的特征

5.3 特征组合与交互

什么是特征组合?

定义:将多个基础特征组合成新特征。

例子

1
2
3
4
5
6
7
8
基础特征:
    - 年龄:30岁
    - 收入:50000元
    
组合特征:
    - 年龄 × 收入 = 1500000
    ↓
    可能比单独的年龄或收入更有预测力

为什么需要组合?

原因:特征的交互可能包含非线性的重要信息。

例子

1
2
3
4
5
6
7
8
9
10
单独特征:
    - 年龄:30岁
    - 收入:50000元
    ↓
    模型可能无法自动学习交互
    
组合特征:
    - 年龄 × 收入 = 1500000
    ↓
    显式提供了交互信息

6. 如何选择合适的特征函数?

6.1 根据字段类型选择

数值型字段

推荐函数:SUM, MEAN, MAX, MIN, STD

原因:数值型字段可以进行数学运算。

例子

1
2
3
4
5
6
7
8
数值型字段:间隔天数
    ↓
    推荐函数:
    - SUM(间隔天数) → 总间隔天数
    - MEAN(间隔天数) → 平均间隔
    - MAX(间隔天数) → 最长间隔
    - MIN(间隔天数) → 最短间隔
    - STD(间隔天数) → 间隔的规律性

类别型字段

推荐函数:MODE, NUM_UNIQUE, COUNT

原因:类别型字段不能进行数学运算,只能统计。

例子

1
2
3
4
5
6
类别型字段:类型
    ↓
    推荐函数:
    - MODE(类型) → 最常见的类型
    - NUM_UNIQUE(类型) → 类型的种类数
    - COUNT(类型) → 类型的记录数

不推荐函数

  • MEAN(类型) → 无意义(类别不能平均)
  • SUM(类型) → 无意义(类别不能求和)

时间型字段

推荐函数:DIFF, TREND

原因:时间型字段可以计算时间差和趋势。

例子

1
2
3
4
5
6
时间型字段:活动时间
    ↓
    推荐函数:
    - DIFF(活动时间) → 活动间隔
    - TREND(活动时间) → 活动趋势
    - MEAN(DIFF(...)) → 平均间隔

6.2 根据业务目标选择

需要反映频率

选择:COUNT

例子

  • COUNT(活动记录) → 活动次数
  • COUNT(违规记录) → 违规次数

需要反映平均水平

选择:MEAN

例子

  • MEAN(间隔天数) → 平均间隔
  • MEAN(交易金额) → 平均交易金额

需要反映多样性

选择:NUM_UNIQUE

例子

  • NUM_UNIQUE(城市) → 去过的城市数量
  • NUM_UNIQUE(渠道) → 使用的渠道数量

需要反映典型情况

选择:MODE

例子

  • MODE(类型) → 最常见的类型
  • MODE(城市) → 最常去的城市

需要反映稳定性

选择:STD

例子

  • STD(间隔天数) → 间隔的规律性
  • STD(交易金额) → 交易金额的稳定性

6.3 特征函数的权衡

信息量 vs 计算成本

问题:特征越多,信息量越多,但计算成本也越高。

权衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
特征数量少:
    - 信息量少
    - 计算成本低
    - 可能遗漏重要信息 ❌

特征数量多:
    - 信息量多
    - 计算成本高
    - 可能包含冗余信息 ⚠️

平衡点:
    - 选择有用特征
    - 去除冗余特征
    - 在信息量和成本之间平衡 ✅

特征数量 vs 模型复杂度

问题:特征太多可能导致模型过拟合。

权衡

1
2
3
4
5
6
7
8
9
10
11
12
特征太少:
    - 模型简单
    - 可能欠拟合(信息不足)❌

特征太多:
    - 模型复杂
    - 可能过拟合(噪声干扰)❌

平衡点:
    - 足够的特征数量
    - 避免过度复杂
    - 通过特征选择优化 ✅

7. 特征函数的实际应用

7.1 多表数据的特征提取

特征提取流程

流程

1
2
3
4
5
6
7
8
9
10
11
步骤1:构建实体集(EntitySet)
    定义实体和关系
    ↓
步骤2:深度特征合成(DFS)
    自动生成特征
    ↓
步骤3:特征过滤
    根据字段配置过滤不需要的特征
    ↓
步骤4:特征矩阵
    得到最终的特征矩阵

实体关系示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
实体:
    - persons(人员):主实体
    - activity_records(活动记录):相关实体
    - visa_records(证件记录):相关实体

关系:
    - persons ← activity_records(人员 拥有 活动记录)
    - persons ← visa_records(人员 拥有 证件记录)

特征生成:
    - COUNT(activity_records) → 活动次数
    - MEAN(activity_records.间隔天数) → 平均间隔
    - MODE(activity_records.类型) → 最常见的类型
    ...

7.2 特征命名规则

特征名称格式

格式

1
2
3
4
5
6
{函数名}({实体名}.{字段名})

例子:
    COUNT(activity_records) → 活动记录的数量
    MEAN(activity_records.间隔天数) → 活动记录的平均间隔天数
    MODE(activity_records.类型) → 活动记录的最常见类型

嵌套函数命名

格式

1
2
3
4
5
{外层函数}({内层函数}({实体名}.{字段名}))

例子:
    MEAN(DIFF(activity_records.时间)) → 活动时间的平均差值
    SUM(COUNT(activity_records)) → 活动记录数量的总和(如果有分组)

7.3 特征定义文件的保存与使用

为什么需要保存特征定义?

原因

  • 特征对齐:预测时需要确保特征顺序和名称与训练时一致
  • 特征重现:需要能够重现训练时的特征
  • 版本管理:追踪特征定义的版本历史

特征定义文件内容

内容

1
2
3
4
5
特征定义包含:
    - 特征名称列表
    - 特征计算方式
    - 特征数据类型
    - 特征来源(实体、字段、函数)

使用方式

训练阶段

1
2
3
1. 生成特征矩阵
2. 保存特征定义到 feature_definitions.pkl
3. 训练模型

预测阶段

1
2
3
4
1. 加载特征定义(feature_definitions.pkl)
2. 根据特征定义生成查询数据的特征
3. 确保特征顺序和名称与训练时一致
4. 使用模型进行预测

总结

本文深入介绍了特征工程中常用的函数。关键要点:

  1. 特征函数的本质:从原始数据到特征值的转换,信息压缩与模式提取
  2. 统计特征函数:COUNT、SUM、MEAN、MAX/MIN、STD、NUM_UNIQUE
  3. 类别特征函数:MODE
  4. 时间特征函数:DIFF、TREND
  5. 特征函数的组合:深度特征合成(DFS)、特征组合与交互
  6. 函数选择:根据字段类型和业务目标选择合适的函数
  7. 实际应用:多表数据特征提取、特征命名规则、特征定义文件管理

通过合理使用特征函数,我们可以:

  • 从原始数据中提取有用信息
  • 降低模型学习难度
  • 提高模型性能

选择合适的特征函数,能够大大提高特征工程的效果和模型性能。

本文由作者按照 CC BY 4.0 进行授权