十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据清洗实战:从脏乱差到规整有序,AI基础设施的关键一步

数据清洗实战:从脏乱差到规整有序,AI基础设施的关键一步 各位做AI、做数据、做系统的同行咱们开门见山聊个事。你兴冲冲地拉了几百G数据准备给模型训练、做报表分析、搞数据挖掘结果程序一跑全是报错看数据全是乱码和空值特征分布歪七扭八。这时候你就明白AI基础设施里最不起眼、但决定成败的环节恰恰是“数据”这一层里最脏最累的活——数据清洗。数据清洗不是制造业里给零件擦灰那么简单。在整套AI基础设施与生态层里它承担的是把原始资料从“不可用”变成“可用”、从“脏乱差”变成“规整有序”的关键角色。你后面所有训练、调参、评估、上线全部建立在这份数据够不够干净的基础上。模型效果不好七成问题出在数据上而数据问题里最让人头疼的往往不是获取而是清洗。今天我不讲那些浮在天上的大道理就用实际项目里的经验和踩过的坑把数据清洗这个关键环节整个拆开揉碎从为什么做、到怎么做、再到踩坑实录一条龙说清楚。1. 为什么说数据清洗是AI基础设施的命门1.1 数据质量问题的全貌与根因先说个最扎心的事实真实世界里拿到的数据几乎没有一个能直接用来跑算法。我接手过大量乱七八糟的原始数据既有工业传感器采集的时序数据也有从第三方平台同步过来的业务数据还有从网上扒下来的图像文本数据。每一次都没让我“失望”——要么缺字段要么值错乱要么格式五花八门要么直接给你来一批彻底没法用的坏数据。把这些问题归归类其实翻来覆去就是下面这几种缺失类问题字段为空、整行为NA、时间戳缺秒、图片文件打不开。重复类问题主键重复、设备多次上报同一条记录、爬虫抓了多份相同页面。异常与噪声问题数值突跳比如室温一下蹦到500度、传感器断线返回-9999、网络抓包丢帧导致字节数不完整。格式与口径不一致问题同一份报表里“性别”一列既有“男/女”又有“M/F”还有“1/0”日期有的是2024/01/01有的是2024-01-01还有的是2024年1月1日。逻辑冲突问题年龄字段填了200订单金额填了负数身份证号位数不对经纬度跑到海里去了。这五类问题不是单独出现的它们通常结伴而来。很多做数据的新手容易犯一个错误就是拿一份数据就开始写清洗代码写到哪算哪。这样干最大的问题在于你根本没有搞清楚“好的数据”长什么样就被眼前千疮百孔的原始数据牵着鼻子走。磨刀不误砍柴工第一步永远应该是从源头上建立对数据质量问题的完整认知。1.2 数据不一致是最隐蔽的敌人数据清洗里最容易被忽略又最致命的问题是数据不一致。数据不一致的原因非常多常见的有系统迁移时字段映射出错多部门重复录入没有统一编码规则上游接口改版之后新旧字段混用以及不同批次数据合并时埋下了口径差异。这些问题在初期数据量小的时候根本看不出毛病一旦数据量上来、多个数据源开始融合不一致就像埋在地基里的裂缝整个数据体系说塌就塌。举个例子某业务系统通过datax做数据同步用户注册时间字段一部分存的是字符串“2024-07-01 10:30:00”另一部分存的是时间戳“1719801000”还有一部分存的是“2024/07/01”这种格式。做报表的时候直接取这个字段统计注册趋势出来的曲线完全没法看因为三种格式混在一起排序错乱、分组统计对不上、时间差计算算出一堆负数。类似的问题还有编码统一问题比如“北京市”、“北京”、“市辖区”、“110000”在同一个字段里来回切换你让模型怎么学所以我一直强调数据清洗不是拿到数据之后才开始的工作它应该提前到数据接入方案设计阶段。你定义清楚每种数据的类型、格式、取值域、主键规则、更新频率后面清洗能省掉一半以上的工作量。当然如果你的系统已经跑起来了存量数据已经脏了那就只能在清洗阶段下硬功夫。后面第3章我会专门讲怎么用pandas这类工具组合拳式地把这些坑一个个填平。2. 数据清洗的核心套路与实操要点2.1 用pandas做数据体检先摸清家底再动手清洗数据不能上来就咔咔改先给数据做个体检。我常用的工具是Python的pandas配合NumPy和matplotlib基本能覆盖90%以上的清洗任务。当然网上关于pandas做数据清洗和处理的教程一抓一大把但很多都是照本宣科地讲几个API落实到真实场景里就傻眼了。我讲讲我实际的工作路径。第一步是读入数据之后马上做一次全息侦察。最基础的动作是三个import pandas as pd df pd.read_csv(raw_data.csv, encodingutf-8) # 看一眼长什么样 df.head(10) # 看每列非空数量、数据类型、内存占用 df.info() # 看数值型字段的分布 df.describe()这三个动作看起来简单却能快速暴露一堆问题。比如df.info()会直接告诉你这个CSV解析后有多少行、多少列、每列有多少非空值、列类型是int还是object。如果你发现某列业务上明明应该是数字结果类型是object那基本可以断定这一列里混进了非数字内容最常见的是“-”或“null”字符串被当成有效值读进来了。接着我用df.isnull().sum()统计缺失值用df.duplicated().sum()统计重复行再画几个箱线图看是否有极端离群点。这些加在一起就是一份“数据体检报告”。有了报告才知道哪些列清洗成本高、哪些列可以直接丢弃、哪些字段需要找业务方确认口径。这里必须提一个重要观念数据清洗不是纯技术动作它是技术加业务的复合动作。什么时候用0填充缺失什么时候用均值什么时候直接删行没有标准答案取决于你拿这份数据去干什么。比如做用户画像性别缺失可以用众数填做欺诈识别收入缺失直接填0反而可能是一种有效特征。规则必须提前定清楚否则后面模型上线了你都不知道自己在用什么数据训练出来的。2.2 缺失值处理不是无脑填0缺失值大概是数据清洗里出场率最高的问题。但处理缺失值绝对不只是“填0”或“删行”二选一你需要分辨缺失的成因和分布。我先说删除策略。当某个字段的缺失比例超过60%且这个字段对目标不是核心特征我建议直接整体丢弃这一列。如果一行记录里超过一半字段都缺失并且行数占比不大那也可以直接删行。这里有个经验值单列缺失率低于5%删除整行通常影响不大缺失率在5%-30%之间优先考虑填充或者单独做成一个“是否缺失”特征缺失率超过30%必须停下来思考这个字段还有没有保留的必要。填充策略上数值型字段我常用下面这几种固定值填充适合业务上明确表示“无”就是0的场景。比如订单金额缺失就填0因为没买就是没发生交易。均值/中位数填充适合分布比较集中、离群点少的数值字段。均值缺点是受极值影响大所以有极端值存在时我优先用中位数。众数填充适合分类字段比如性别、城市、学历这些用出现次数最多的值填。前向/后向填充适合时间序列数据。传感器断点、行情数据停更用前一时刻的值填充往往比填均值更合理。回归/插值模型预测填充这一种用的少因为成本高。但对关键字段比如要作为模型核心特征的值值得用随机森林或KNN去预测缺失值效果比盲目填均值要好一截。再说一个案例。我在做工业传感器数据清洗时遇到过一种典型情况设备每10秒上报一次温度但因为网络闪断中间某段数据完全缺失。如果直接删掉这段数据后续做时序特征就会出现断层如果填0那肯定不行因为0度对工业温度检测来说就是一个异常值。我当时用轮询间隔内线性和样条插值的方式补上了断点插值结果跟实际回落曲线非常接近。这就是典型的前向、后向和插值填充的组合应用。2.3 重复值处理小心被“假重复”坑很多人以为去重就是df.drop_duplicates()一行代码的事其实没那么简单。真实项目里的重复通常分两种情况完全重复和部分重复。完全重复就是指两行或者多行每个字段都一样这种几乎没有争议直接删掉只留一行。部分重复就麻烦了比如设备ID和业务时间都相同但是采集得到的数值字段不一样。这时候你要判断到底以哪一条为准。我做过多路传感器数据融合同一个测点在同一个周期内上报了多次数据数值有细微偏差。这时候就要定一个策略如果业务上要求实时值那取最新上报的如果要求稳定性那取平均值或中间值如果是计费计量的场景那必须走审批流程人工确认绝不敢自作主张。还有更隐蔽的就是所谓的“语义重复”。比如两个用户分别在两个渠道注册其实背后是同一个人因为手机号相同但姓名写法不同“张三”和“张 三”。这种清洗已经不是单纯pandas能搞定的了往往需要引入相似度计算、规则引擎甚至图算法做实体对齐一般小项目里不太会做完整闭环但至少你要能识别出这种风险不要简单粗暴地按某一列去重。我去重时还有一个习惯先把重复行单独导出一份留底再删。这背后是一个很重要的原则——所有清洗操作都要留着痕迹。因为在AI基础设施里数据是可以反复迭代的今天定的清洗规则明天业务一变可能就要推翻重来。原始数据是不能再造的但清洗后的数据随时可能被要求重洗一版所以不在清洗前备份后面有你哭的。2.4 异常值识别箱线图或3σ原则怎么选异常值处理比缺失值处理更耗脑细胞因为“正常范围”本身是需要定义的。我做项目的通用流程是先全字段跑一遍统计指标然后按字段语义分类有明确业务上下限的直接用边界截断。比如人的年龄必须在0-120之间订单金额必须大于0心率必须在30-250之间。没有明确业务边界、但分布符合正态或近似正态的用3σ原则均值加3倍标准差识别离群点。不了解分布形态的用箱线图的四分位距IQR方法。一般认为小于Q1-1.5IQR或大于Q31.5IQR的点是离群点。分布极度偏斜的比如销售额、访问量大量小值加少量超大值建议先做log变换再做异常判断否则正常业务的大值也会被误杀。我特别想提醒一点异常值不等于错误值它可能代表着真实的业务波动。比如电商大促日的订单量是平常的几十倍这时候如果按3σ原则孤立点处理把大促数据全删了那整个营收分析就废了。所以在清洗环节对待异常值的最佳实践不是“删除”而是“标记”。我通常会在原表后面加一列is_outlier把识别出的异常点标为1正常标为0。这样下游建模时可以选择是否剔除也可以把“是否异常”本身做成特征送进模型里。这就避免了清洗过度导致的信息丢失。清洗过度的风险其实比清洗不足更隐蔽因为前者让你没有错误提示直接得到一批“看起来干净但实际失真”的数据后患无穷。3. 典型场景下的数据清洗实战3.1 工业传感器与单片机采集数据清洗搜关键词的时候我注意到很多人查“modbus单片机帧接收数据程序”、“工业传感器数据清洗”、“wireshark 为何只能显示520字节数据”这些问题。这说明工业与嵌入式场景的数据清洗跟普通表格数据清洗有很大区别这里单独拎出来讲。工业现场最常见的数据格式之一就是Modbus协议。Modbus RTU有固定的帧结构地址码、功能码、数据段、CRC校验。单片机接收数据的时候经常遇到的坑是半包和粘包。所谓半包就是一次请求的数据帧由于线路干扰或缓冲区太小被分成了两段才能收全粘包则是多个数据帧连续到达一次性全堆在缓冲区里程序如果按单帧去读就会解析错乱。这种场景下的“清洗”本质上是解包前的数据整形。我在实际项目里一般会先做帧头帧尾定位再按长度字段拆包最后用CRC做完整性校验。只有CRC校验通过的帧才算是“干净数据”丢进解析逻辑CRC不对的直接算坏帧统计起来方便后面做链路质量分析。## 4.1 数据清洗工程化与常见问题排查 ### 4.1.1 如何建立数据清洗规则引擎 ### 4.1.2 数据备份与防丢失的实操流程 ### 4.1.3 清洗后的数据结构化与质量验证 ## 5. 结语与经验总结 ### 5.1 我的核心经验与教训 ### 5.2 数据清洗的下一步演进方向以下是第六部分不完全内容我需要继续修正并重写后续章节。抱歉我给出的内容是错误和未完成的。请根据我下一次给出的完整回复进行工作。
返回列表