当你还在为选择XGBoost还是神经网络而纠结时,真实项目里八成时间或许都耗费在一件更为基础的事情上了:处理那些“脏”数据。设备出现故障,人工存在误录,系统间口径存在差异,这些现实当中的问题致使原始数据几乎不能够被任何模型直接使用。数据清洗并非是简简单单的修修补补,它是决定分析项目存亡的关键的第一步。
原始数据采集进程里,鉴于传感器发生故障、人工存在漏填情况或者接口传输遭遇中断,肯定是会出现空缺记录状况的。对于完全随机缺失(MCAR)而言,它是意味着缺失是与任何观测变量都没有关联的意思,就像问卷里面某一道题目被随机地跳过这种情况;而随机缺失(MAR)讲的是缺失能够被其他已经观测到的变量去解释,举例来说就是高收入群体更加倾向于不填写收入项目;非随机缺失(MNAR)却是和缺失值自身相关的情形,就好似设备在温度过高的时候会停止记录。判断选择处理方法的依据在于识别缺失类型,直接删除,均值填充,多重插补,它们各自存在适用场景,需要结合业务逻辑来进行判断。
对于处理缺失值而言,不存在能适用于所有情况的公式。当缺失比例处于低于5%,并且归属为完全随机这种状况时,将缺失样本予以删除,所产生的影响相对较小;针对数值型特征来讲,采用中位数进行填充,相较于均值,更具备抵抗异常值干扰的能力;分类变量可以运用众数来填充,或者单独设立“未知”这一类别;在时间序列场景之中,通过线性插值或者前后向填充,能够维持趋势的连续性;诸如随机森林或者KNN预测填充这类更为复杂的方法,可以借助特征之间的关联性来实现补全,不过需要谨慎小心,避免引入虚假信息;关键之处在于记录填充逻辑,以此保证数据处理链条具备可追溯性。
高频陷阱于多源整合里是数据重复,同一笔交易因系统重试机制、人工重复导入或者多平台同步可能出现多次,致使统计指标虚高、模型训练样本分布失真,比如在用户画像场景中,重复记录会使同一用户被赋予多条行为序列,严重扭曲群体特征,去重的前提是明确业务主键,也就是能唯一标识一条记录的字段组合,可能是订单号、设备ID加时间戳的组合,并非单纯依赖自增ID。
去重是基于主键来展开的,完成此操作后,还是要处理“近似重复”这一状况。像“阿里巴巴集团”和“阿里集团”实际上是同一个实体,然而在字符串方面两者并不匹配。这个时候,要结合编辑距离、余弦相似度等文本相似度的算法去做模糊匹配,并且还要借助人工核验或者业务规则合并来辅助。在CRM系统里,这样的清洗能够有效地整合客户资产,防止把同一个客户重复计数。去重地操作结束之后,适宜对关键字段建立唯一性约束,以此从数据生产源头去预防问题再次出现。
被称为异常值的数据点,是明显偏离整体分布的,其来源可能是录入错误,像年龄被录入成200岁这种情况,也可能源于设备故障,比如传感器瞬间出现跳变,还可能是真实的极端业务场景所致,例如双十一时的瞬时流量。要是不进行处理,它们会使均值被拉偏,方差增大,对于线性回归、聚类等模型会产生致命的影响。识别异常值能够借助箱线图的四分位距法,把超出上下限,也就是Q1 - 1.5IQR与Q3 + 1.5IQR的点标记为异常;还能够基于3σ原则,在假设数据呈正态分布的时候,将偏离均值3倍标准差之外的值视作异常。
处理异常值得明确区分别不同业务景象当中各不相同的背景条件,对于确实属于录入环节出现错误的情况呢,能够直接把它给删除亦或者是使用边界值取代。这里说的取代也就是缩尾处理,也就是Winsorization,对于那些能够反映出真实存在且极端的业务的异常值而言,把它保留下来并且当作是单独的一类来展开分析往往是更具备价值意义的,在和风险控制相关的场景当中,少数的异常交易行为恰恰就是欺诈识别的关键信号所在之处,如果异常值所占的比例比较高,也就是超过了10%,那么就不应该简简单单地把它删除掉。而应该把它看作是一个特殊类别的群体去构建不同的群组进行建模分析,或者是采用针对异常值能够体现出稳健特性的损失函数,比如说Huber损失。
因来源各异,原始数据常致使格式紊乱,日期字段最常见多写法混杂,像“2023 - 03 - 22”“20230322”“22/Mar/2023”等,数值型字段以文本形式存储致使无法求和,字符编码不一致引发乱码。数据类型转换目标是使每一列数据类型与业务含义严格对齐。比如金额字段应转为浮点型或定点数,时间字段转为标准日期时间类型,便于后续开展时间序列分析与时间窗口聚合。
进行类型转换之时,需要去建立相当清晰的映射规则,能够运用正则表达式识别进去并且解析多种日期格式,借助强制类型转换函数处理数值型文本,还要统一字符编码成为UTF - 8。有一种实用的做法是在数据加载阶段就定义好schema,对于不符合预期的字段进行告警或者拒绝入库。对于枚举类字段,应该提前建立值域映射表,将“男/M/male”等不一样的表述统一成为标准化标签,以此确保后续分组统计以及特征编码的准确性。
具有不同特征的数值范围,以及量纲差异极大,比如说,像那个年龄,其范围是从0到100,而年收入,范围是从0到10的6次方,要是直接就此拼接起来作为模型输入的话,那么就会致使基于距离的算法,像是KNN、SVM这类算法,完全被量纲大的特征所主导。归一化,也就是Min - Max Scaling,能把数据线性压缩到闭区间[0,1],此方式适合神经网络等对输入范围敏感的模型,并且不会改变数据分布的形状。标准化,也就是Z - score Standardization,会把数据转变为均值是0、标准差为1的分布,它适用于线性回归等假设数据服从正态分布的算法,还适用于主成分分析等这类算法。
要留意的是,归一化以及标准化均仅仅是线性变换,没办法消除异常值所带来的影响。要是数据当中设有极端离群点,直接进行缩放会致使大部分数据被挤压在极为狭窄的区间之内,从而失去区分度。正确的次序是:首先识别进而处理异常值,接着针对干净数据开展缩放。在金融评分卡或者医疗诊断等具备强解释性的场景当中,缩放之后的系数解释性会有所减弱,需要结合业务场景去权衡是不是使用。另外,对于树模型(像是随机森林、XGBoost),鉴于算法自身对量纲不敏感,一般不需要进行特征缩放。
诸多机器学习的模型没办法直接去处理分类变量,得把它转变成为数值的形式。标签编码适应于有序分类变量,比如学历包含小学、中学、大学这些情况,然而要是用于无序变量,像颜色有红、黄、蓝这样的,就会错误地引入大小关系。独热编码是处理无序分类变量常用的办法,但是一旦类别数量比较多,就会产生高维稀疏矩阵,进而增加计算开销。频率编码用类别出现的次数去替代原来的标签,既简单又不引入目标变量的信息,不过可能会损失类别之间的独立性。选择编码方式需综合考虑变量类型、类别基数及后续模型特性。
文本字段所进行的清洗,相较于结构化数据而言,更具复杂性,并且是高度定制化的。其基础步骤涵盖,使其大小写达成统一,将 HTML 标签以及特殊符号予以去除,对数字与标点展开处理,实施分词以及词形还原。停用词过滤这一操作,需要依据任务来加以决定,就像在情感分析里,停用词(诸如“的”“了”)一般是予以保留的,然而在主题建模当中,则常常会被去除。对于业务实体而言,需要判断是不是要保留日期、人名、地址等方面的信息。文本清洗不存在固定的流水线,每一步的操作都要回归到业务目标,比如说在用户评论分析里,保留表情符号对情绪识别或许有着重要价值,然而在关键词提取过程中就得将其剔除。
数据清洗的实质是个持续迭代、深入理解的进程,每一回清洗都兴许发觉新的数据质量问题,从而反向推导检查数据采集以及存储环节的漏洞,当你将数据清洗流程沉淀成可复用的规则库,并且构建起从源头直至应用的自动化校验机制时,后续的分析与建模工作才能够获取真正可靠的数据基础。
在你实际展开工作期间,哪一种数据质量方面的问题最令你感到头疼,而又是借助什么办法最后终究得以解决的呢,欢迎于评论区域分享你的实战经历与经验。
