处理数值数据
机器学习不是把 Excel 表格直接交给模型。你要先理解每列的业务含义,再把每条记录稳定地转换为模型能计算的浮点数特征向量。
- 区分真正的数值、数字编码和标签。
- 从分布图和统计摘要找到离群值与长尾。
- 按数据形状选择线性缩放、Z 分数、对数或剪裁。
- 把数值特征的处理规则保存为可复用的训练流水线。
先判断数字有没有数学含义
“由数字组成”不等于“数值特征”。只有加减、排序或比例在业务上有意义时,才适合作为连续数值输入。
温度、重量、面积、金额
30°C 比 15°C 高;200 平方米约是 100 平方米的两倍。
差值和比例可以解释邮编、订单号、身份证号
邮编 20004 不是 10002 的两倍,也不应被模型理解为更大。
通常转到类别数据模块处理金额单位必须写清楚:元、万元、分不能混用;时间也要写清楚是秒、毫秒还是天。模型无法替你猜单位,单位混用会让特征含义直接错误。
模型如何使用特征向量
模型不直接理解“第 3 行的面积和房龄”。数据流水线会先抽取选中的特征,再组成固定顺序的浮点数数组,这个数组叫特征向量。
2.1 一行数据里,谁是特征,谁是标签?
以预测房价为例,价格是已知答案,所以是标签;面积和房龄可以是数值特征。房屋编号仅用于识别记录,不应让模型误以为编号越大房价越高;城市属于类别,要编码后才可进入向量。
2.2 从原始值到可训练向量
第 3 行的原始信息是 [72 平方米, 2 年, 杭州]。面积和房龄经过归一化,城市经过独热编码,最终变为 [−0.42, −0.81, 1, 0, 0]。这五个位置的顺序和计算方式必须固定。
| 位置 | 含义 | 示例值 | 规则来源 |
|---|---|---|---|
| 第 1 位 | 归一化后的面积 | −0.42 | 训练集的面积均值与标准差 |
| 第 2 位 | 归一化后的房龄 | −0.81 | 训练集的房龄均值与标准差 |
| 第 3~5 位 | 城市独热编码 | [1, 0, 0] | 训练阶段保存的城市词汇表 |
训练时用平方米,线上却传平方英尺;训练时“杭州”是第 3 位,线上词表重排到第 5 位——这些数字看似合法,模型却会完全理解错。均值、标准差、单位、词表和列顺序都要与模型一同版本化。
初始步骤:先看图,再看统计量
不要只看一列平均值就开始训练。图表发现形状,统计量确认范围;两者结合才能发现偏态、长尾、分组差异和离群点。
| 先看什么 | 它回答的问题 | 常见信号 |
|---|---|---|
| 直方图 | 数值集中在哪,是否有长尾? | 收入、销量大多右偏 |
| 散点图 | 特征与标签是直线、弯曲还是无关系? | 舒适温度时客流最多 |
| 均值与中位数 | 中心位置是否被极端值拉偏? | 均值远高于中位数 |
| 分位数与标准差 | 主要范围多大,尾部是否很长? | 最大值远离 75% 分位数 |
先按整体看一遍,再按时间、地区、渠道、设备等维度切片。比如总体温度范围正常,但某一个传感器持续报 1000,这种问题在总体均值中很容易被掩盖。
标准化:四种处理方法
归一化的目标是让特征落在相近的数值尺度。年龄范围可能是 0~100,城市人口可能是 5,000~1,000,000,000;不处理时,大范围特征会让梯度下降走得不稳定、训练变慢,甚至出现 NaN。
先在训练集上计算最小值、最大值、均值和标准差;验证集、测试集和线上新数据只能应用这些已保存的参数。若把所有数据一起计算,你已经让测试集信息提前参与训练。
4.1 线性缩放:边界稳定时使用
它把数值映射到 0~1。训练集中数量范围为 100~900,某条记录为 300,则 (300−100)/(900−100)=0.25。适合年龄这类上下限稳定、离群值少的数据。净资产、销售额通常不适合,因为少数极端值会挤压大多数正常样本。
4.2 Z 分数缩放:最常见的默认选择
z 表示“这个值离平均值有几个标准差”。若平均身高 165cm、标准差 7cm、某人 179cm,则 z = 2。大致钟形或近似钟形的连续数据通常适合 Z 分数;若尾部极端,可先剪裁再做 Z 分数。
4.3 对数缩放:压缩长尾
书籍销量从 100 到 1,000,000 相差一万倍,直接输入会让少数畅销书主导尺度;取对数后约为 4.6 与 13.8,差距更容易被模型处理。只对非负特征使用 ln(1+x),这样 0 也有定义。
4.4 剪裁:限制极端值的影响
剪裁不是删除样本:若上限设为 4,所有大于 4 的值都变成 4。它适合确认后仍存在、但不希望少数极端值支配训练的情况。先确认极端值是否录入错误;真实且上线会遇到的极端值通常保留,再用剪裁、对数或分箱处理。
| 方法 | 典型场景 | 先检查的风险 |
|---|---|---|
| 线性缩放 | 年龄、百分比、明确上下限 | 上下限会不会变化?是否有极端值? |
| Z 分数 | 身高、时长等大致钟形特征 | 尾部会不会扭曲均值和标准差? |
| 对数缩放 | 金额、销量、点击量等右偏长尾 | 是否有负数?0 是否需要保留? |
| 剪裁 | 少量极端值影响训练 | 它是错误还是业务上真实的重要信号? |
分箱:用区间表达模式
分箱把连续数值变成几个区间。例如温度 4~11°C、12~26°C、27~36°C 分成三个箱。之后每个箱使用独热编码,模型会为每个区间学习一个独立权重。
分箱适合特征与标签没有线性关系,或特征值有明显聚类。可用等宽分箱、业务阈值分箱,或分位数分箱:按样本排序后让每个箱包含接近数量的样本。后者对长尾数据通常更均衡。
箱数增加会让模型更灵活,也让每个箱的样本更少。若 3 个箱改成 30 个箱,许多区间可能几乎没有训练样本,模型学到的只是偶然波动。边界和数量需在验证集上比较。
数据清洗:修正而非盲删
清洗是在建模前确认每个值能不能代表真实世界。目标不是让数据“好看”,而是让错误不被模型当成规律。
| 问题 | 例子 | 推荐处理 |
|---|---|---|
| 错误值 | user_age_years=224 | 回查来源;能修正则修正,不能确认则按规则排除 |
| 缺失值 | 观看时长为空 | 插补合理值,并新增 is_watch_time_missing |
| 重复值 | 同一订单日志上传两次 | 在拆分训练集之前去重 |
| 单位不一致 | 一部分金额为元,一部分为分 | 统一单位,保留处理日志 |
连续特征的 -1 会被模型理解成真实负值。更稳妥的做法是:数值列用中位数等规则补齐,同时额外增加一个布尔特征,明确告诉模型“这个值原来缺失”。
好数值特征的品质
使用 house_age_years=27,不要留下难懂的 house_age=851472000。
给合理范围写成自动校验规则,抽样查看原始记录,持续监控异常比例。
用缺失指示列表达“未提供”;不要用一个魔法数字混入正常连续值。
不能使用下单后才产生、诊断后才知道或未来才发生的信息预测当前结果。
如果你不能在上线时清楚回答“这个值从哪里来、单位是什么、缺失怎么办、是否与训练时完全一致”,它还不是可交付的特征。
多项式转换:给直线加曲线
线性模型的“线性”指它对权重是线性的,不代表每个输入只能有一次方。加入 x² 可以帮助它描述弯曲趋势或弯曲边界。
多项式项增加了模型能力,也增加了过拟合风险。先从 x² 开始,确保原始特征已经缩放,再用验证集判断它是否提升新数据表现;不要只因为训练集分数更高就继续加到 x³、x⁴。
本模块术语速查
- 特征向量
- 模型实际接收的固定顺序浮点数数组。
- 特征工程
- 把原始数据改写成更易学习、且可稳定复用的表示。
- 归一化
- 把不同范围的数值转换到相近尺度。
- 分位数
- 按排序位置描述数据分布的统计量,如 25%、50%、75%。
- 分箱
- 把连续范围划成多个区间并分别编码。
- 剪裁
- 把超过指定上下限的值限制在边界上。
- 数据泄漏
- 训练错误使用了验证、测试或未来数据的信息。