【机器学习】(19)—— 数据特性与标签
数据特性与标签:划分前先摸清
文章目录
- 数据特性与标签:划分前先摸清
- 1. 为什么「先划分」还不够
- 2. 数据特性四问
- 2.1 类型:是什么数据
- 2.2 数量:样本够不够
- 2.3 数据质量
- 2.4 可信度
- 3. 不可靠数据从哪来
- 4. 不完整样本:删除还是填补
- 4.1 什么时候删除
- 4.2 什么时候填补
- 5. 标签:直接标签与代理标签
- 5.1 两种标签
- 5.2 人工标注 vs 自动标注
- 6. 划分中的隐藏坑
- 6.1 跨集合重复
- 6.2 验证集 / 测试集磨损
- 6.3 分布不一致与非平稳
- 6.4 变换泄漏
- 7. 划分前清单与汽车小例子
- 8. 动手:去重、填补、防泄漏划分
- 9. 能力边界与常见误区
- 9.1 适用边界
- 9.2 常见误区
- 10. 关键术语速查
- 11. 延伸阅读
- 12. 小结
摘要:第 18 篇讲了训练/验证/测试三分法,但若数据本身不可靠,再标准的划分也只是「把垃圾切成三份」。本文讲清数据集的类型、数量、质量与可信度,不完整样本该删还是该补,直接标签与代理标签怎么选,以及划分前后最常见的隐藏坑(重复、验证集磨损、分布错位、变换泄漏)。继续用汽车重量与油耗示例。适合刚读完泛化入门的读者。
1. 为什么「先划分」还不够
三分法回答的是:参数在哪学、超参在哪调、最终在哪验收。
它回答不了另一类问题:
- 这批车的重量、标签靠不靠谱?
- 缺了 MPG 的行怎么办?
- 「高效」标签是真标记,还是用别的字段凑的?
- 训练集和测试集是不是同一辆车出现了两次?
数据集(Dataset)是样本的集合;模型再强,也强不过它所见过的数据。划分之前,先把家底摸清。
本单元进度:
| 篇次 | 聚焦 |
|---|---|
| 第 18 篇 | 泛化、过/欠拟合、三分法 |
| 本篇(19) | 数据特性、标签、划分中的坑 |
| 后续篇 | 类别不平衡;模型复杂度与损失曲线 |
2. 数据特性四问
2.1 类型:是什么数据
一张表里,常见并存:
| 类型 | 汽车示例 | 专栏位置 |
|---|---|---|
| 数值 | 重量、排量、MPG | 第 14~16 篇 |
| 类别 | 品牌、颜色、邮编 | 第 17 篇 |
| 文本 / 多媒体 | 车评、外观图 | 后续专题 |
| 其他模型输出 | 上游打分、Embedding | 进阶篇 |
类型搞错(把邮编当数值)会从根上歪掉,第 17 篇已强调过。
2.2 数量:样本够不够
粗经验:可训练参数越多,通常需要越多样本。简单说法是:样本数最好比参数量大一个数量级以上;好模型往往还要更多。
另一条实用规律:大样本 + 少而精的特征,常常胜过小样本 + 特征堆满。专栏里 7 辆车只够讲概念,真实油耗模型需要远更大规模。
小数据也不是绝路:若能从同结构、大数据上预训练再适配,有时也能出活——但那是迁移学习路线,前提仍是标签与特征定义要对齐。
2.3 数据质量
质量不必玄学化,用结果定义即可:
高质量数据帮助模型达成目标;低质量数据阻碍目标。
预测「是否高效」时,若高效标签大量标反,再漂亮的 AUC 也只是拟合错误标签。
2.4 可信度
可信度(Reliability)问的是:标签错得多吗?特征噪不噪?过滤条件是否匹配任务?
做垃圾邮件检测时,机器人流量可能该留;做「真人搜索体验」时,机器人查询往往该滤掉——同一类脏数据,任务不同,去留不同。
3. 不可靠数据从哪来
| 问题 | 汽车例子 | 典型后果 |
|---|---|---|
| 缺值 | 某行重量空白 | 无法组成完整特征向量 |
| 重复样本 | 同一日志上传两次 | 训练/测试泄漏,分数虚高 |
| 坏特征值 | 3.43 录成 34.3 | 回归被极端点拉歪(第 16 篇) |
| 坏标签 | 重油车标成高效 | 监督信号本身错了 |
| 坏数据段 | 某日传感器全坏 | 局部切片系统性偏差 |
大到一定规模的数据集,几乎一定有异常值;关键是用规则、单测、监控把离谱值标出来,再决定删、改还是保留(第 16 篇的异常值决策树仍然适用)。
4. 不完整样本:删除还是填补
完整样本:每个要用的特征都有值。
不完整样本:至少一个必要特征缺失。
不要直接拿缺特征的行去训线性/逻辑回归——向量长度对不上,或被迫塞进无意义的默认值却不告诉模型。
4.1 什么时候删除
- 完整样本已经够训出有用模型
- 某一列缺失极多,且实验证明去掉该特征损失不大 → 可删列,而不是硬补
删除要小心:别把重要但稀有的真实样本当垃圾扔掉。吃不准时,可以做两套数据(只删 vs 填补)对比验证集表现。
4.2 什么时候填补
完整样本不够时,常用填补(Imputation):用有依据的估计值补上,而不是乱填。
数值列常见:均值、中位数;有时序时,也可用邻近时刻(但补完后训练集仍要打乱,避免按时间排序直接训练)。
填补值几乎总不如真值。更好的做法是加一列布尔标记,例如weight_is_imputed,让模型自己学「补出来的重量要不要少信一点」。标准化后均值常为 0,缺值补 0 在 z-score 空间里往往对应「补均值」。
5. 标签:直接标签与代理标签
监督信号来自标签(Label)。标签也必须最终能变成浮点数,才能进损失计算。
5.1 两种标签
| 类型 | 含义 | 汽车例子 |
|---|---|---|
| 直接标签 | 与预测目标完全一致 | 预测是否高效,列里就有efficient |
| 代理标签 | 与目标相近但不相同 | 没有efficient,用「是否上过节能榜」近似 |
能直接用直接标签,就别绕弯。代理标签永远是折中:模型上限取决于「代理」和「真目标」有多贴。
再举一个非车例子帮助直觉:想预测「是否有自行车」,若没有owns_bike,用recently_bought_bike往往是还不错但不完美的代理——买车的人多半有车,但也可能是送礼。
专栏里用 MPG 阈值造「高效」标签时,要想清楚:你要的是「官方节能认证」,还是「按 MPG 切一刀」?后者是可复现的工程定义,前者才是某些业务的直接标签。
5.2 人工标注 vs 自动标注
| 人工标注 | 自动标注 | |
|---|---|---|
| 优点 | 能做难任务;倒逼标准写清楚 | 便宜、可规模化 |
| 风险 | 贵、慢、人也会错;需多人交叉 | 上游模型错会系统性传染 |
实用建议:自己先标一小批(如 100~1000 条),和众包/同事结果对照。不一致时,先别默认自己一定对——尤其涉及主观判断时,优先把标注说明书写清楚再重标。
6. 划分中的隐藏坑
第 18 篇讲了三分法该怎么用;下面是分数「假好看」的常见原因。
6.1 跨集合重复
同一辆车(或同一条日志)既在训练集又在测试集,等于开卷考试。划分后应检查并去掉验证/测试里与训练重复的样本。
邮件反垃圾场景里,同一封垃圾信复制多份,最容易制造「训练测试双 99%」的幻觉。
6.2 验证集 / 测试集磨损
验证集可以反复用于调参,但用得越多,越像间接训练集,置信度下降。测试集若也拿来天天调,最后验收就失真。对策:阶段性换新验证/测试数据,或严格限制测试集动用次数。
6.3 分布不一致与非平稳
训练集全是夏季车况、测试全是冬季;或用十年前的用户口味预测三年后的爆款——都属于第 18 篇提过的同分布 / 平稳假设被破坏。此时测试损失低,只说明切到了相似切片,不代表上线能泛化。
6.4 变换泄漏
更隐蔽的一种:先对全表做StandardScaler.fit,再划分训练/测试。测试信息通过均值方差漏进了预处理。正确顺序是:
先划分 → 只在训练集 fit 变换 → 再 transform 验证/测试第 15、17 篇的 Pipeline 思路,正是为了堵住这类洞。
7. 划分前清单与汽车小例子
假设原始表如下(含故意埋的坑):
| id | weight | mpg | note |
|---|---|---|---|
| 1 | 3.50 | 18 | 正常 |
| 2 | 3.69 | 15 | 正常 |
| 3 | 3.50 | 18 | 与 id=1 重复 |
| 4 | NaN | 16 | 缺重量 |
| 5 | 34.3 | 16 | 疑似录入错误 |
| 6 | 2.37 | 24 | 正常 |
建议处理顺序:
- 去重(按业务键,如车架号;演示里可用
weight+mpg近似) - 异常值:34.3 核对后删除或改正
- 缺值:完整样本够则删行;不够则中位数填补 +
weight_is_imputed - 确认标签定义(回归用
mpg,分类用阈值后的efficient) - 打乱,再切训练/验证/测试
- 检查各集合是否仍有重复、重量分布是否离谱
8. 动手:去重、填补、防泄漏划分
importnumpyasnpimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.imputeimportSimpleImputerfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinefromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error df=pd.DataFrame({"weight":[3.50,3.69,3.50,np.nan,34.3,2.37,4.34,4.42,3.44,3.43],"mpg":[18,15,18,16,16,24,15,14,18,16],})# 1) 去重df=df.drop_duplicates()# 2) 粗滤明显录入错误(业务阈值示例)df=df[df["weight"].isna()|(df["weight"]<10)].copy()# 3) 划分:先切出测试,再切验证(标签与特征一起切)X=df[["weight"]]y=df["mpg"]X_tv,X_test,y_tv,y_test=train_test_split(X,y,test_size=0.2,random_state=0)X_train,X_val,y_train,y_val=train_test_split(X_tv,y_tv,test_size=0.25,random_state=0)# 4) 只在训练集 fit:中位数填补 + 标准化pipe=Pipeline([("imputer",SimpleImputer(strategy="median")),("scaler",StandardScaler()),("model",LinearRegression()),])pipe.fit(X_train,y_train)print("val MSE:",mean_squared_error(y_val,pipe.predict(X_val)))print("test MSE:",mean_squared_error(y_test,pipe.predict(X_test)))# 注意:没有在全表上先 fit scaler,避免变换泄漏样本很少时分数会抖,重点看流程:去重 → 清洗 → 再划分 → 训练集上 fit。
9. 能力边界与常见误区
9.1 适用边界
- 本篇面向表格型监督数据;图像/语音的「质量」还有分辨率、采样率等维度,原则相同:先可信,再划分。
- 类别严重不平衡时,「可信的标签」仍可能让准确率虚高——下一篇专门讲。
9.2 常见误区
| 误区 | 正解 |
|---|---|
| 有三分法就够了 | 先保证数据可信,再谈划分 |
| 缺值一律删光 | 可能删掉关键稀有样本;可对比填补方案 |
| 缺值乱填 0 且不告知模型 | 至少标记是否为填补值 |
| 代理标签当直接真相 | 始终评估代理与真目标的差距 |
| 验证集刷到完美再测一次测试集 | 测试集也会磨损;限制动用次数 |
| 全表标准化后再划分 | 典型泄漏,必须先划分再 fit |
10. 关键术语速查
| 术语 | 一句话解释 |
|---|---|
| 数据集 | 用于训练与评估的样本集合 |
| 样本 / 示例 | 表中的一行(一组特征 + 可选标签) |
| 数据质量 | 是否有助于达成建模目标 |
| 可信度 | 特征与标签可被信任的程度 |
| 填补 | 用合理估计补全缺失特征 |
| 直接标签 | 与预测目标完全一致的标签 |
| 代理标签 | 近似目标、但不完全相同的标签 |
| 变换泄漏 | 用到了验证/测试信息来 fit 预处理 |
11. 延伸阅读
| 资源 | 适合看什么 |
|---|---|
| pandas 去重 | drop_duplicates用法 |
| sklearn SimpleImputer | 均值/中位数等填补 |
| sklearn Pipeline | 防止预处理泄漏 |
| 专栏第 16 篇 | 异常值识别与处理 |
| 专栏第 18 篇 | 泛化与三分法 |
12. 小结
三分法之前,先问四件事:类型对不对、样本够不够、质量帮不帮目标、数值与标签信不信。不完整样本在「删」与「补」之间权衡,填补时最好带上标记列。标签能直接则直接,代理要清楚近似误差。划分时盯死重复、验证/测试磨损、分布错位和变换泄漏。
摸清家底 → 去重清洗 → 处理缺失与标签 → 打乱划分 → 仅训练集 fit 变换下一篇进入类别不平衡:正负样本差几个数量级时,为什么准确率会骗人,以及该怎么评估与处理。
系列导航:
- 上一篇:【机器学习】(18)—— 泛化与过拟合
- 下一篇(预告):类别不平衡数据集的评估与处理
如果本篇对你有帮助,欢迎点赞、收藏、关注博主,机器学习专栏持续更新中,下次更新不迷路。