偏态与周期特征变换
用 log1p 缓和非负长尾分布,用正弦/余弦保留小时、星期等周期相邻关系。
学习前需要掌握
背景与问题
金额、次数等特征常有长尾,少数大值可能主导尺度;小时、星期和角度则具有首尾相接的周期。两种结构需要不同处理,不能把所有数字都当成普通线性坐标。
变换的目标是表达合适关系,而不是让图形看上去更漂亮。每种变换都会带来假设和信息取舍,需要在任务中验证。
概念定义
对数类变换压缩大数值间隔,log1p(x) 在零点可直接取零,适用于本例的非负金额。周期编码常将相位映射到正弦与余弦两列,使周期两端在表示中接近。
数学上 log1p 的实数定义域要求 x 大于 -1;实际金额约束可以更严格。正弦和余弦应共同使用,单独一列可能把不同相位映射到同一个值。
直观理解
23 点和 0 点只差一个小时,而整数编码相差 23。把一天画成圆,用圆上坐标描述时间,就能把“首尾相邻”放进模型输入。
午夜相邻,十二小时相对
用 (sin(2πh/24),cos(2πh/24)) 编码小时。23 点约为 (-0.2588,0.9659),0 点为 (0,1),两点距离约 0.2611;0 点与 12 点则位于圆的两端,距离为 2。
金额 [0,9,99] 的 log1p 约为 [0,2.3026,4.6052],大数值差异被压缩,但没有因此保证这些金额之间的业务关系一定适合该尺度。
核心原理
对数变换保持合法输入的顺序,但改变距离和线性关系,不保证结果正态,也不自动修复异常数据。对含负值的特征,应先理解语义,再选择适用变换。
周期 T 必须来自真实定义,例如一天 24 小时,而不是从当前数据的最大值猜测。角度、星期和月份还要明确编码起点与实际周期假设。
sin/cos 表示相位,不直接表示季节趋势、节假日或跨周期的长期变化;这些信息可能需要额外特征。也不能假设所有任务都应让周期相邻点具有相同目标。
有拟合参数的变换仍需训练边界,预测时使用同一约定。比较变换效果时,固定验证协议并检查极值和边界,避免只比较训练误差。
数学表达
长尾变换
非负数据中压缩大值。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1检查变量定义与范围。
- 2非负长尾比较 log1p 前后分布。
- 3确定周期 T。
- 4同时生成 sin/cos 两列。
代码对应位置
示例 1核对金额压缩与午夜距离:完整给定金额和小时数据,检查两个不同变换。
周期编码
T 是周期长度。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1检查变量定义与范围。
- 2非负长尾比较 log1p 前后分布。
- 3确定周期 T。
- 4同时生成 sin/cos 两列。
代码对应位置
示例 1核对金额压缩与午夜距离:完整给定金额和小时数据,检查两个不同变换。
计算与实现步骤
- 检查变量定义与范围。
- 非负长尾比较 log1p 前后分布。
- 确定周期 T。
- 同时生成 sin/cos 两列。
- 在验证集比较效果。
代码实现
示例 1
核对金额压缩与午夜距离
example_01.py用途:完整给定金额和小时数据,检查两个不同变换。
import numpy as np
amount = np.array([0., 9., 99.])
hour = np.array([23., 0.])
angle = 2 * np.pi * hour / 24
coordinates = np.column_stack([np.sin(angle), np.cos(angle)])
print("log1p:", np.log1p(amount).round(4).tolist())
print(f"midnight_distance={np.linalg.norm(coordinates[0] - coordinates[1]):.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
完整给定金额和小时数据,检查两个不同变换。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
amount = np.array([0., 9., 99.])
hour = np.array([23., 0.])
angle = 2 * np.pi * hour / 24
coordinates = np.column_stack([np.sin(angle), np.cos(angle)])
print("log1p:", np.log1p(amount).round(4).tolist())
print(f"midnight_distance={np.linalg.norm(coordinates[0] - coordinates[1]):.4f}")预期输出或运行结果
log1p: [0.0, 2.3026, 4.6052] midnight_distance=0.2611
常见错误 · 3 条
- 对含负数数据直接 log1p
- 只用 sin 或 cos 一列
- 没有明确真实周期
实际应用
- 金额与访问次数
- 小时、星期与季节
常见错误
- 对含负数数据直接 log1p
- 只用 sin 或 cos 一列
- 没有明确真实周期
推荐学习资料
参考库不会生成虚假资源或无效外部链接。