特征工程常用函数详解
特征工程常用函数详解
深入理解特征工程中常用的函数(统计特征、类别特征、时间特征等),掌握每个函数的作用、含义和使用场景。从第一性原理出发,理解为什么需要这些函数,以及它们如何帮助我们提取有用信息。
目录
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³)
解决方案:
- 控制深度:通常 depth = 2 就够用了
- 特征选择:训练后选择重要特征
- 特征过滤:根据字段配置过滤不需要的特征
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. 使用模型进行预测
总结
本文深入介绍了特征工程中常用的函数。关键要点:
- 特征函数的本质:从原始数据到特征值的转换,信息压缩与模式提取
- 统计特征函数:COUNT、SUM、MEAN、MAX/MIN、STD、NUM_UNIQUE
- 类别特征函数:MODE
- 时间特征函数:DIFF、TREND
- 特征函数的组合:深度特征合成(DFS)、特征组合与交互
- 函数选择:根据字段类型和业务目标选择合适的函数
- 实际应用:多表数据特征提取、特征命名规则、特征定义文件管理
通过合理使用特征函数,我们可以:
- 从原始数据中提取有用信息
- 降低模型学习难度
- 提高模型性能
选择合适的特征函数,能够大大提高特征工程的效果和模型性能。
