【机器学习】(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第 1416 篇类别品牌、颜色、邮编第 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 自动标注人工标注自动标注优点能做难任务倒逼标准写清楚便宜、可规模化风险贵、慢、人也会错需多人交叉上游模型错会系统性传染实用建议自己先标一小批如 1001000 条和众包/同事结果对照。不一致时先别默认自己一定对——尤其涉及主观判断时优先把标注说明书写清楚再重标。6. 划分中的隐藏坑第 18 篇讲了三分法该怎么用下面是分数「假好看」的常见原因。6.1 跨集合重复同一辆车或同一条日志既在训练集又在测试集等于开卷考试。划分后应检查并去掉验证/测试里与训练重复的样本。邮件反垃圾场景里同一封垃圾信复制多份最容易制造「训练测试双 99%」的幻觉。6.2 验证集 / 测试集磨损验证集可以反复用于调参但用得越多越像间接训练集置信度下降。测试集若也拿来天天调最后验收就失真。对策阶段性换新验证/测试数据或严格限制测试集动用次数。6.3 分布不一致与非平稳训练集全是夏季车况、测试全是冬季或用十年前的用户口味预测三年后的爆款——都属于第 18 篇提过的同分布 / 平稳假设被破坏。此时测试损失低只说明切到了相似切片不代表上线能泛化。6.4 变换泄漏更隐蔽的一种先对全表做StandardScaler.fit再划分训练/测试。测试信息通过均值方差漏进了预处理。正确顺序是先划分 → 只在训练集 fit 变换 → 再 transform 验证/测试第 15、17 篇的 Pipeline 思路正是为了堵住这类洞。7. 划分前清单与汽车小例子假设原始表如下含故意埋的坑idweightmpgnote13.5018正常23.6915正常33.5018与 id1 重复4NaN16缺重量534.316疑似录入错误62.3724正常建议处理顺序去重按业务键如车架号演示里可用weightmpg近似异常值34.3 核对后删除或改正缺值完整样本够则删行不够则中位数填补 weight_is_imputed确认标签定义回归用mpg分类用阈值后的efficient打乱再切训练/验证/测试检查各集合是否仍有重复、重量分布是否离谱8. 动手去重、填补、防泄漏划分importnumpyasnpimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.imputeimportSimpleImputerfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinefromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error dfpd.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) 去重dfdf.drop_duplicates()# 2) 粗滤明显录入错误业务阈值示例dfdf[df[weight].isna()|(df[weight]10)].copy()# 3) 划分先切出测试再切验证标签与特征一起切Xdf[[weight]]ydf[mpg]X_tv,X_test,y_tv,y_testtrain_test_split(X,y,test_size0.2,random_state0)X_train,X_val,y_train,y_valtrain_test_split(X_tv,y_tv,test_size0.25,random_state0)# 4) 只在训练集 fit中位数填补 标准化pipePipeline([(imputer,SimpleImputer(strategymedian)),(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 且不告知模型至少标记是否为填补值代理标签当直接真相始终评估代理与真目标的差距验证集刷到完美再测一次测试集测试集也会磨损限制动用次数全表标准化后再划分典型泄漏必须先划分再 fit10. 关键术语速查术语一句话解释数据集用于训练与评估的样本集合样本 / 示例表中的一行一组特征 可选标签数据质量是否有助于达成建模目标可信度特征与标签可被信任的程度填补用合理估计补全缺失特征直接标签与预测目标完全一致的标签代理标签近似目标、但不完全相同的标签变换泄漏用到了验证/测试信息来 fit 预处理11. 延伸阅读资源适合看什么pandas 去重drop_duplicates用法sklearn SimpleImputer均值/中位数等填补sklearn Pipeline防止预处理泄漏专栏第 16 篇异常值识别与处理专栏第 18 篇泛化与三分法12. 小结三分法之前先问四件事类型对不对、样本够不够、质量帮不帮目标、数值与标签信不信。不完整样本在「删」与「补」之间权衡填补时最好带上标记列。标签能直接则直接代理要清楚近似误差。划分时盯死重复、验证/测试磨损、分布错位和变换泄漏。摸清家底 → 去重清洗 → 处理缺失与标签 → 打乱划分 → 仅训练集 fit 变换下一篇进入类别不平衡正负样本差几个数量级时为什么准确率会骗人以及该怎么评估与处理。系列导航上一篇【机器学习】18—— 泛化与过拟合下一篇预告类别不平衡数据集的评估与处理如果本篇对你有帮助欢迎点赞、收藏、关注博主机器学习专栏持续更新中下次更新不迷路。