学习目标

完成本课后,你将能够:

核心问题数据表示是现实世界与模型之间的语言。表格中看似不起眼的表示错误,可能彻底改变算法能够学习到的规律。

1. 先理解含义,再看存储格式

假设 CSV 中有一列数值:101、205、307。从技术上看,它们是整数。但它们代表什么?可能是用水量、房间编号或设备类型代码。对于用水量,差值和平均值可能有意义;房间编号的平均值 204.3 却没有实际解释。因此,文件中的列类型并不能决定它在模型中的含义。

建议区分三个层次。物理类型描述存储方式(字符串、整数、浮点数、时间戳);语义类型描述业务含义(测量、计数、类别、日期、标识符);任务角色描述字段用途(输入特征 X、目标 y、分组键或管理字段)。同一字段在不同任务中可能承担不同角色。

可以先问:对这个值进行比较、加减、求平均或排序是否有意义?答案往往比列名更能揭示它的真实含义。

原始值字段含义特征类型表示方式模型
从存储值到模型可理解的特征表示。

2. 测量尺度:数字究竟意味着什么

经典测量尺度分类有助于避免对数据作出不恰当假设。名义尺度只区分类别;顺序尺度增加有意义的排序;区间尺度允许比较差值,但零点是人为的;比率尺度具有自然零点,因此比例关系也有意义。

摄氏温度属于区间尺度:10 到 20 度的差值与 20 到 30 度相同,但 20°C 并不意味着比 10°C 热两倍。千克质量属于比率尺度:20 kg 确实是 10 kg 的两倍。“低、中、高”属于顺序尺度:顺序明确,但等级之间的间隔不一定相等。

25.0温度数值25 °C
相同的数字可能表示测量值、顺序或单纯标签。

3. 数值特征:测量值与计数

连续特征描述可在一定范围内取值的测量量,例如温度、压力、面积和运行时间。离散特征通常表示事件或对象的数量,例如申请数、楼层数和缺陷数。这一区别会影响范围检查、可视化、数据变换,有时也会影响模型选择。

检查单位、精度和物理上合理的范围。把摄氏度与华氏度、平方米与平方英尺混在一起,会产生看似合理但实际错误的数据。异常值需要单独调查:9000 可能是输入错误、真实的罕见事件,也可能使用了另一种单位。不要自动删除,先查明来源。

缺失值本身也可能包含信息。空单元格、“无数据”、零和 −999 这样的特殊标记并不等价。有时缺少测量值本身具有信息,例如传感器在某种运行状态下更容易断开。可以增加缺失指示变量,但用任意数字替代未知值必须有依据。

4. 类别:名义类别与顺序类别

名义类别没有自然顺序,例如墙体材料、设备类型、城市或联系渠道。顺序类别具有明确的语义顺序,例如低、中、高;初级、高级、专家。但即使把它们编码为 1、2、3,也不代表等级之间的距离变成了实际测量值。

一个常见错误是把建筑类型编码为 1、2、3,再交给会解释数值距离的算法。模型可能认为类型 3“大于”类型 1,并假定 1 到 2 的差距等于 2 到 3 的差距。对于名义类别,这种几何关系是人为制造的。

3建筑类型名义类别 C
独热编码不强加顺序;序数编码需要语义依据。

5. 类别编码:方法与权衡

独热编码为每个类别创建单独的二进制列。三个建筑类型会变成三个指示变量。它不会强加顺序,但会增加维度。如果唯一类别达到数千个,矩阵会变得很宽且稀疏,需要考虑类别频率、合并稀有类别、特征哈希或原生支持类别特征的算法。

序数编码为类别分配整数代码。对于真实存在顺序且顺序明确的尺度,这种方法可能合适。对于名义类别,是否适用取决于算法:树模型或原生支持类别的模型,处理方式可能不同于线性模型或距离模型。不要仅仅因为编码更紧凑就选择它。

频率编码用类别出现频率替代类别。目标编码使用类别内部目标变量的统计量。这些方法有助于处理高基数类别,但尤其容易产生泄漏和过拟合。统计量只能基于训练数据计算;目标编码通常需要交叉折外估计和适当平滑。还要预先定义推理时如何处理未知类别。

6. 日期、时间与周期规律

时间戳可能包含日期、时间、时区和测量精度。提取特征之前,要明确时间对应的事件:申请创建、实际开工、系统登记还是记录入库。这些时刻并不相同。应采用统一的时间标准,并明确处理本地日历。

日期可以提取年份、月份、星期、小时、节假日、季节或距某事件的时间。但只能使用预测时已经可获得的信息。对于周期量,直接使用小时编号会在 23 和 0 之间制造不自然的间隔。周期编码把数值映射到圆周上,使相邻小时在正弦和余弦坐标中都保持接近。

sin / cos2风险等级顺序中
周期编码保留周期末端与起点之间的邻近关系。

7. 文本与标识符

简短标签(“故障”“计划检查”)属于类别特征;自由格式的工单描述则属于文本。文本表示方法包括词袋、TF-IDF、n-gram 和嵌入向量。简单方法适用于部分分类任务;嵌入可以捕捉语义相似性,但需要额外计算资源和质量控制。

标识符通常是键,而不是对象描述。客户、设备或工单 ID 可能让模型记住具体实体,而不是学习可迁移的规律。但 ID 对分组切分、关联表格、审计和监控仍然有用。正确做法不是“一律删除”,而是区分管理用途与输入特征用途。

23:00一天中的小时周期sin / cos
文本需要独立的转换流程;ID 并不自动成为特征。

8. 缩放与数据变换

许多算法对尺度敏感。如果面积以数千计,而温度只有几十,距离和梯度可能主要受面积影响。StandardScaler 通过减去均值并除以标准差进行标准化;MinMaxScaler 将数据映射到指定范围;RobustScaler 使用中位数和四分位距,对极端值不那么敏感。

决策树和树集成通常不需要缩放,因为它们通过特征阈值进行划分。对数变换可能减小正值分布的偏斜,但必须注意零和负数。变换应符合特征本身和任务目标,而不应成为机械化步骤。

9. 缺失、异常与泄漏:虚假信心的三个来源

缺失可能是随机发生的,可能依赖其他已观测字段,也可能与未知值本身有关。因此需要研究缺失机制,以及它在不同群体和时间中的分布。均值、中位数、最常见类别、“未知”类别和缺失指示变量代表不同假设,不能随意互换。

如果预处理或特征构造使用了真实预测场景中无法获得的信息,就会发生数据泄漏。例如,在预测明日能耗时使用明日实际人员数量;又如,在划分训练集和测试集之前,就用全表计算均值和类别词表。指标会显得过于乐观,但模型部署后无法达到这样的效果。

训练参数均值 · 缩放 · 词表仅转换验证集 / 测试集 ·
转换参数只在 train 上拟合,再原样应用于其他数据分区。

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数值或类别人数 / 状态在当天开始前预测时不可用

独立练习

  1. 为表中的每个字段填写特征说明。
  2. 标出预测日开始前无法获得的字段。
  3. 说明类别编码和未知值处理方案。
  4. 列出只能在 train 上拟合的操作。

参考资料与延伸阅读

  1. scikit-learn — Preprocessing data
  2. scikit-learn — Encoding categorical features
  3. scikit-learn — Imputation of missing values
  4. pandas — Time series / date functionality
  5. scikit-learn — Common pitfalls and data leakage
  6. Google ML Crash Course — Numerical and categorical data

课程词汇

语义类型独立于存储格式的数值或字段含义。
名义尺度没有自然顺序的类别。
顺序尺度具有顺序但间隔不一定相等的类别。
比率尺度具有自然零点的数值尺度。
独热编码为每个类别创建独立的二进制指示变量。
基数特征中不同类别的数量。
目标编码使用目标变量统计量对类别进行编码。
周期特征具有周期结构的特征,例如一天中的小时。
数据泄漏使用真实预测场景中不可获得的信息。
Pipeline按照统一 fit/transform 规则组织预处理和模型步骤的流程。

知识自测

选择一个答案。提交后将显示解释。

问题 1

room_number 字段包含 101、102 和 201。编码前应该做什么?

问题 2

哪种尺度允许说 20 kg 是 10 kg 的两倍?

问题 3

为什么在线性模型中,名义特征的 1、2、3 编码可能有风险?

问题 4

独热编码做什么?

问题 5

如何正确使用目标编码?

问题 6

为什么用正弦和余弦表示一天中的小时?

问题 7

什么时候标识符通常不应进入 X?

问题 8

scaler 和 imputer 应在哪些数据上拟合?