学习目标
完成本课后,你将能够:
- 区分数据存储类型与特征的语义类型。
- 解释名义、顺序、区间和比率测量尺度。
- 为数值、类别、时间和文本数据选择合适的表示。
- 理解独热、序数、频率和目标编码的取舍。
- 处理缺失值、稀有类别、未知类别、尺度和异常值。
- 防止数据泄漏,并检查预测时特征是否可用。
- 建立特征说明表,并说明每项预处理决策的理由。
1. 先理解含义,再看存储格式
假设 CSV 中有一列数值:101、205、307。从技术上看,它们是整数。但它们代表什么?可能是用水量、房间编号或设备类型代码。对于用水量,差值和平均值可能有意义;房间编号的平均值 204.3 却没有实际解释。因此,文件中的列类型并不能决定它在模型中的含义。
建议区分三个层次。物理类型描述存储方式(字符串、整数、浮点数、时间戳);语义类型描述业务含义(测量、计数、类别、日期、标识符);任务角色描述字段用途(输入特征 X、目标 y、分组键或管理字段)。同一字段在不同任务中可能承担不同角色。
可以先问:对这个值进行比较、加减、求平均或排序是否有意义?答案往往比列名更能揭示它的真实含义。
2. 测量尺度:数字究竟意味着什么
经典测量尺度分类有助于避免对数据作出不恰当假设。名义尺度只区分类别;顺序尺度增加有意义的排序;区间尺度允许比较差值,但零点是人为的;比率尺度具有自然零点,因此比例关系也有意义。
摄氏温度属于区间尺度:10 到 20 度的差值与 20 到 30 度相同,但 20°C 并不意味着比 10°C 热两倍。千克质量属于比率尺度:20 kg 确实是 10 kg 的两倍。“低、中、高”属于顺序尺度:顺序明确,但等级之间的间隔不一定相等。
3. 数值特征:测量值与计数
连续特征描述可在一定范围内取值的测量量,例如温度、压力、面积和运行时间。离散特征通常表示事件或对象的数量,例如申请数、楼层数和缺陷数。这一区别会影响范围检查、可视化、数据变换,有时也会影响模型选择。
检查单位、精度和物理上合理的范围。把摄氏度与华氏度、平方米与平方英尺混在一起,会产生看似合理但实际错误的数据。异常值需要单独调查:9000 可能是输入错误、真实的罕见事件,也可能使用了另一种单位。不要自动删除,先查明来源。
缺失值本身也可能包含信息。空单元格、“无数据”、零和 −999 这样的特殊标记并不等价。有时缺少测量值本身具有信息,例如传感器在某种运行状态下更容易断开。可以增加缺失指示变量,但用任意数字替代未知值必须有依据。
4. 类别:名义类别与顺序类别
名义类别没有自然顺序,例如墙体材料、设备类型、城市或联系渠道。顺序类别具有明确的语义顺序,例如低、中、高;初级、高级、专家。但即使把它们编码为 1、2、3,也不代表等级之间的距离变成了实际测量值。
一个常见错误是把建筑类型编码为 1、2、3,再交给会解释数值距离的算法。模型可能认为类型 3“大于”类型 1,并假定 1 到 2 的差距等于 2 到 3 的差距。对于名义类别,这种几何关系是人为制造的。
5. 类别编码:方法与权衡
独热编码为每个类别创建单独的二进制列。三个建筑类型会变成三个指示变量。它不会强加顺序,但会增加维度。如果唯一类别达到数千个,矩阵会变得很宽且稀疏,需要考虑类别频率、合并稀有类别、特征哈希或原生支持类别特征的算法。
序数编码为类别分配整数代码。对于真实存在顺序且顺序明确的尺度,这种方法可能合适。对于名义类别,是否适用取决于算法:树模型或原生支持类别的模型,处理方式可能不同于线性模型或距离模型。不要仅仅因为编码更紧凑就选择它。
频率编码用类别出现频率替代类别。目标编码使用类别内部目标变量的统计量。这些方法有助于处理高基数类别,但尤其容易产生泄漏和过拟合。统计量只能基于训练数据计算;目标编码通常需要交叉折外估计和适当平滑。还要预先定义推理时如何处理未知类别。
6. 日期、时间与周期规律
时间戳可能包含日期、时间、时区和测量精度。提取特征之前,要明确时间对应的事件:申请创建、实际开工、系统登记还是记录入库。这些时刻并不相同。应采用统一的时间标准,并明确处理本地日历。
日期可以提取年份、月份、星期、小时、节假日、季节或距某事件的时间。但只能使用预测时已经可获得的信息。对于周期量,直接使用小时编号会在 23 和 0 之间制造不自然的间隔。周期编码把数值映射到圆周上,使相邻小时在正弦和余弦坐标中都保持接近。
7. 文本与标识符
简短标签(“故障”“计划检查”)属于类别特征;自由格式的工单描述则属于文本。文本表示方法包括词袋、TF-IDF、n-gram 和嵌入向量。简单方法适用于部分分类任务;嵌入可以捕捉语义相似性,但需要额外计算资源和质量控制。
标识符通常是键,而不是对象描述。客户、设备或工单 ID 可能让模型记住具体实体,而不是学习可迁移的规律。但 ID 对分组切分、关联表格、审计和监控仍然有用。正确做法不是“一律删除”,而是区分管理用途与输入特征用途。
8. 缩放与数据变换
许多算法对尺度敏感。如果面积以数千计,而温度只有几十,距离和梯度可能主要受面积影响。StandardScaler 通过减去均值并除以标准差进行标准化;MinMaxScaler 将数据映射到指定范围;RobustScaler 使用中位数和四分位距,对极端值不那么敏感。
决策树和树集成通常不需要缩放,因为它们通过特征阈值进行划分。对数变换可能减小正值分布的偏斜,但必须注意零和负数。变换应符合特征本身和任务目标,而不应成为机械化步骤。
9. 缺失、异常与泄漏:虚假信心的三个来源
缺失可能是随机发生的,可能依赖其他已观测字段,也可能与未知值本身有关。因此需要研究缺失机制,以及它在不同群体和时间中的分布。均值、中位数、最常见类别、“未知”类别和缺失指示变量代表不同假设,不能随意互换。
如果预处理或特征构造使用了真实预测场景中无法获得的信息,就会发生数据泄漏。例如,在预测明日能耗时使用明日实际人员数量;又如,在划分训练集和测试集之前,就用全表计算均值和类别词表。指标会显得过于乐观,但模型部署后无法达到这样的效果。
10. 特征说明表与可复现流程
对每个字段记录其含义、物理类型和语义类型、单位或允许值、数据来源、可用时间、缺失率、变换方式、未知值处理方式和泄漏风险。这样数据准备过程才可审计:其他人员不仅能理解做了什么,也能理解为什么这样做。
任何需要从数据中学习的参数——缺失值填补均值、缩放参数、类别词表、频率或目标统计量——都只能在 train 上拟合。随后将同一个已拟合转换器应用于 validation、test 和新数据,不再重新拟合。scikit-learn 中的 Pipeline 和 ColumnTransformer 有助于落实这一原则。
核心规则:按照实际部署场景先划分数据,再仅用 train 拟合变换,然后应用于其他数据分区。不要让未来数据或测试数据影响训练数据的预处理。
实践任务:预测建筑每日能耗
对于字段 building_id、date、temperature_c、floor_area_m2、building_type、occupancy_plan、occupancy_actual、energy_kwh,建立特征说明表。目标是在次日开始之前预测下一日 energy_kwh。逐一说明字段角色、类型、尺度、单位/类别、预测时是否可用、编码方式和泄漏风险。提出缺失值与未知 building_type 的处理方法,并说明哪些预处理参数只能在 train 上拟合。
| 字段 | 语义类型 | 单位 / 值 | 处理决策与风险 |
|---|---|---|---|
| temperature_c | 数值 · 连续 | °C | 必要时缩放;检查取值范围 |
| floor_area_m2 | 数值 · 连续 | m² | 检查单位和正值;可考虑对数变换 |
| building_type | 类别 · 名义 | 类别列表 | 独热或原生类别;处理未知值 |
| date | 时间 | 日期与时区 | 日历和周期特征;不能使用未来信息 |
| building_id | 标识符 / 分组 | 唯一键 | 用于关联和分组切分;不要自动纳入特征 |
| occupancy_actual | 数值或类别 | 人数 / 状态 | 在当天开始前预测时不可用 |
独立练习
- 为表中的每个字段填写特征说明。
- 标出预测日开始前无法获得的字段。
- 说明类别编码和未知值处理方案。
- 列出只能在 train 上拟合的操作。
参考资料与延伸阅读
课程词汇
知识自测
选择一个答案。提交后将显示解释。
问题 1
room_number 字段包含 101、102 和 201。编码前应该做什么?
问题 2
哪种尺度允许说 20 kg 是 10 kg 的两倍?
问题 3
为什么在线性模型中,名义特征的 1、2、3 编码可能有风险?
问题 4
独热编码做什么?
问题 5
如何正确使用目标编码?
问题 6
为什么用正弦和余弦表示一天中的小时?
问题 7
什么时候标识符通常不应进入 X?
问题 8
scaler 和 imputer 应在哪些数据上拟合?